2013-05-31 65 views
8

我看到这个代码块,当我试图用APN构建东西。有人能解释一下,“这个”陈述在那里做什么?构造函数的参数后的这个声明

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

它是否像这些参数的默认值?

+0

@dasblinkenlight虽然它的相关,这不是这个问题重复只要意图。 – nawfal

+0

另请参阅http://stackoverflow.com/questions/3797528/base-and-this-constructors-best-practices – nawfal

回答

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) 
{ 
} 

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

+0

这样做有没有任何好处,而不是有可选参数? – 2013-05-31 16:37:20

+2

@MarkusMeskanen语言不总是支持可选参数,这也允许您在两者之间有不同的顺序或省略参数。你也可以很容易地使用它来扩展构造函数(例如在上面的例子中,双参数构造函数也可以调用this(arg1),然后为第二个参数做一些特殊的处理)。 – poke

+0

@poke很酷,谢谢! :) – 2013-05-31 19:44:54

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() 
    { 
    } 
} 

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

有关详细信息,请参阅my article on constructor chaining

3

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

例如:

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

public ClassName(string name) { } 

编辑:

Is it like default values of those arguments ?

它的过载,你可以委托它的全部逻辑在一个地方,从构造的其余部分与调用默认值。

this关键字可以在这些环境中使用:

  • 呼叫其他构造。
  • 将当前对象作为参数传递。
  • 请参阅实例方法或字段。
相关问题