C# 函数():此(null){}

C# 函数():此(null){},c#,syntax,constructor,null,class-constructors,C#,Syntax,Constructor,Null,Class Constructors,有人能解释一下下面的语法吗 protected MyConstructor() : this(null) 我主要对这部分感兴趣:“:this(null)” 我知道如何保护,构造器和“这个”关键字的工作,但我感到困惑,无法找到任何详细信息的最后一部分都放在我所有的在线搜索 编辑:我应该补充一点,它位于公共抽象类中。所以我猜构造函数正在调用实现者构造函数 谢谢这个(null)所做的是调用同一类中接受一个参数的另一个构造函数,并传递一个null值作为该参数。查看构造函数重载了解更多信息。另外,构造函

有人能解释一下下面的语法吗

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

我知道如何保护,构造器和“这个”关键字的工作,但我感到困惑,无法找到任何详细信息的最后一部分都放在我所有的在线搜索

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


谢谢

这个(null)所做的是调用同一类中接受一个参数的另一个构造函数,并传递一个null值作为该参数。查看
构造函数重载
了解更多信息。另外,
构造函数链接
与您的问题更相关,但我将研究这两个主题。

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

protected MyConstructor() : this(null)
使用
null
参数调用构造函数的不同重载

protected MyConstructor() : base(null)
使用
null
参数对基类调用构造函数

protected MyConstructor() : base(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
}
现在您可以像这样实例化该类:

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
}
这是必需的,因为您不能以任何其他方式重用构造函数代码。如果您只是重写或重载一个方法,那么等效的方法如下所示:

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
}
同一个对象上还有另一个构造函数,它接受某种类型的可为null的对象。例如:

public MyConstructor(string str)
{
   // A
}


public MyConstructor() : this(null)
{
   // B
}
在本例中(出于演示目的将构造函数更改为
public
),如果调用:

var newObj = new MyConstructor();
它将创建一个
MyConstructor
对象,首先在
a
中运行代码(作为参数传入
null
),然后在
B
中运行代码


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

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

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

protected MyConstructor(object whatever)
{
    Frob(whatever);
}

猜测是它调用另一个构造函数并传入null值。是否有只接受一个参数的构造函数?是否调试了代码以查看会发生什么?顺便说一句,如果您熟悉“constructor():base()”语法,这看起来应该很熟悉。不是调用超级类构造函数,而是调用当前类中的构造函数。看看这里没有糖只是为了好玩,我会注意到你可以将最后一个示例写成:
public void DoStuff(object someObject=null){//Do some stuff}
@MikeChristensen True,但有一个重要区别——可选参数是在编译时确定的。因此,如果您有一个库,它更改了可选参数的默认值,那么在用户重新编译之前,更改不会传播到库的用户。这是因为可选参数实际上不是IL的一个特性,它们只是语法糖。