8

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

公共ApplePushService(IPushChannelFactory pushChannelFactory,ApplePushChannel设置channelSettings):this(pushChannelFactory,channelSettings,默认值(IPushServiceSettings))

这和那些参数的默认值一样吗?

2

3个答案

重置为默认值
9

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

例如

//设置arg2的默认值,而无需调用该构造函数公共类A(int arg1):this(arg1,1){}公共类A(int arg1,int arg2){}

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

2
  • 这样做比使用可选参数有什么好处吗?
    – 用户2032433
    评论 2013年5月31日16:37
  • 2
    @该语言并不总是支持MarkusMeskanen可选参数,这也允许您使用不同的顺序或省略其中的参数。此外,您可以很容易地使用它来扩展构造函数(例如,在上面的示例中,双参数构造函数也可以调用此(arg1)然后对第二个参数执行特殊操作)。
    – 
    评论 2013年5月31日16:44
9

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

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

公共Foo(int x){//此处可能使用x}

等于

公共Foo(int x):base(){//此处可能使用x}

请注意,执行了实例变量初始值设定项之前调用另一个构造函数。

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

公共类已损坏{public Broken():this(“哎哟”){}public Broken(字符串错误):this(){}}

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

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

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

例如:

public ClassName():this(“abc”){}public ClassName(字符串名){}

编辑:

这和那些参数的默认值一样吗?

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

关键字可以在以下上下文中使用:

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

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.