我可以调用重载构造函数从另一个构造函数的同类在c# ?


当前回答

不,你不能这样做,在c#中唯一可以从另一个构造函数调用构造函数的地方是紧挨着构造函数后面的":"。 例如

class foo
{
    public foo(){}
    public foo(string s ) { }
    public foo (string s1, string s2) : this(s1) {....}

}

其他回答

编辑:根据原文的评论,这是一个c#问题。

简单的回答:是的,使用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
   }
}

不,你不能这样做,在c#中唯一可以从另一个构造函数调用构造函数的地方是紧挨着构造函数后面的":"。 例如

class foo
{
    public foo(){}
    public foo(string s ) { }
    public foo (string s1, string s2) : this(s1) {....}

}

在c#中,不可能从方法体内部调用另一个构造函数。 你可以这样调用基类构造函数:foo(args):base(),正如你自己指出的那样。 你也可以在同一个类中调用另一个构造函数:foo(args):this()。

当你想在调用基类构造函数之前做一些事情时,基类is的构造似乎依赖于一些外部的东西。如果是这样,你应该通过基构造函数的参数,而不是通过设置基类的属性或类似的东西

如果你的意思是你是否可以在c#中做ctor链接,答案是肯定的。这个问题已经被问过了。

然而,从评论来看,似乎你真正想问的是 我可以调用重载构造函数从另一个构造函数与前/后处理? 虽然c#没有这样做的语法,但你可以用一个通用的初始化函数来做到这一点(就像你在不支持ctor链接的c++中所做的那样)

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);
   }
}