拳法不明显

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; 之后,obj1obj2 都持有对同一个 Int32 对象的引用,该对象又持有值 1。 like obj2 = 2; 创建一个新的 Int32 对象,它保存值 2 并将对它的引用存储到 obj2 中。 obj1 用于保存对不同对象的引用这一事实是无关紧要的。请注意,Visual Basic 6(在 .NET 时代之前)有一些古怪的语义,其中 thing1 = thing2 可能会尝试修改 thing1 持有引用的对象,并且代码希望将新引用存储到 thing1 需要使用 Set thing1 = thing2 但在 C# 中,对 Object 的赋值将覆盖其中包含的任何引用,而不考虑它之前可能包含的内容。