类内部结构

时间:2011-02-05 06:52:40

标签: c# .net oop

有人可以解释一下,在值类型中定义引用类型时会发生什么。 我写了以下代码:

namespace ClassInsideStruct
{
    class ClassInsideStruct
    {
        static void Main(string[] args)
        {

            ValueType ObjVal = new ValueType(10);
            ObjVal.Display();

            ValueType.ReferenceType ObjValRef = new ValueType.ReferenceType(10);
            ObjValRef.Display();

            Test(ObjVal, ObjValRef);

            ObjVal.Display();
            ObjValRef.Display();

            Console.ReadKey();

        }

        private static void Test(ValueType v, ValueType.ReferenceType r)
        {
            v.SValue = 50;
            r.RValue = 50;
        }

    }

    struct ValueType
    {

        int StructNum;
        ReferenceType ObjRef;

        public ValueType(int i)
        {
            StructNum = i;
            ObjRef = new ReferenceType(i);
        }

        public int SValue
        {
            get { return StructNum; }
            set
            {
                StructNum = value;
                ObjRef.RValue = value;
            }
        }

        public void Display()
        {
            Console.WriteLine("ValueType: " + StructNum);
            Console.Write("ReferenceType Inside ValueType Instance: ");
            ObjRef.Display();
        }

        public class ReferenceType
        {

            int ClassNum;

            public ReferenceType(int i)
            {
                ClassNum = i;
            }

            public void Display()
            {
                Console.WriteLine("Reference Type: " + ClassNum);
            }

            public int RValue
            {
                get { return ClassNum; }
                set { ClassNum = value; }
            }

        }

    }

}

哪个输出:

ValueType: 10
ReferenceType Inside ValueType Instance: Reference Type: 10
Reference Type: 10
ValueType: 10
ReferenceType Inside ValueType Instance: Reference Type: 50
Reference Type: 50

我很想知道,在调用方法Test(ObjVal, ObjValRef)之后,ReferenceType的值如何更改为50,它位于ValueType内,其值未更改?

5 个答案:

答案 0 :(得分:2)

我不确定,但编译器可能会将代码分成单独的类,然后只执行所需的规则。使用值类型时,每次将值传递给方法时都会复制该值。将复制对引用类型的引用,但它引用同一对象。当复制的值类型将被更改时,将更改此相同的参考对象。您传入的原件不会反映副本上的更改。

答案 1 :(得分:2)

因为引用类型是引用类型,值类型是值类型。无论他们住在哪里。

并且值类型也没有改变,它也没有改变它所持有的Reference。 更改的参考类型(仔细阅读我的文字)。

即该地址的基础数据发生了变化。值类型保持的引用仍然相同。

答案 2 :(得分:1)

值内部值类型是引用,它不会更改。但是参考指出的价值可以很容易地改变。

答案 3 :(得分:1)

引用类型作为指针传递给方法,因此修改内容将修改内存中的相同位置。通过在调用堆栈上发送值将值类型传递给方法。

答案 4 :(得分:-1)

编程时,重要的是要理解调用带参数的方法暗示/ includes /与为这些参数赋值相同。加:

static void Main(string[] args)
{

    ValueType ObjVal = new ValueType(10);
    ObjVal.Display();

    ValueType.ReferenceType ObjValRef = new ValueType.ReferenceType(10);
    ObjValRef.Display();

    //call to Test(ObjVal, ObjValRef); replaced by the following 4 lines
    ValueType v = ObjVal;
    ReferenceType r = ObjValRef;
    v.SValue = 50;
    r.RValue = 50;

    ObjVal.Display();
    ObjValRef.Display();

    Console.ReadKey();

}

应该与上面的例子给出相同的结果。当您声明 ValueType v = ObjVal; 时,您正在复制实际的struct对象,这意味着v是一个单独的对象。所以改变它成员的价值不会影响ObjVal。

然而, ReferenceType r = ObjValRef; 制作参考的副本。所以现在有两个引用, ObjValRef r ,指向同一个对象。即调用 new ValueType.ReferenceType(10);

时创建的对象

因此,当通过这两个引用中的任何一个更改对象指向的成员时,无论使用哪个指针执行更改,此对象都会更改。

哦,by by ..引用只是一个对象的地址。通常这是一个32位数字,但这会从语言变为语言,从处理器变为处理器。

并自行更改参考副本,例如 r = null; 不会影响“原始”引用ObjValRef,因为r是ObjValRef的副本,而不是ObjValRef本身。它看起来好像是一样的,因为它们都指向同一个对象。

您可以将实际物体视为一个地方(一个公园或一些着名建筑,也许是“白色山地公园”)以及指向这个地方的街道标志。可以有许多路牌指向同一个地方,但这并不意味着有很多“白山公园”。这是值类型和引用类型之间的区别。