17

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

有人可以在 C# 构造方法之后解释 ":this" 或 ":base" 的目的吗?

例如:

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

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

4

7 回答 7

20

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

于 2008-12-03T19:19:33.083 回答
20

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

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

输出以下内容

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

同样,: base(someParams)用于调用基本构造函数。

于 2008-12-03T19:21:36.743 回答
4

你是对的。

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

: this(...)调用定义类的另一个构造函数。大多数时候它只是作为一个门面工作。

于 2008-12-03T19:20:54.203 回答
3

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

因此,如果您有以下课程:

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

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

在基类中调用的构造函数(即,您所继承的构造函数)始终是无参数构造函数。

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

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

我希望这是可以理解的。

于 2008-12-03T19:21:13.080 回答
2

确切地。将其称为构造函数链接,它用于解决 C# 无法执行默认参数的事实。

这在 IoC 中被大量使用。

于 2008-12-03T19:22:15.480 回答
2

如果我没记错的话是这样的:

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

将会通知

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

这会一直持续到你有一个基地或什么都没有。

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

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

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

于 2008-12-03T19:25:19.700 回答
2

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

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

在 Pro C# 2005 和 .NET 2.0 平台中,第 3 版,作者 Andrew Troelsen

于 2008-12-03T19:25:51.260 回答