装箱后,无法通过将对象作为函数参数传递来更改对象值
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
这样的指针
我将一个整数装箱为一个对象 (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
这样的指针