有人可以解释以下语法糖吗?
protected MyConstructor() : this(null)
主要是我对这部分感兴趣:“ : this(null)
”
我知道受保护的构造函数和“this”关键字是如何工作的,但是我很困惑,在我所有的在线搜索中都找不到最后一部分的任何详细信息。
编辑:我应该补充一点,它在一个公共抽象类中。所以我猜构造函数正在调用实现者构造函数。
谢谢
有人可以解释以下语法糖吗?
protected MyConstructor() : this(null)
主要是我对这部分感兴趣:“ : this(null)
”
我知道受保护的构造函数和“this”关键字是如何工作的,但是我很困惑,在我所有的在线搜索中都找不到最后一部分的任何详细信息。
编辑:我应该补充一点,它在一个公共抽象类中。所以我猜构造函数正在调用实现者构造函数。
谢谢
它调用另一个具有参数的类构造函数:
protected MyConstructor() : this(null) { } // This calls the other constructor
protected MyConstructor(object whatever)
{
Frob(whatever);
}
这是构造函数的特殊语法。您可以有两个基本变体:
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
}
在同一个对象上还有另一个构造函数,它采用某种可为空的对象。例如:
public MyConstructor(string str)
{
// A
}
public MyConstructor() : this(null)
{
// B
}
在此示例中(将构造函数更改为public
用于演示目的),如果我调用:
var newObj = new MyConstructor();
它将创建一个MyConstructor
对象,A
首先运行代码(作为参数传入null
)然后运行代码B
。
这是一种允许您整合需要运行的通用代码的方法,无论调用什么构造函数。
正在做this(null)
的是调用同一个类中的另一个构造函数,该构造函数接受一个参数,并传递一个空值作为该参数。查看constructor overloading
更多信息。此外,constructor chaining
与您的问题更相关,但我会研究这两个主题。