我创建了一个自动属性:
public int Foo { get; }
这是唯一的getter。但是当我构建一个构造函数时,我可以改变这个值:
public MyClass(string name)
{
Foo = 5;
}
为什么这是可能的,即使这是get-only?
发布于 2016-01-12 20:21:51
这是a new feature in C#6,它允许您创建只读属性并从构造函数初始化它们的值(或在声明它们时内联)。
如果您试图在构造函数之外更改此属性的值,将会出现编译错误。
它是只读的,因为一旦初始化了它的值(内联或在构造函数内部),就不能更改它的值。
发布于 2016-01-12 20:25:13
如果无法从构造函数(或自动属性初始值设定项)初始化只读属性,则它将毫无用处,因为它将始终返回其类型的默认值(0表示数字,null表示引用类型)。相同的语义适用于所有C#版本中的readonly字段。
要定义真正的getter属性(不能从构造函数初始化),您需要指定它作为定义的一部分返回的内容:
public int Foo { get { return 5; } }
或者,在C# 6中更简洁:
public int Foo => 5;
发布于 2016-01-13 06:25:30
声明为readonly
的变量可以在构造函数中编写,但在支持该属性的语言中,不能在构造函数返回后进行修改。该限定符是作为一种语言功能提供的,因为它通常对于值随构造函数参数变化的字段是必需的(这意味着它们不能在构造函数开始之前初始化),但在构造函数返回后不必更改,但它仅适用于公开为字段的变量。在许多情况下,readonly
-qualified字段的语义对于公共成员来说是完美的,只是类将成员--甚至是不可变的成员--公开为属性而不是字段通常更好。
就像读写自动属性允许类像普通字段一样容易地公开可变属性一样,只读自动属性允许类像readonly
-qualified字段一样容易地公开不可变属性。正如可以在构造函数中编写readonly
-qualified字段一样,get-only属性也是如此。
https://stackoverflow.com/questions/34743533
复制相似问题