【发布时间】:2009-11-03 18:00:50
【问题描述】:
我只是想知道 C# 不支持只读和只写自动属性是否有逻辑原因。
(即我的意思是只有一个 get 或 set 的属性,但不是两者兼有。如果您尝试像这样定义一个自动属性,您会收到一个编译器错误,告诉您自动属性必须同时具有 get 和 set)。
只是为了防止人们不小心忘记添加一个吗?
谢谢
【问题讨论】:
-
是的,这是我的一个愚蠢的问题! ;) 杀了它!请!
标签: c#
我只是想知道 C# 不支持只读和只写自动属性是否有逻辑原因。
(即我的意思是只有一个 get 或 set 的属性,但不是两者兼有。如果您尝试像这样定义一个自动属性,您会收到一个编译器错误,告诉您自动属性必须同时具有 get 和 set)。
只是为了防止人们不小心忘记添加一个吗?
谢谢
【问题讨论】:
标签: c#
来自 C# 3.0 规范:
当一个属性被指定为 自动实现的属性,一个 隐藏的支持字段是自动的 可用于该物业,以及 访问器被实现为读取 并写入该支持字段。
因为支持字段是 无法访问,它可以读取和 仅通过属性写入 访问器。这意味着 自动实现只读或 只写属性不会使 感觉,是不允许的。这是 但是可以设置访问权限 每个访问者的级别不同。 因此,只读的效果 具有私有支持字段的属性 可以这样模仿:
public class ReadOnlyPoint {
public int X { get; private set; }
public int Y { get; private set; }
public ReadOnlyPoint(int x, int y) { X = x; Y = y; }
}
【讨论】:
您可以通过将 setter 设为私有来创建只读属性:
class A {
public int Foo { get; private set; }
}
【讨论】:
当永远不会有设定值时,你想达到什么目的?
MyPorperty { get; }
即使你设置了属性,如果你无论如何都无法获取值有什么好处?
MyProperty { set; }
如果您希望外部代码只看到 set 或 get 访问器,您可以像这样使用 private 关键字:
MyProperty { get; private set; }
或
MyProperty { private get; set; }
【讨论】:
如果你只有一个 getter,这个自动属性怎么能返回有用的东西?
同样的逻辑也适用于 setter。
:)
如果您的想法是继承,那么您可以将其标记为抽象并做您想做的事情:
//this compiles successfully
public abstract Name { get; }
//this tooo
public abstract Age { set; }
【讨论】:
嗯,你会用这样的财产做什么?除了通过 setter 之外,没有其他方法可以为自动属性分配值,并且除了通过 writer 之外,无法从其他属性中读取。那么,能够读取只能作为默认值的值或写入永远无法取回的值有什么用呢?
【讨论】: