拳击不明显

时间:2018-06-28 18:31:51

标签: c# boxing

我对装箱了解到的是将值类型转换为引用类型,反之亦然。当我这样做时,这不是我所期望的:

using System;

// ...
    static void Main(string[] args)
    {
        object obj1 = 1;
        object obj2 = obj1;

        obj2 = 2;
        Console.WriteLine(obj1);

        Console.Write("Press any key to quit . . . ");
        Console.ReadKey(true);
    }

我得到答案1.为什么obj1的值不能通过obj2更改?

1 个答案:

答案 0 :(得分:3)

系统执行obj2 = obj1;后,obj1obj2都保留对同一Int32对象的引用,而该对象又保留值1。类似的obj2 = 2;创建一个新的Int32对象,该对象保存值2并将对它的引用存储到obj2中。 obj1用来保存对另一个对象的引用这一事实是无关紧要的。请注意,Visual Basic 6(在.NET出现之前)具有一些古怪的语义,其中thing1 = thing2可能会尝试修改thing1持有引用的对象,并且代码希望将新的引用存储到{ {1}}将需要使用thing1,但是在C#中,对Set thing1 = thing2的赋值将覆盖其中包含的任何引用,而不考虑其以前可能包含的内容。