readonly-fields作为子类构造函数的目标

phi*_*eld 19 c# inheritance readonly restriction variable-assignment

当你有一个在object-instatiation时已知的变量时,应该使用readonly字段,之后不应该更改.

但是,不允许从子类的构造函数中分配只读字段.如果超类是抽象的,这甚至都不起作用.

有没有人有一个很好的解释为什么这不是一个好主意,或缺乏C#languange?

abstract class Super
{
    protected readonly int Field;
}

class Sub : Super 
{
    public Sub()
    {
        this.Field = 5; //Not compileable
    }
}
Run Code Online (Sandbox Code Playgroud)

PS:您当然可以通过在超类中的受保护构造函数中分配只读字段来获得相同的结果.

m.e*_*son 12

我能看到的唯一原因是因为"它只是按照这种方式设计的",根据规范:

对只读字段的直接赋值只能作为该声明的一部分或在同一类中的实例构造函数或静态构造函数中出现.

只读它的意思是它不能被改变,如果派生类可以修改那么这将不再是真的并且将违反封装(通过修改另一个类的内部).

  • 这可能是不合适的,也许我们永远不会知道该设计决定的确切原因. (2认同)

Ren*_*ama 10

public class Father
{
    protected readonly Int32 field;

    protected Father (Int32 field)
    {
        this.field = field;
    }
}

public class Son : Father
{
    public Son() : base(5)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

你可以尝试这样的东西!

  • 这不是编辑,但没关系!这是一个巧妙的解决方法 (2认同)