在构造函数的参数之后的this语句

this statement after contructor's arguments

本问题已经有最佳答案,请猛点这里访问。

我在尝试用APN构建东西时看到了这个代码块。有人能给我解释一下"这个"陈述是什么意思吗?

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

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


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

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

1
2
3
4
public Foo(int x)
{
    // Presumably use x here
}

等于

1
2
3
4
public Foo(int x) : base()
{
    // Presumably use x here
}

请注意,实例变量初始值设定项是在调用其他构造函数之前执行的。

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

1
2
3
4
5
6
7
8
9
10
public class Broken
{
    public Broken() : this("Whoops")
    {
    }

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

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

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


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

例如

1
2
3
4
5
6
7
8
// 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)
{
}

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


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

例如:

1
2
3
public ClassName() : this("abc") { }

public ClassName(string name) { }

编辑:

Is it like default values of those arguments ?

它是一个重载,您可以在一个地方委托它的完整逻辑,并使用默认值从其他构造函数调用。

这些上下文中可以使用this关键字:

  • 调用其他构造函数。
  • 将当前对象作为参数传递。
  • 请参阅实例方法或字段。