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;}

}

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

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

[更新 2 ]

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

4

4 回答 4

11

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

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

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

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

public object Property { get; private set; }

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

于 2010-10-21T23:09:28.403 回答
1
public object Property { get; private set; } 

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

于 2010-10-21T23:10:11.027 回答
1

您如何使用以下属性?

public object Property { get; }

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

于 2010-10-21T23:17:56.587 回答
0

从 C# 规范:

由于支持字段不可访问,因此只能通过属性访问器读取和写入,即使在包含类型内也是如此。

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

于 2010-10-21T23:15:28.827 回答