C# 调用带参数的基本构造函数和当前 class 的无参数构造函数

C# invoke base constructor with parameters and parameterless constructor of current class

public class A
{
    public A() { Console.WriteLine("A parameterless"); }
    public A(int a) : this() { Console.WriteLine("A with a"); }
}

public class B : A
{
    public B() { Console.WriteLine("B paramterless"); }
    public B(int b) : base(b) { Console.WriteLine("B with b"); }
}

public class Program
{
    public static void Main(string[] args)
    {
        new B(3);
    }
}

给出:
无参数
一个
B 与 b

我还可以怎样调用 "B parameterless"?
所以,我需要一些类似的东西:

public B(int b) : base(b), this() { ... }

或者,一个虚拟构造函数,这样当基础 class 调用 this() 时,它会重定向到子对象的无参数构造函数。

你不能用构造函数链来做到这一点。但是我看不出有什么问题:

public class A
{
    public A()
    {
        Console.WriteLine("A parameterless");
    }
    public A(int a) : this()
    {
        Console.WriteLine("A with a");
    }
}

public class B : A
{
    public B()
    {
        ThingsIWant();
    }
    public B(int b) : base(b)
    {
        ThingsIWant();
        Console.WriteLine("B with b");
    }

    protected void ThingsIWant()
    {
        Console.WriteLine("B paramterless");
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        new B(3);
    }
}

我将扩展“不能”的答案并添加“不应该”。多个构造函数重载的用例是接收与对象构造相关的不同输入,通常让接收较少信息的构造函数为提供给另一个构造函数的值提供适当的默认值。从可维护性的角度来看,您通常会将包含最详细参数的重载作为真正构造逻辑存在的唯一位置,并让其他构造函数调用该重载。

Try to assign values to readonly fields in ThingsIWant

这是一个 language/compiler 限制:编译器只允许您在构造函数内 物理地 更改只读字段,而不是在构造函数期间调用的方法中对象。

旧的 msdn document 状态:

"When a field declaration includes a readonly modifier, assignments to the fields introduced by the declaration can only occur as part of the declaration or in a constructor in the same class."