【问题标题】:Is there a technical reason why an automatic property must define both a get and set accessor自动属性必须同时定义 get 和 set 访问器是否有技术原因
【发布时间】:2010-10-21 23:06:44
【问题描述】:

我知道自动属性必须定义一个 get 和 set 访问器方法,我也知道可以通过访问修饰符使这些访问器中的任何一个不可见。

编译器是否满意的技术原因

public object Property { get; set; }

但不是

public object Property { get; }

我对这段代码的(可能是错误的)理解是编译器会生成一个对调用代码隐藏的支持字段,如下所示:

private object hiddenField; //hidden by compiler.

public object Property

{

get { return hiddenField; }

set { hiddenField = value;}

}

如果编译器可以生成它,是否有理由根据属性声明中是否存在(或不存在)setter 来省略 set 访问器函数。

我明白这可能是功能范围问题而不是技术限制,我也坦率地承认我还没有参考 C# 语言规范。

[更新 2]

原谅我...我是个白痴:P,我现在明白了,谢谢大家容忍我的高级时刻/

【问题讨论】:

  • 没有办法设置它会返回什么?
  • 如果没有set;,您将无法写入自动属性。不过我明白您在说什么-为什么编译器不能假设如果有不是一个,只是假装。如果您有问题,您可以选择指定private set;
  • @kenny 你的评论让我摆脱了我的白日梦,即有某种方法可以在没有设置的情况下使用自动道具。谢谢
  • @Cripplesmurf,您可能会发现 get only 属性作为接口的一部分很有用。

标签: c# accessor automatic-properties


【解决方案1】:

没有 set 访问器,就无法设置值,因为您无法访问“hiddenField”。

同样,如果没有 get 访问器,就无法取回您设置的值。

既然真的没用了,那就不允许了。

但是,这两种方法可以有不同的可访问性:

public object Property { get; private set; }

这使您能够从外部隐藏集合,但仍然具有可用的属性。

【讨论】:

    【解决方案2】:
    public object Property { get; private set; } 
    

    会起作用,并且会具有您期望的语义。

    【讨论】:

      【解决方案3】:

      你如何使用如下属性?

      public object Property { get; }

      理论上,如果您可以编写类似的东西,它总是返回 null,因为它缺少 set 访问器。我认为除非您以某种方式将隐藏字段设置为具有静态值以始终返回它,否则它是没有用的。

      【讨论】:

        【解决方案4】:

        来自 C# 规范:

        因为支持字段是 无法访问,它可以读取和 仅通过属性写入 访问器,即使在包含 输入。

        离开其中一个访问器意味着该属性要么是只读的,要么是只写的,即使在类/结构的构造函数中也是如此。不是很有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-26
          • 1970-01-01
          相关资源
          最近更新 更多