Ela*_*tor 4 c# constructor derived-class readonly-attribute
我有一个像下面这样的类结构
abstract class AMyAbstractClass {
public readonly int MyReadonlyField;
public int MyReadonlyProperty { get; }//read-only auto-property (syntactic sugar)
}
class MyConcreteClass : AMyAbstractClass {
MyConcreteClass() {
this.MyReadonlyField = 1;
this.MyReadonlyProperty = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
抛出编译错误
无法将只读字段分配给它(在构造函数或变量初始化程序中除外)
和
无法将属性或索引器'AMyAbstractClass.MyReadonlyProperty分配给它-只读
分别。
在第一种情况下,错误消息是错误的,因为它是在构造函数中设置的!
我可以想出具有不可变对象属性的替代方法,但是为什么不允许这种情况呢?这种封装有哪些好的做法?
您需要通过基类的构造函数传播它们:
abstract class AMyAbstractClass {
public readonly int MyReadonlyField;
public int MyReadonlyProperty { get; }//syntactic sugar
protected AMyAbstractClass (int fieldValue, int propertyValue) {
this.MyReadonlyField = fieldValue;
this.MyReadonlyProperty = propertyValue;
}
}
class MyConcreteClass : AMyAbstractClass {
public MyConcreteClass()
: base(fieldValue: 1, propertyValue:1) {
}
}
Run Code Online (Sandbox Code Playgroud)
关于readonly领域。参考ECMA-334 C#语言规范的第15.5.3章:
当字段声明包含只读修饰符时,该声明引入的字段就是只读字段。对只读字段的直接分配只能在该声明的一部分或在同一类的实例构造函数或静态构造函数中发生。
以及来自c#6的只读自动属性的描述:
...属性只能在构造函数的主体中设置:
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |