首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C# -不能在派生类构造函数中设置只读属性和字段

C# -不能在派生类构造函数中设置只读属性和字段
EN

Stack Overflow用户
提问于 2019-08-05 15:53:22
回答 1查看 2.8K关注 0票数 5

我有一个类结构,如下所示

代码语言:javascript
运行
复制
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不能分配给--它是只读的

分别使用。

在第一种情况下,错误消息是错误的,因为它是在构造函数中设置的!

我可以想出其他方法来拥有不可变的对象属性,但是为什么这种情况是不允许的呢?这种封装的良好实践是什么?

EN

回答 1

Stack Overflow用户

发布于 2019-08-05 15:57:47

您需要通过基类的构造函数传播它们:

代码语言:javascript
运行
复制
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:

..。属性只能在构造函数的正文中设置:

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57362098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档