构造函数定义中的这个冒号是什么?

Joe*_*Joe 1 c# terminology

在 C# 中定义构造函数时,可以使用冒号(如本例所示):

 public class Custom : OtherClass {
      public Custom(string s) : base(s) { }
 }
Run Code Online (Sandbox Code Playgroud)

这个冒号叫什么? (在不知道它叫什么的情况下阅读它是非常困难的。)

请注意,我问的是构造函数定义中的冒号,而不是类定义中显示继承的冒号。

Dai*_*Dai 6

那不是方法定义,而是构造函数定义;冒号用于指定必须在子类的构造函数之前调用的超类构造函数调用。

在 Java 中,使用super关键字,但它必须是子类构造函数中的第一个操作,而 C# 使用的语法更接近 C++ 的初始化列表。

如果子类的“超类”构造函数没有任何参数,则不需要显式调用父构造函数,只有在需要参数或要调用特定重载构造函数时,才必须使用此语法。

爪哇:

public class Derived extends Parent {
    public Derived(String x) {
        super(x);
    }
}
Run Code Online (Sandbox Code Playgroud)

C#:

public class Derived : Parent {
    public Derived(String x) : base(x) {
    }
}
Run Code Online (Sandbox Code Playgroud)

更新

C# 语言规范 5.0 - https://msdn.microsoft.com/en-us/library/ms228593.aspx?f=255&MSPPError=-2147217396在第 10.11.1 节“构造函数初始值设定项”中有解释

所有实例构造函数(除了 class 的那些Object)都隐式地包含在constructor-body之前的另一个实例构造函数的调用。隐式调用的构造函数构造函数初始化器确定:

所以这个语法的官方技术术语......

: base(x, y, z) 
Run Code Online (Sandbox Code Playgroud)

...是“构造函数初始值设定项”,但是规范并没有专门调用冒号语法并给它自己的名字。作者假设规范不关心这些琐碎的事情。