我在代码中有这三个linse
int i = 5;
object a = i;
i += 1;
我认为a的值也是6,但它是5。
实际发生的事情请清除它
答案 0 :(得分:2)
当你这样做时
object a = i;
整数i
是“已装箱”(另请参阅Boxing and Unboxing (C# reference guide)),并且i
的COPY已放入框中。因此,更改原始i
对a
没有任何影响,这就是您在检查时看到它不变的原因。
答案 1 :(得分:2)
值类型是副本。
基于值类型的变量直接包含值。 将一个值类型变量分配给另一个值复制包含的值 值即可。这与引用类型变量的赋值不同, 它复制对象的引用,但不复制对象本身。
答案 2 :(得分:0)
赋值运算符的工作原理取决于您是否正在复制值或引用类型。基本类型和结构(如int)是值类型,而对象是引用类型。
当你这样做时:
int i = 5;
object a = i;
i += 1;
将值5复制到堆栈并将其标记为i。然后,在堆上创建对象a,并将对它的引用放在堆栈上,并将i的值复制到对象a。然后,i增加1 - 堆上的对象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作为数字的值,因为a现在是对i的引用。如果您不确定对象是否是对另一个对象的引用,则可以始终使用ReferenceEquals()方法。