C#调用另一个构造函数
我需要调用另一个构造函数的构造函数,该怎么做?
基本上
class foo { public foo (int x, int y) { } public foo (string s) { // ... do something // call another constructor this (x, y); // doesn't work foo (x, y); // neither } }
你不能。
你必须find一种方法来链接构造函数,如下所示:
public foo (int x, int y) { } public foo (string s) : this(XFromString(s), YFromString(s)) { ... }
或者将您的施工代码移动到一个通用的设置方法中,如下所示:
public foo (int x, int y) { Setup(x, y); } public foo (string s) { // do stuff int x = XFromString(s); int y = YFromString(s); Setup(x, y); } public void Setup(int x, int y) { ... }
this(x, y)
是正确的,但它必须在构造函数体的开始之前:
public Foo(int x, int y) { ... } public Foo(string s) : this(5, 10) { }
注意:
- 你只能链接到一个构造函数,无论
this
还是base
– 当然,构造函数可以链接到另一个构造函数。 - 在构造函数体中执行任何代码后,您不能链接到构造函数。
- 你不能在其他构造函数的参数中使用
this
,包括调用实例方法 – 但你可以调用静态方法。 - 在链接调用之前执行任何实例variables初始值设定项。
我在关于构造函数链的文章中有更多的信息。
为了明确地调用base和这个类的构造函数,你需要使用下面给出的语法(注意,在C#中,你不能用它来初始化C ++中的字段):
class foo { public foo (int x, int y) { } public foo (string s) : this(5, 6) { // ... do something } }
//编辑:注意到,你已经在你的示例中使用了x,y。 当然,以这种方式调用ctor时给出的值不能依赖于其他构造函数的参数,它们必须以其他方式解决(尽pipe如上面的编辑代码样例,它们不需要是常量)。 如果x
和y
是从s
计算出来s
,你可以这样做:
public foo(string s):this(GetX(s),GetY(s))
这不支持 – 请参阅http://www.yoda.arachsys.com/csharp/constructors.html 。
你可以做的是实现一个通用(私有)方法,你从不同的构造函数调用…
我自己遇到这个问题一两次自己…我最终不得不做的是将我需要在其他构造函数中的任何逻辑提取到一个private void
方法,并在两个地方调用它。
class foo { private void Initialize(int x, int y) { //... do stuff } public foo(int x, int y) { Initialize(x, y); } public foo(string s_ { // ... do stuff Initialize(x, y) // ... more stuff } }