在 C# 中,如果我声明一个自动实现的属性,为什么我必须同时声明 get 和 set 部分?
IE
public string ThisWorks { get; set; }
public string ThisDoesnt { get; }
这不只是语法糖——即编译器为属性插入一个私有字段吗?那么为什么会出现问题呢?
好奇的。
在 C# 中,如果我声明一个自动实现的属性,为什么我必须同时声明 get 和 set 部分?
IE
public string ThisWorks { get; set; }
public string ThisDoesnt { get; }
这不只是语法糖——即编译器为属性插入一个私有字段吗?那么为什么会出现问题呢?
好奇的。
如果您没有 setter - 那么您将如何设置属性?
顺便说一句,您可以指定可访问性,例如:
public string Foo
{
get;
private set;
}
如果没有 setter,您将永远无法提供值 - 因为您无法指定支持变量的名称。
我请求了一个只读的自动属性,声明如下:
public string ReadonlyProperty { get; readonly set; }
这将创建一个只读的后备变量,一个只有一个 getter 的属性,并将所有对 setter 的调用转换为对变量的直接访问。您只能在构造函数中调用 setter - 就像普通的只读变量一样。
我们将看看这个请求是否有任何好处......很遗憾它目前不在那里,因为它使得实现不可变类型比实现可变类型更难:(
自动实现的属性没有可访问的私有存储,因此如果没有 setter,您将无法设置值,使其完全无用。
你需要一个集合——否则,你的自动实现的属性如何获得它的价值?自动实现该属性时,您必须有一个 set 访问器,以便在构造期间至少为其赋予一个值。
有趣的是,Visual Studio 2015 中的新 Roslyn 编译器现在允许这样做,即使项目配置为使用 C# 版本 5。