装箱后,无法通过将对象作为函数参数传递来更改对象值

After boxing, cannot change the object value by passing the object as an argument of a function

我将一个整数装箱为一个对象 (System.Object)。然后,如果我为同一范围内的对象分配一个新值,该对象的值就会更新。但是,如果我尝试将对象作为另一个函数的参数传递并尝试为其分配新值,则该值不会更新。我想知道对象是否是 System.Object class 的实例并且它是引用类型,那么为什么当我将它作为另一个函数的参数传递?

using UnityEngine;

public class BoxTest : MonoBehaviour
{
    void Start()
    {
        int i = 10;
        object obj = i;
        // Output : 10
        Debug.Log(obj);

        obj = 20;
        // Output : 20
        Debug.Log(obj);

        changeValueInBoxedObject(obj);

        // Output : 20, expecting 30
        Debug.Log(obj);
    }

    void changeValueInBoxedObject(object obj)
    {
        obj = 30;
    }
}

当您将参数传递给函数时,它会创建一个指向传入值的新“指针”。当您设置 obj = 30; 时,您就是 re-setting 这个新指针指向的地址30.

的新盒装版本

一直以来,第一个“指针”(object obj = i;) 从未被修改,仍然指向它的初始值。

您可以 link 您的所有“指针”以及 ref 关键字: void changeValueInBoxedObject(ref object obj) 应该可以解决问题

注意:我使用“指针”这个词来表示在堆或堆栈上有地址的东西。它不是像 IntPtr

这样的指针