为什么不能在另一个构造函数的体中访问构造函数?

时间:2010-08-06 13:02:54

标签: c# constructor

我知道我可以在另一个构造函数上访问构造函数,但是有没有办法在构造函数体中访问它?

public Rectangle(int size) : this(size, size)
{
    Console.WriteLine("Square Constructor Called");
    //this(size,size); i want to access like this 
}

6 个答案:

答案 0 :(得分:7)

你做不到。完整的理由是here,但总结如下:

  

简而言之,如果不添加[在任意位置调用基础构造函数的能力],很容易实现所需的构造控制流程,并且添加该功能没有令人信服的好处。没有新的有趣的代表能力被添加到该语言。

答案 1 :(得分:4)

构造函数只能链接一次,基本上 - 必须在构造函数体的主体之前指定。

通常,想要链接到多个构造函数的解决方案是拥有一个“主”构造函数,所有其他构造函数最终都链接到这个构造函数,并且它会执行您想要的所有内容。

答案 2 :(得分:4)

好吧,有点儿。如果你看起来像这样:

public Rectangle(int w, int h) {
    Initialize(w, h);
}
public Rectangle(int size) {
    Console.WriteLine("blah");
    Initialize(size, size);
}
private void Initialize(...) {...}

答案 3 :(得分:2)

不,你不能这样访问它。有关详细信息,请参阅this

答案 4 :(得分:1)

我会说“不幸的是不是”,但它不适用于设计。如果您不能或不想使用给定的语法,那么您唯一的另一个选择是为您寻找的构造函数创建一个完整的附加方法。

答案 5 :(得分:0)

:this(foo, bar)是语法糖,没有什么可以用它做你不能做的其他方法。但是,:base(foo, bar)不是语法糖,因为它是在构造派生类期间调用有问题的构造函数的唯一方法,特别是考虑到你必须首先有一个完全构造的基类,它满足定义的任何不变量在该类中(例如,如果只有foo的某些值对某些bar有效,那么它会在您继续前进之前抛出异常)。

:base(foo, bar)的工作方式使类能够使用封装来确保它们永远不会进入无效状态,同时仍允许继承,this(foo, bar)只需复制相同的机制,以方便程序员使用当有多个构造函数使用的公共代码时。

现在,让我们说我们决定从任何地方调用:this(foo, bar)。它本质上是一个方法调用。好吧,无论如何我们已经可以在类构造函数中做到这一点。我们已经失去了与:base(foo, bar)的句法相似性(并且考虑到有些人已经熟悉了C ++,这降低了他们的学习曲线),并且只是添加了一种威胁构造函数的方法,如返回void的方法,增加检查它的复杂性是在构造函数的主体中(并且必须处理人们问为什么它现在看起来应该是可能的时候不能在别处调用它,或者让它完成的奇怪之处),当人们无论如何都可以创造这样的方法时。

总之,我认为这是一个很好的设计决定。