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

时间:2008-12-03 19:16:03

标签: c# .net constructor constructor-chaining

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

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

例如:

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

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

7 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:19)

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

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");
}

输出以下内容

Called from default constructor
Called from main function

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

答案 2 :(得分:4)

你是对的。

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

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

答案 3 :(得分:3)

.NET类中的每个构造函数都确保它所继承的类中的构造函数也被调用。

所以,如果您有以下课程:

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

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

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

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

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

我希望这是可以理解的。

答案 4 :(得分:2)

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

在IoC中使用了很多。

答案 5 :(得分:2)

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

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

将致电

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

这将持续到你有一个基础或什么都没有。

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

如果什么都没有,那么自动调用基类的无参数构造函数。

使用this(....)之后,将使用与参数匹配的构造函数并执行其正文 - 除了使用this(....)的构造函数的主体外。

答案 6 :(得分:2)

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

  

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

在Pro C#2005和.NET 2.0 Platform,3rd Edition中 作者:Andrew Troelsen