C#不可变int

C#不可变int,c#,int,immutability,C#,Int,Immutability,在Java中,字符串是不可变的。如果我们有一个字符串并对其进行了更改,则会得到同一变量引用的新字符串: String str = "abc"; str += "def"; // now str refers to another piece in the heap containing "abcdef" // while "abc" is still somewhere in the heap until taken by GC int和double在C#中是不可变

在Java中,字符串是不可变的。如果我们有一个字符串并对其进行了更改,则会得到同一变量引用的新字符串:

String str = "abc";
str += "def"; // now str refers to another piece in the heap containing "abcdef"
              // while "abc" is still somewhere in the heap until taken by GC
int和double在C#中是不可变的。这是否意味着,当我们有int并且以后更改它时,我们会得到相同变量“指向”的新int?同样的事情,但与堆栈

int i = 1;
i += 1; // same thing: in the stack there is value 2 to which variable
        // i is attached, and somewhere in the stack there is value 1
对吗?如果不是,int以什么方式是不可变的?

您没有改变(也不能改变)int的某些内容;您已经指定了一个新的int值(并放弃了旧值)。因此,它是不变的

考虑一个更复杂的结构:

var x = new FooStruct(123);
x.Value = 456; // mutate
x.SomeMethodThatChangedInternalState(); // mutate

x = new FooStruct(456); // **not** a mutate; this is a *reassignment*
然而,这里没有“指向”。结构直接在堆栈上(在本例中):不涉及引用。

继续Marc(完全可以接受)的回答:整数值是不可变的,但整变量可能会变化这就是它们被称为“变量”的原因。


整数值是不可变的:如果你有一个数字12,就没有办法使它变奇数,也没有办法把它涂成蓝色,等等。如果你试图通过,比如说,加上一,使它变为奇数,那么你得到的是一个不同的值,13。也许您将该值存储在用于包含12的变量中,但这不会更改12的任何属性。12与以前完全一样。

虽然这听起来很明显,但我会添加几行文字,以帮助我理解,以防有人有同样的困惑

但一般来说,当人们说“不可变”时,他们的意思是类具有不能更改的成员

字符串可能是在数组中存储字符,数组不可访问且不能通过方法更改,这就是为什么字符串是不可变的。字符串上的操作+总是返回一个新字符串


int可能正在将其值存储在成员“value”中,而成员“value”无论如何都是不可访问的,这就是无法更改的原因。int上的所有操作都返回新的int,并且该值被复制到变量,因为它是一种值类型。

为了完整性,.NET字符串也是不可变的。