【发布时间】:2012-01-19 01:47:23
【问题描述】:
鉴于可变结构通常被认为是邪恶的(例如,Why are mutable structs “evil”?),是否存在可能促使 .NET 框架的设计者使 System.Windows.Point 和 System.Windows.Vector 可变的潜在好处?
我想了解这一点,以便我可以决定让我自己的类似结构可变(如果有的话)是否有意义。将Point 和Vector 设为可变的决定可能只是判断上的错误,但如果有充分的理由(例如,性能优势),我想了解它是什么。
我知道我曾多次偶然发现Vector.Normalize() 方法的实现,因为令人惊讶的是(!)它不会返回新的Vector。它只是改变了当前向量。
我一直认为它应该这样工作:
var vector = new Vector(7, 11);
var normalizedVector = vector.Normalize(); // Bzzz! Won't compile
但它实际上是这样工作的:
var vector = new Vector(7, 11);
vector.Normalize(); // This compiles, but now I've overwritten my original vector
...所以,为了避免混淆,似乎不变性是一个好主意,但同样,在某些情况下,这种潜在的混淆可能是值得的。
【问题讨论】:
-
这个问题似乎跑题了,因为没有人能回答为什么 .NET 的设计者会做出决定(除非安德斯或其中一位原始设计者碰巧看到了这个问题)。因此,无法明确回答,只是打开一个讨论话题。投票将其迁移到programmers。
-
.NET 设计者从不认为结构是邪恶的,所以他们没有理由这样做。当人们普遍认为程序员难以理解值和引用类型之间的区别时,这整个邪恶的东西才出现。如果我们跟随您的领导,接下来将取缔 i++。
-
只要发出 Eric Lippert 信号就行了。
-
@Ken,我认为有很多人可能会冒险合理地猜测为什么设计是这样的(例如,stackoverflow.com/tags/c%23/topusers)。我不需要真正的 .NET 架构师来获得合理的答案,我只是想了解使这些特定结构可变的潜在好处。虽然我不知道答案,但我觉得这个问题并不是那么主观。
-
这是一个很好的论点,但恐怕我还是不能同意。我的意思是,除非最初的决策者之一回答(并且可以证明是那些可以知道的人之一),否则这只是表达的意见(正如你所说,一个“合理的猜测”),因此没有唯一的答案可以明确地被选为正确的。这使它成为一个讨论而不是一个问题/答案,根据FAQ,它在这里是题外话。 (请注意,我没有否决这个问题;我只是投票支持迁移它。)
标签: c# .net struct immutability mutable