web-dev-qa-db-ja.com

C#で同じクラスの別のコンストラクターからオーバーロードされたコンストラクターを呼び出すことはできますか?

C#で同じクラスの別のコンストラクターからオーバーロードされたコンストラクターを呼び出すことはできますか?

190
Malay

いいえ、できません。C#の別のコンストラクターからコンストラクターを呼び出すことができる唯一の場所は、コンストラクターの後の「:」の直後です。例えば

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

}
222
mfawzymkh

C#でctor chainingを実行できるのであれば、答えはイエスです。 質問 はすでに質問されています。

しかし、それはコメントから思われます、あなたが本当に求めているのは、「withinオーバーロードされたコンストラクターをプリ/ポスト処理で呼び出すことができます」 ?」
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);
   }
}
80
Gishu

編集:元の投稿のコメントによると、これは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
   }
}
37
Ari Roth

C#では、メソッド本体内から別のコンストラクターを呼び出すことはできません。この方法でベースコンストラクターを呼び出すことができます:自分で指摘したfoo(args):base()。同じクラスの別のコンストラクターfoo(args):this()を呼び出すこともできます。

ベースコンストラクターを呼び出す前に何かを実行したい場合、ベースの構築はクラスがいくつかの外部のものに依存しているようです。その場合、基本クラスまたはそのようなもののプロパティを設定するのではなく、基本コンストラクタの引数を使用する必要があります

4
JaapM