为什么可变结构是“邪恶的”?

在这里讨论之后,我已经多次阅读了可变结构是“邪恶”的评论(就像这个问题的答案一样)。

C#中可变性和结构的实际问题是什么?


结构是值类型,这意味着它们在传递时被复制。

因此,如果您更改副本,则只会更改该副本,而不会更改原始副本,也不会更改任何其他副本。

如果你的结构是不可变的,那么通过值传递产生的所有自动副本将是相同的。

如果你想改变它,你必须有意识地通过用修改的数据创建一个结构体的新实例来完成它。 (不是副本)


从哪里开始;-p

Eric Lippert的博客总是很好的引用:

这是可变值类型是邪恶的另一个原因。 尽量使价值类型不变。

首先,你倾向于很容易地失去改变...例如,从列表中取出东西:

Foo foo = list[0];
foo.Name = "abc";

这个变化是什么? 没有用的...

与属性相同:

myObj.SomeProperty.Size = 22; // the compiler spots this one

迫使你做:

Bar bar = myObj.SomeProperty;
bar.Size = 22;
myObj.SomeProperty = bar;

不那么批评,有一个尺寸问题; 可变对象往往有多个属性; 但如果你有一个包含两个int s,一个string ,一个DateTime和一个bool ,你可以很快地烧毁大量的内存。 对于一个类,多个调用者可以共享对同一个实例的引用(引用很小)。


我不会说邪恶的,但可变性往往是程序员提供最大功能的过分乐观的表现。 实际上,这通常是不需要的,而这反过来又使得界面更小,更易于使用并且更难以使用错误(=更强健)。

其中一个例子是竞争条件下的读/写和写/写冲突。 这些不能在不可变的结构中发生,因为写入不是有效的操作。

另外,我声称可变性几乎没有实际需要 ,程序员只是认为它可能在未来。 例如,更改日期根本没有意义。 相反,根据旧的创建一个新的日期。 这是一个便宜的操作,所以性能不是一个考虑因素。

链接地址: http://www.djcxy.com/p/28057.html

上一篇: Why are mutable structs “evil”?

下一篇: When should you use a class vs a struct in C++?