为什么无法访问另一个构造函数体内的构造函数?

问题描述 投票:0回答:6

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

public Rectangle(int size) : this(size, size)
{
    Console.WriteLine("Square Constructor Called");
    //this(size,size); i want to access like this 
}
c# constructor
6个回答
7
投票

你不能那样做。完整的理由是here,但总而言之:

简而言之,在不添加[在任意位置调用基本构造函数的能力]的情况下,实现所需的构造控制流程很容易,并且添加该功能没有任何引人注目的好处。该语言没有添加新的有趣的表征能力。


4
投票

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

通常,想要链接到多个构造函数的解决方案是拥有一个“主”构造函数,所有其他构造函数最终都链接到该构造函数,并且它可以完成您想要的一切。


4
投票

嗯,有点。如果你让它看起来像这样:

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

2
投票

不,您无法通过这种方式访问它。请参阅this了解更多详情。


1
投票

我会说“不幸的是不是”,但它在设计上不可用。如果您不能或不想使用给定的语法,您唯一的其他选择是创建一个额外的方法来填充您所寻求的构造函数。


0
投票

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

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

现在,假设我们决定让

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

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

© www.soinside.com 2019 - 2024. All rights reserved.