6

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

protected MyConstructor() : this(null)

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

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

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

谢谢

4

4 回答 4

9

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

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

protected MyConstructor(object whatever)
{
    Frob(whatever);
}
于 2014-01-15T17:29:43.837 回答
8

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

protected MyConstructor() : this(null)

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

protected MyConstructor() : base(null)

使用参数调用基类的构造null函数。

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

class MyClass
{
  object someObject;

  public MyClass() : this(null) {}
  public MyClass(object someObject) { this.someObject = someObject; }
}

现在您可以像这样实例化该类:

var c = new MyClass(); // c.someObject is null
var c2 = new MyClass(new object()); // c2.someObject is some new object instance

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

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

public void DoStuff(object someObject)
{
  // Do some stuff
}
于 2014-01-15T17:29:30.500 回答
5

在同一个对象上还有另一个构造函数,它采用某种可为的对象。例如:

public MyConstructor(string str)
{
   // A
}


public MyConstructor() : this(null)
{
   // B
}

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

var newObj = new MyConstructor();

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

这是一种允许您整合需要运行的通用代码的方法,无论调用什么构造函数。

于 2014-01-15T17:29:34.140 回答
3

正在做this(null)的是调用同一个类中的另一个构造函数,该构造函数接受一个参数,并传递一个空值作为该参数。查看constructor overloading更多信息。此外,constructor chaining与您的问题更相关,但我会研究这两个主题。

于 2014-01-15T17:29:24.170 回答