function():this(null){}

Set*_*den 2 c# syntax null constructor class-constructors

有人可以解释下面的语法糖吗?

protected MyConstructor() : this(null)
Run Code Online (Sandbox Code Playgroud)

主要是我对这部分感兴趣:" : this(null)"

我知道受保护的,构造函数和"this"关键字是如何工作的,但我很困惑,无法在我的所有在线搜索中找到最后一部分的所有详细信息.

编辑:我应该补充一点,它是在一个公共抽象类中.所以我猜构造函数正在调用实现者构造函数.

谢谢

Lua*_*aan 8

这是构造函数的特殊语法.您可以有两个基本变体:

protected MyConstructor() : this(null)
Run Code Online (Sandbox Code Playgroud)

使用null参数调用构造函数的不同重载.

protected MyConstructor() : base(null)
Run Code Online (Sandbox Code Playgroud)

使用null参数在基类上调用构造函数.

所以,你可以有这样一个类:

class MyClass
{
  object someObject;

  public MyClass() : this(null) {}
  public MyClass(object someObject) { this.someObject = someObject; }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以像这样实例化这个类:

var c = new MyClass(); // c.someObject is null
var c2 = new MyClass(new object()); // c2.someObject is some new object instance
Run Code Online (Sandbox Code Playgroud)

这是必需的,因为您不能以任何其他方式重用构造函数代码.如果您只是覆盖或重载方法,则等效项将如下所示:

public void DoStuff()
{
  DoStuff(null);
}

public void DoStuff(object someObject)
{
  // Do some stuff
}
Run Code Online (Sandbox Code Playgroud)


its*_*e86 7

它调用另一个具有参数的类构造函数:

protected MyConstructor() : this(null) { }  // This calls the other constructor

protected MyConstructor(object whatever)
{
    Frob(whatever);
}
Run Code Online (Sandbox Code Playgroud)


Mik*_*sen 5

在同一个对象上还有另一个构造函数,它接受某种可空对象。例如:

public MyConstructor(string str)
{
   // A
}


public MyConstructor() : this(null)
{
   // B
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中(public为了演示目的将构造函数更改为),如果我调用:

var newObj = new MyConstructor();
Run Code Online (Sandbox Code Playgroud)

它将创建一个MyConstructor对象,首先运行代码Anull作为参数传入),然后运行代码B

这是一种允许您合并需要运行的公共代码的方法,而不管调用什么构造函数。