我在代码中有这三个 linse
int i = 5;
object a = i;
i += 1;
我在想 a 的值也将是 6,但它是 5。
实际发生了什么请清除它
当你这样做
object a = i;
整数i
被“装箱”(另请参见装箱和拆箱(C# 参考指南)),并将 COPYi
放入框中。因此,更改原始i
文件不会对 产生影响a
,这就是为什么您在检查时看到它没有变化的原因。
赋值运算符的工作原理取决于您是在复制值还是引用类型。基本类型和结构,如 int,是值类型,而对象是引用类型。
当你这样做时:
int i = 5;
object a = i;
i += 1;
您将 5 的值复制到堆栈并将其标记为 i。然后,在堆上创建对象a,并将对它的引用放在堆栈上,并将i的值复制到对象a中。然后, i 加一 - 堆上对象 a 的内容没有改变。
这是一个不同的示例,可能会使差异更加清晰:
class test{
static void Main(string[] args)
{
Value i = new Value(5);
Value a = i;
i.number += 1;
Console.WriteLine(i.number);
Console.WriteLine(a.number);
}
}
public class Value
{
public Value(int x){number = x;}
public int number { set; get; }
}
本例中的两个对象都将打印 6 作为 number 的值,因为 a 现在是对 i 的引用。如果您不确定一个对象是否是对另一个对象的引用,您始终可以使用 ReferenceEquals() 方法。