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