【发布时间】:2010-01-30 03:48:46
【问题描述】:
这个问题出现在this answer 的cmets 中。无法拥有只读属性被提议作为使用字段而不是属性的潜在原因。
例如:
class Rectangle
{
private readonly int _width;
private readonly int _height;
public Rectangle(int width, int height)
{
_width = width;
_height = height;
}
public int Width { get { return _width; } }
public int Height { get { return _height; } }
}
但是你为什么不能这样做呢?
public int Width { get; readonly set; }
编辑(澄清):您可以在第一个示例中实现此功能。但是为什么你不能使用自动实现的属性速记来做同样的事情呢?它也不会那么混乱,因为您不必直接访问构造函数中的字段;所有访问都将通过该物业进行。
编辑(更新):从 C# 6.0 开始,支持只读属性! object MyProp { get; } 该属性可以内联 (object MyProp { get; } = ...) 或在构造函数中设置,但不能在其他任何地方设置(就像 readonly 字段一样)。
【问题讨论】:
-
更好的语法是
public int Width { get; readonly set; }。 -
@Jason:看起来确实更好——我已将其编辑为您的版本。
-
@Jason:我不知道,“只读设置器”的概念对我来说似乎很奇怪。在这个问题的背景下,在这里很容易理解,但我认为如果我突然看到它,那将是一个 WTF 时刻。
-
@Aaronaught:我确定您知道关键字
readonly的含义,但我们很清楚,这意味着直接分配给标有readonly修饰符的变量只能发生在声明点或构造函数中。因此,readonly set将意味着“此属性只能在构造函数或对象初始化程序中设置。” -
注意:Jon Skeet 在他的 DDD8 广播中特别提到了这一点,作为他在 C# 5.0 中想要的东西。
标签: c# properties