8

当我尝试使用 APN 构建某些东西时,我看到了这个代码块。有人可以解释一下“这个”语句在那里做什么吗?

public ApplePushService(IPushChannelFactory pushChannelFactory, ApplePushChannelSettings channelSettings)
        : this(pushChannelFactory, channelSettings, default(IPushServiceSettings))

它像那些参数的默认值吗?

4

3 回答 3

9

this使用指定参数调用 ApplePushService 类的重载构造函数。

例如

// Set a default value for arg2 without having to call that constructor
public class A(int arg1) : this(arg1, 1) 
{
}

public class A(int arg1, int arg2)
{
}

这使您可以调用一个可以调用另一个的构造函数。

于 2013-05-31T15:52:32.983 回答
9

当然 - 将一个构造函数链接到另一个构造函数。有两种形式 -this链接到同一类中的另一个构造函数,以及base链接到基类中的另一个构造函数。您链接到的构造函数的主体执行,然后您的构造函数主体执行。(当然,另一个构造函数可能会先链接到另一个构造函数。)

如果您不指定任何内容,它会自动链接到基类中的无参数构造函数。所以:

public Foo(int x)
{
    // Presumably use x here
}

相当于

public Foo(int x) : base()
{
    // Presumably use x here
}

请注意,实例变量初始化程序在调用其他构造函数之前执行。

令人惊讶的是,C# 编译器没有检测到您是否以相互递归结束 - 所以这段代码是有效的,但最终会出现堆栈溢出:

public class Broken
{
    public Broken() : this("Whoops")
    {
    }

    public Broken(string error) : this()
    {
    }
}

(但是,它确实会阻止您链接到完全相同的构造函数签名。)

有关更多详细信息,请参阅我关于构造函数链接的文章

于 2013-05-31T15:52:55.797 回答
3

在这种情况下调用另一个构造函数,: this(...)用于调用该类中的另一个构造函数。

例如:

public ClassName() : this("abc") { }

public ClassName(string name) { }

编辑:

Is it like default values of those arguments ?

它是一个重载,您可以将其全部逻辑委托在一个地方,并使用默认值从其余构造函数中调用。

this关键字可以在以下情况下使用:

  • 调用其他构造函数。
  • 将当前对象作为参数传递。
  • 请参阅实例方法或字段。
于 2013-05-31T15:53:24.690 回答