4

在 C# 中,如果我声明一个自动实现的属性,为什么我必须同时声明 get 和 set 部分?

IE

public string ThisWorks { get; set; }

public string ThisDoesnt { get; }

这不只是语法糖——即编译器为属性插入一个私有字段吗?那么为什么会出现问题呢?

好奇的。

4

5 回答 5

29

如果您没有 setter - 那么您将如何设置属性?

顺便说一句,您可以指定可访问性,例如:

public string Foo
{
  get;
  private set;
}
于 2008-12-03T14:20:10.377 回答
12

如果没有 setter,您将永远无法提供值 - 因为您无法指定支持变量的名称。

我请求了一个只读的自动属性,声明如下:

public string ReadonlyProperty { get; readonly set; }

这将创建一个只读的后备变量,一个只有一个 getter 的属性,并将所有对 setter 的调用转换为对变量的直接访问。您只能在构造函数中调用 setter - 就像普通的只读变量一样。

我们将看看这个请求是否有任何好处......很遗憾它目前不在那里,因为它使得实现不可变类型比实现可变类型更难:(

于 2008-12-03T14:20:38.007 回答
11

自动实现的属性没有可访问的私有存储,因此如果没有 setter,您将无法设置值,使其完全无用。

于 2008-12-03T14:20:13.887 回答
3

你需要一个集合——否则,你的自动实现的属性如何获得它的价值?自动实现该属性时,您必须有一个 set 访问器,以便在构造期间至少为其赋予一个值。

于 2008-12-03T14:20:47.880 回答
0

有趣的是,Visual Studio 2015 中的新 Roslyn 编译器现在允许这样做,即使项目配置为使用 C# 版本 5。

于 2015-11-04T14:53:02.023 回答