自动属性必须定义get和set访问器的技术原因是什么?

4
我知道自动属性必须定义 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的存在(或不存在)省略设置访问器函数呢?
我理解这可能是特性范围而不是技术限制的问题,同时我也自由承认我尚未查阅C#语言规范。
[更新2]
请原谅我...我是个傻瓜:P,我现在明白了,感谢大家容忍我的老年瞬间/

2
没有设置它,它会返回什么? - kenny
如果没有 set;,您就无法写入自动属性。我明白你的意思 - 为什么编译器不能假定如果没有一个,就假装有一个呢?如果这对您有问题,您可以指定 private set;选项。 - DaveDev
@kenny,你的评论让我从关于如何在没有设置的情况下使用自动属性的白日梦中醒来。谢谢。 - Crippledsmurf
@Cripplesmurf,你可能会发现只读属性作为接口的一部分非常有用。 - kenny
4个回答

11

没有 set 访问器,你就无法设置值,因为你没有访问 "hiddenField" 的方式。

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

由于这样做变得毫无意义,所以不允许使用。

但是,你可以在这两个方法上设置不同的访问权限:

public object Property { get; private set; }

这样可以让你隐藏集合,不让外部访问,但仍然保持可用的属性。


1
public object Property { get; private set; } 

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


1
你如何使用以下的属性? public object Property { get; }
理论上,如果你像这样写,它总是返回 null,因为它缺少 set 访问器。我认为它是无用的,除非你以某种方式设置隐藏字段,使其具有静态值以始终返回它。

0
从 C# 规范中:
由于后备字段是不可访问的,因此即使在包含类型内部,它也只能通过属性访问器进行读取和写入。
省略其中一个访问器意味着该属性在类/结构的构造函数中将成为只读或只写属性。不是很有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接