:C#构造函数中的this(foo)语法?

我时不时地碰到我以前见过的语法,但从未使用过。 这是其中一次。

有人可以按照C#构造函数方法解释“:this”或“:base”的用途吗?

例如:

public MyClass(SomeArg arg) : this(new SomethingElse(), arg) { } 

我的直觉是它用于将默认参数映射到另一个构造函数方法。

你基本上是对的。 this()在当前实例上调用构造函数, base()在当前实例上调用超类型的构造函数。 它们通常用于处理构造函数重载,因此您可以添加其他选项,而不会将其分解为单独的方法。

你的直觉是对的。 该语法用于在同一个类中调用重载的构造函数:

 public class Test { public Test() : this("Called from default constructor") { } public Test(String msg) { Console.WriteLine(msg); } } 

以下代码:

 public static void Main(String[] args) { Test t1 = new Test(); Test t2 = new Test("Called from Main function"); } 

输出以下内容

 从默认构造函数调用
从主要function调用 

类似地, : base(someParams)用于调用基础构造函数。

你是对的。

:base(…)调用基类的构造函数。

:this(…)调用定义类的另一个构造函数。 大部分时间它只是作为一个立面。

.NET类中的每个构造函数都确保也调用它inheritance的类中的构造函数。

所以如果你有以下课程:

 public class Base { } public class Something : Base { } public class Else : Something { } 

那么Else中的构造函数将调用Something中的构造函数,它也将在Base中调用构造函数。

在基类中调用的构造函数(即,您正在降序的构造函数)始终是无参数构造函数。

如果您没有,或者想要覆盖它,您可以通过指定base(这里的一些参数)来覆盖它。 这将在基类中选择正确的构造函数。

您还可以要求构造函数首先在同一级别中调用另一个构造函数。 这可以用于避免在多个构造函数中复制构造函数代码。 但最终,被调用的构造函数将调用基类中的构造函数。

我希望这是可以理解的。

究竟。 称之为Constructor Chaining,它用于解决C#无法执行默认参数的事实。

这在IoC中经常使用。

如果我没有弄错的话就是这样的:

 public MyClass(SomeArg arg) : this(new SomethingElse(), arg) 

将会通知

 public MyClass(SomethingElse arg, SomeArg arg1) : base or this or nothing 

并且这将继续,直到你有一个基地或什么都没有。

如果你有base(....)那么那个构造函数将使用给定的参数(如果有的话)调用基础构造函数,而这些参数又可以委托给它自己的构造函数(同一个游戏)。

如果没有,则自动调用基类的无参数构造函数。

在使用了this(....)之后,将使用与参数匹配的构造函数并且将执行它的主体 – 除了使用了this(....)的构造函数的主体之外。

是的,你是对的。 此语法用于让您的子类构造函数显式调用适当的自定义基类构造函数,而不是默认值。 您的问题中的this关键字将被解释为:

this关键字的另一个用途是强制一个构造函数调用另一个,以避免冗余成员初始化逻辑。

在Pro C#2005和.NET 2.0平台,第3版由Andrew Troelsen完成