【发布时间】:2014-09-09 13:33:02
【问题描述】:
这是我第一次编写将用于广泛的几何计算的小型不可变结构。我很想使用public readonly 字段而不是private field/public getter 组合。
public struct Vector4
{
public readonly float Angle, Velocity;
// As opposed to:
private float _Angle, _Velocity;
public float Angle { get { return (this._Angle); } }
public float Velocity { get { return (this._Velocity); } }
public Vector4 (float angle, float velocity)
{
// Once set in the constructor, instance values will never change.
this.Angle = angle;
this.Velocity = velocity;
}
}
它看起来更干净,并消除了额外的层(吸气剂)。除了使用公共字段是不好的做法之外,以这种方式使用公共只读字段是否有任何负面影响?
注意,我们只讨论值类型。例如,数组会暴露要被调用代码覆盖的元素。
更新:
感谢所有输入。在这种不使用数据绑定等的情况下,使用public readonly 字段似乎没有缺点。在我的基准测试中,执行时间减少了 70%,这是一个大问题。以 .NET 4 为目标,我希望编译器能够内联 getter-only 属性。基准测试当然是在没有附加调试器的情况下在发布配置中测试的。
【问题讨论】:
-
正如@asawyer 指出的那样,这是我过去对结构所做的,尽管只读是一个有趣的想法。 readonly 背后的想法是它们只能通过声明或构造函数来设置。由于结构 supposed 是不可变的,所以对我来说这听起来是个好主意。我希望收到知道他们在说什么的人的回复,以了解这是否是有效的做法:O
-
@asawyer 请注意,不能在 struct 构造函数中使用自动属性,因为您将立即得到“在将其所有字段分配给之前无法使用 'this' 对象”。因此,如果您需要一个构造函数来为结构的属性赋值,非自动属性是可行的方法。
-
在这种情况下,我会向 .NET Framework 寻求指导。框架中的结构是否使用字段或属性?答案是属性,所以我倾向于效仿。框架仅真正将字段用于常量。在其他条件相同的情况下,属性具有能够绑定的优势,哪些字段不能,并且还允许您在不更改接口的情况下更改未来的实现。面向未来不会受到伤害。
-
@LasseV.Karlsen 我不记得了,谢谢。我通常在 struts 上使用带有私有 ctor 的静态辅助函数。
-
使用属性而不是只读字段通常是为了向前兼容。如果您稍后决定可以计算其中一个属性,并将其更改为进行计算的属性,则所有已经使用该结构引用您的程序集的现有程序集也需要重新编译。此外,调用仅返回私有字段值的属性 getter可能被内联到调用代码中,因此不会产生调用开销。
标签: c# .net field readonly getter-setter