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