在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
It's been said 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以不可变的方式?
答案 0 :(得分:21)
跟进Marc(完全可以接受)的答案:整数值是不可变的,但整数变量可能会有所不同。 这就是为什么他们被称为“变量”。
整数值是不可变的:如果你的数字是12,那就没办法把它变成奇数,没办法把它涂成蓝色,依此类推。如果你试图通过添加一个来使它变得奇怪,那么你最终得到一个不同的值,13。也许你将该值存储在过去包含12的变量中,但这不会改变12的任何属性。 12保持与以前完全相同。
答案 1 :(得分:16)
你没有改变(和不能改变)关于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*
然而,这里没有“指向”。结构直接在堆栈上(在本例中):不涉及引用。
答案 2 :(得分:2)
虽然这听起来很明显,但我会添加一些帮助我理解的行,以防有人产生同样的困惑。
有various kinds of mutability但通常当人们说“不可变”时,他们的意思是该课程的成员无法更改。
字符串可能是在数组中存储字符,这些字符无法访问且无法通过方法更改,这就是字符串不可变的原因。对字符串的操作+总是返回一个新字符串。
int可能将它的值存储在成员“Value”中,无论如何都无法访问,这就是为什么无法更改的原因。 int上的所有操作都返回new int,并将此值复制到变量,因为它是值类型。