我有一个类结构,如下所示
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;
}
}
这会引发编译错误。
只读字段不能分配给(构造函数或变量初始化器除外)
和
属性或索引器的AMyAbstractClass.MyReadonlyProperty不能分配给--它是只读的
分别使用。
在第一种情况下,错误消息是错误的,因为它是在构造函数中设置的!
我可以想出其他方法来拥有不可变的对象属性,但是为什么这种情况是不允许的呢?这种封装的良好实践是什么?
发布于 2019-08-05 07:57:47
您需要通过基类的构造函数传播它们:
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) {
}
}
关于readonly
字段。来自ECMA-334 C#语言规范,第15.5.3章的参考:
当字段声明包括只读修饰符时,由声明引入的字段是只读字段。对只读字段的直接赋值只能作为声明的一部分进行,或者在同一个类中的实例构造函数或静态构造函数中进行。
以及对只读自动属性的描述来自c# 6:
..。属性只能在构造函数的正文中设置:
https://stackoverflow.com/questions/57362098
复制