为什么c#不支持只读或只写自动属性?

时间:2009-11-03 09:51:36

标签: c#

我只是想知道c#不支持只读和只写自动属性的逻辑原因。

(即我的意思是只有get或set的属性,但不是两者。如果你试图定义这样的自动属性,你会得到一个编译错误,告诉你auto属性必须同时有get和set)。

是否只是为了阻止人们意外忘记添加一个?

由于

5 个答案:

答案 0 :(得分:12)

来自C#3.0规范:

  

将属性指定为   自动实现属性,a   隐藏的支持字段是自动的   可用于酒店,以及   实现访问器以进行读取   并写信给那个支持领域。

     

因为支持字段是   无法访问,可以阅读和   只能通过酒店写下来   存取。这意味着   自动实现只读或   只写属性不会   感觉,并被禁止。它是   但是可以设置访问权限   每个访问者的级别不同。   因此,只读的效果   具有私人支持领域的财产   可以像这样模仿:

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; }
}

答案 1 :(得分:7)

您可以通过将setter设为私有来创建只读属性:

class A {
  public int Foo { get; private set; }
}

答案 2 :(得分:5)

当你没有设定值时,你想到达什么地方?

MyPorperty { get; }

即使您设置了该属性,如果无法获得该值,有什么好处?

MyProperty { set; }

如果您希望外部代码只能看到set或get访问器,则可以使用如下的private关键字:

MyProperty { get; private set; }

MyProperty { private get; set; }

答案 3 :(得分:1)

如果你只有一个getter,这个auto-property怎么能返回一些有用的东西?

同样的逻辑适用于setter。

:)

如果您的想法是继承,那么您可以将其标记为摘要并执行您想要的操作:

//this compiles successfully
public abstract Name { get; }

//this tooo
public abstract Age { set; }

答案 4 :(得分:1)

嗯,你会怎么做这样的财产?除了通过setter之外,没有办法为自动属性赋值,并且除了通过writer之外没有其他方法可以读取。那么能够读取一个只能是默认值的值或者写一个你永远无法获得的值会有什么用呢?