我对装箱了解到的是将值类型转换为引用类型,反之亦然。当我这样做时,这不是我所期望的:
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更改?
答案 0 :(得分:3)
系统执行obj2 = obj1;
后,obj1
和obj2
都保留对同一Int32
对象的引用,而该对象又保留值1
。类似的obj2 = 2;
创建一个新的Int32
对象,该对象保存值2
并将对它的引用存储到obj2
中。 obj1
用来保存对另一个对象的引用这一事实是无关紧要的。请注意,Visual Basic 6(在.NET出现之前)具有一些古怪的语义,其中thing1 = thing2
可能会尝试修改thing1
持有引用的对象,并且代码希望将新的引用存储到{ {1}}将需要使用thing1
,但是在C#中,对Set thing1 = thing2
的赋值将覆盖其中包含的任何引用,而不考虑其以前可能包含的内容。