内部实际发生了什么

时间:2013-03-01 12:13:07

标签: c#

我在代码中有这三个linse

int i = 5;
object a = i;
i += 1;

我认为a的值也是6,但它是5。

实际发生的事情请清除它

3 个答案:

答案 0 :(得分:2)

当你这样做时

object a = i;

整数i是“已装箱”(另请参阅Boxing and Unboxing (C# reference guide)),并且i的COPY已放入框中。因此,更改原始ia没有任何影响,这就是您在检查时看到它不变的原因。

答案 1 :(得分:2)

值类型是副本。

  

基于值类型的变量直接包含值。   将一个值类型变量分配给另一个值复制包含的值   值即可。这与引用类型变量的赋值不同,   它复制对象的引用,但不复制对象本身。

Value Types (C# Reference)

答案 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()方法。