代码之家  ›  专栏  ›  技术社区  ›  Crippledsmurf

自动属性必须同时定义get和set访问器是否有技术原因?

  •  4
  • Crippledsmurf  · 技术社区  · 14 年前

    我知道自动属性必须定义get-and-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 accessor函数?

    我理解这可能是一个功能范围问题,而不是技术限制问题,我也坦率地承认,我到目前为止还没有咨询过C语言规范。

    [ 更新2 ]

    原谅我……我是个白痴:P,我明白了,现在,谢谢大家为我的毕业时刻而欢呼。/

    4 回复  |  直到 14 年前
        1
  •  11
  •   Reed Copsey    14 年前

    如果没有set访问器,就无法设置值,因为您没有访问“hiddenfield”的方法。

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

    因为它真的没用了,所以是不允许的。

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

    public object Property { get; private set; }
    

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

        2
  •  1
  •   Robert Harvey    14 年前
    public object Property { get; private set; } 
    

    会工作的,它将具有您期望的语义。

        3
  •  1
  •   A_Nabelsi    14 年前

    您如何使用这样的属性?

    public object Property { get; }

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

        4
  •  0
  •   Andrew Cooper    14 年前

    根据C规范:

    因为支持字段是 不可访问,可以读取和 仅通过财产书写 访问器,即使在包含 类型。

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