什么时候应该在C#中使用struct而不是class?我的概念模型是当项只是值类型的集合时使用结构.一种逻辑上将它们组合在一起形成一个有凝聚力的整体的方法.
我在这里遇到了这些规则:
这些规则有效吗?结构在语义上意味着什么?
鉴于可变结构通常被认为是邪恶的(例如,为什么可变结构"邪恶"?),是否有可能促使.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
Run Code Online (Sandbox Code Playgroud)
但它实际上是这样的:
var vector = new Vector(7, 11);
vector.Normalize(); // This compiles, but now I've overwritten my original vector
Run Code Online (Sandbox Code Playgroud)
......所以,似乎不变性只是为了避免混淆是一个好主意,但同样,也许在某些情况下值得存在这种混淆.
我正在尝试编写以下代码:
public const Size ImageSize = new Size() { Width = 28, Height = 28 };
Run Code Online (Sandbox Code Playgroud)
但我得到的错误Width,并Height是只读的.
建议的方法是什么?
我在读虽然关于在计算器上不纯的方法问题,在这里,它让我想起了结构设计的最佳实践.
阅读有关创建不可变结构的示例,此处属性仅定义为getter.
public DateTime Start { get { return start; } }
public DateTime End { get { return end; } }
public bool HasValue { get { return hasValue; } }
Run Code Online (Sandbox Code Playgroud)
其他地方的其他示例包括System.Drawing.Point属性中的getter和setter.
public int Y {
get {
return y;
}
set {
y = value;
}
}
Run Code Online (Sandbox Code Playgroud)
该设计准则不指定,但他们都相当简洁.结构属性的推荐方法是什么?只读或允许写作?