我可以从C#中同一个类的另一个构造函数调用重载的构造函数吗?
答案 0 :(得分:219)
不,你不能这样做,你可以从C#中的另一个构造函数调用构造函数的唯一地方就是在构造函数之后的“:”之后。 例如
class foo
{
public foo(){}
public foo(string s ) { }
public foo (string s1, string s2) : this(s1) {....}
}
答案 1 :(得分:77)
如果你的意思是你可以用C#进行ctor链接,答案是肯定的。已经问过The question。
然而,从评论看来,似乎你真正打算问的是 '我可以通过前/后处理从 另一个构造函数中调用重载的构造函数吗?' 虽然C#没有这样做的语法,但你可以使用一个通用的初始化函数(就像你在C ++中那样不支持ctor链接)。
class A
{
//ctor chaining
public A() : this(0)
{
Console.WriteLine("default ctor");
}
public A(int i)
{
Init(i);
}
// what you want
public A(string s)
{
Console.WriteLine("string ctor overload" );
Console.WriteLine("pre-processing" );
Init(Int32.Parse(s));
Console.WriteLine("post-processing" );
}
private void Init(int i)
{
Console.WriteLine("int ctor {0}", i);
}
}
答案 2 :(得分:37)
简答:是的,使用this
关键字。
答案很长:是的,使用this
关键字,这是一个例子。
class MyClass
{
private object someData;
public MyClass(object data)
{
this.someData = data;
}
public MyClass() : this(new object())
{
// Calls the previous constructor with a new object,
// setting someData to that object
}
}
答案 3 :(得分:4)
在C#中,无法从方法体内调用另一个构造函数。 你可以用这种方式调用一个基础构造函数:foo(args):base()如你自己所指出的那样。 您还可以在同一个类中调用另一个构造函数:foo(args):this()。
当你想在调用基础构造函数之前做某事时,基类的构造似乎依赖于某些外部事物。如果是这样,你应该通过基础构造函数的参数,而不是通过设置基类的属性或类似的东西