【问题标题】:Why doesn't c# support read-only or write-only automatic properties?为什么 c# 不支持只读或只写自动属性?
【发布时间】:2009-11-03 18:00:50
【问题描述】:

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

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

只是为了防止人们不小心忘记添加一个吗?

谢谢

【问题讨论】:

  • 是的,这是我的一个愚蠢的问题! ;) 杀了它!请!

标签: c#


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      当永远不会有设定值时,你想达到什么目的?

      MyPorperty { get; }
      

      即使你设置了属性,如果你无论如何都无法获取值有什么好处?

      MyProperty { set; }
      

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

      MyProperty { get; private set; }
      

      MyProperty { private get; set; }
      

      【讨论】:

        【解决方案4】:

        如果你只有一个 getter,这个自动属性怎么能返回有用的东西?

        同样的逻辑也适用于 setter。

        :)

        如果您的想法是继承,那么您可以将其标记为抽象并做您想做的事情:

        //this compiles successfully
        public abstract Name { get; }
        
        //this tooo
        public abstract Age { set; }
        

        【讨论】:

          【解决方案5】:

          嗯,你会用这样的财产做什么?除了通过 setter 之外,没有其他方法可以为自动属性分配值,并且除了通过 writer 之外,无法从其他属性中读取。那么,能够读取只能作为默认值的值或写入永远无法取回的值有什么用呢?

          【讨论】:

            猜你喜欢
            • 2013-03-05
            • 2012-03-24
            • 1970-01-01
            • 2011-08-11
            • 2021-05-29
            • 2011-07-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多