-3

我在代码中有这三个 linse

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

我在想 a 的值也将是 6,但它是 5。

实际发生了什么请清除它

4

3 回答 3

2

值类型是副本。

基于值类型的变量直接包含值。 将一个值类型变量分配给另一个会复制包含的值。这与引用类型变量的赋值不同,后者复制对对象的引用而不是对象本身。

值类型(C# 参考)

于 2013-03-01T12:18:18.473 回答
2

当你这样做

object a = i;

整数i被“装箱”(另请参见装箱和拆箱(C# 参考指南)),并将 COPYi放入框中。因此,更改原始i文件不会对 产生影响a,这就是为什么您在检查时看到它没有变化的原因。

于 2013-03-01T12:17:37.610 回答
0

赋值运算符的工作原理取决于您是在复制还是引用类型。基本类型和结构,如 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() 方法。

于 2013-03-01T12:48:09.610 回答