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

时间:2010-10-21 23:06:45

标签: c# accessor automatic-properties

我知道自动属性必须定义一个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 accessor函数。

我理解这可能是功能范围的问题而不是技术限制,我也自由地承认我还没有参考过C#语言规范。

[更新2 ]

原谅我......我是个白痴:P,我现在看到了,谢谢大家为我的高级时刻做好准备/

4 个答案:

答案 0 :(得分:11)

如果没有set访问器,则无法设置该值,因为您无法访问“hiddenField”。

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

因为它真的变得无用,所以不允许这样做。

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

public object Property { get; private set; }

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

答案 1 :(得分:1)

public object Property { get; private set; } 

将起作用,它将具有您期望的语义。

答案 2 :(得分:1)

您如何使用以下属性?

public object Property { get; }

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

答案 3 :(得分:0)

来自C#规范:

  

因为支持字段是   无法访问,可以阅读和   只能通过酒店写下来   访问者,即使在包含内   类型。

将一个访问器保留为out意味着该属性将是只读的或只写的,即使在类/结构的构造函数中也是如此。不太有用。