mutable和immutable之间有什么区别?

问题描述:

任何人都可以帮助我找到可变和不可变的基本区别吗?mutable和immutable之间有什么区别?

+3

错误,一个可以改变,另一个不可以!今天似乎是'特殊'问题的一天... – leppie 2010-09-28 08:40:57

+0

不变性的种类:http://blogs.msdn.com/b/ericlippert/archive/2007/11/13/immutability-in-c-part-one -sinds-of-immutability.aspx – LukeH 2010-09-28 08:51:06

+0

Thanks one and alla – 2010-09-28 08:51:23

Immutable意味着一旦初始化,对象的状态不能改变。

可变意味着它可以。

例如 - .NET中的字符串是不可变的。每当你对一个字符串进行操作(修剪,上部套管等)时,就会创建一个新的字符串。在实践中,如果你想创建一个不可变类型,你只允许getter,并且不允许任何状态改变(所以一旦构造器完成运行,任何私有字段都不能改变)。

+1

'DateTime'是另一个。 – Andrey 2010-09-28 08:43:50

+0

@Andrey:如果一个valuetype是可变的,那么这是一个程序员错误:) – leppie 2010-09-28 08:46:46

不可变的类型在实例化后无法更改。例如,字符串是不可变的。每次你想改变一个字符串的值时,都会创建一个新的实例。

一个very basic definition是:

可变对象:当你有一个对象的实例的引用,该实例的内容可以改变

不可变对象:当你有一个对象实例的引用,该实例的内容不能改变

Immutable表示“创建后无法修改”。

  • 不可变的类型有一个构造函数和getters但不是setter。
  • 一个可变类型也可以有setter。

不可变类型的一个例子是DateTime。方法AddMinutes不修改对象 - 它创建并返回一个新的DateTime。

另一个例子是字符串。对于类似字符串的可变类,可以使用类StringBuilder

C#中没有关键字将类型声明为不可变。相反,您应该将所有成员字段标记为readonly以确保它们只能在构造函数中设置。这将防止您意外修改其中一个字段,破坏不变性。

在函数式语言中使用的不可变变量。 使用术语变量是不合适的,功能程序员 更喜欢术语值。不变性

优点:

1线程安全
2共享
3更少的错误倾向

所以更喜欢不变性,如果你有选择。:)

使用参考
imaginationhunt.blogspot

IS STRING MUTABLE OR IMMUTABLE IN .NET?

易变:易变的手段,其状态在创建后是可以改变的。
不可变:不可变意味着其状态一旦创建就无法更改。

字符串对象是'不可变的',这意味着我们不能修改字符串中包含的字符,同时对字符串的操作也会产生修改版本,而不是修改字符串的字符。