C# 自动属性必须同时定义get和set访问器,这有技术原因吗

C# 自动属性必须同时定义get和set访问器,这有技术原因吗,c#,accessor,automatic-properties,C#,Accessor,Automatic Properties,我知道自动属性必须定义一个get和set访问器方法,我还知道通过访问修饰符可以使这些访问器中的任何一个不可见 有没有技术上的原因让编译器满意 public object Property { get; set; } 但不是 public object Property { get; } 我对这段代码的理解(可能是错误的)是编译器生成了一个对调用代码隐藏的支持字段,如下所示: private object hiddenField; //hidden by compiler. public o

我知道自动属性必须定义一个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,我明白了,谢谢大家让我度过了最后一刻/

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

类似地,如果没有get访问器,就无法返回您设置的值

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

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

public object Property { get; private set; }
这使您能够从外部隐藏集合,但仍然具有可用属性

public object Property { get; private set; } 
将起作用,并且它将具有您期望的语义。

来自C#spec:

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


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

您如何使用以下属性

公共对象属性{get;}


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

如果没有设置它的方法,它将返回什么?如果没有
设置,您将无法写入自动属性。。不过我明白你的意思——为什么编译器不能假设如果没有,就假装一下。如果存在问题,您可以选择指定
private set@kenny Yours是一条让我从白日梦中清醒过来的评论,它告诉我有一种不用道具就能使用自动道具的方法。Thanks@Cripplesmurf,您可能会发现get-only属性作为接口的一部分很有用。