不可变变量和不可变对象

时间:2015-10-28 17:27:57

标签: c# .net immutability

不可变对象不可变变量之间有什么区别?他们都不可改变

不可变变量无法更改的变量。但对于简单类型不可变变量另一个名称还是一词?我们可以使用"只读" 还是特定字词

2 个答案:

答案 0 :(得分:4)

  

不可变对象和不可变变量之间有什么区别?

不可变对象是一个对象,其(意味着其属性值)不能通过外部访问器或内部方法更改。

  

C#是否具有“不可变变量”?

如果你认为班级成员是“变量”,那么是。如果没有,则编号C ++具有“常量”局部变量的概念,但C#没有。

  

对于简单类型,是否存在不可变变量的另一个名称或术语?

不在“局部变量”意义上。在C#中,有两种类型的类成员无法更改。一个是readonly,可以在运行时设置为对象构造的一部分(或static redaonly字段的静态构造)。

另一个是constant,类似于readonly,但常量的烘焙到二进制代码中class,意思是在引用字段的任何时候将值替换为已编译的代码。

答案 1 :(得分:1)

不可变对象是一个无法更改的对象(期望您获得相同的对象)。这可能有些令人困惑,所以让我解释一下我能想到的最简单的例子。说我有以下代码:

string myString = "Hello World!";

字符串是不可变对象的一个​​示例。现在,显然您可以更改myString的值,但是,当您执行此操作时,不仅仅是对myString对象进行更改。该语言实际上创建了一个myString将指向的新字符串对象。 (我不记得完全有关其工作原理的详细信息,原因如下,请参阅this answer

//This is creating a new string object, although it looks like a simple
//manipulation of what currently exists.
myString = "Goodbye World!";  
另一方面,

不可变变量(正如你所说)(通常称为“常量”或“常量字段”)我的经历),不能改变。如果您尝试以任何方式修改它,您的编译器会抱怨。 为什么你想要这样做有很多原因(谷歌搜索会给你几十个)。简而言之,即使是偶然的,你也要知道价值永远不应该改变的地方。

这可能是一个很弱的例子,但是你说你有一个构建Vehicle对象的程序,而且你知道你需要的轮子最多的是18个。你可以说:

const int MAX_WHEELS = 18;

这不可能偶然改变。任何时候你使用MAX_WHEELS,它总是18。我不知道细节,但似乎编译器只会将值替换为字段名称,但也许有人可以纠正我。