1. ホーム
  2. c#

クラスには必ずデフォルトのコンストラクタを入れるべき?

2023-07-21 06:39:53

質問

同僚からこんな質問を受けました。「クラスには常にデフォルトのコンストラクタを含めるべきなのでしょうか?もしそうなら、なぜですか?もしそうでないなら、なぜそうしないのでしょうか?

public class Foo {

    Foo() { }

    Foo(int x, int y) {
        ...
    } 

}

私はまた、専門家からこれに関するいくつかのライトを取得することに興味があります。

どのように解決するのですか?

オーバーロードされたコンストラクタを提供しない場合、コンパイラはあなたに代わってデフォルトのコンストラクタを生成することを覚えておく必要があります。つまり、もしあなたがただ

public class Foo
{ 
} 

としてコンパイラが生成します。

public class Foo
{ 
    public Foo() { }  
} 

しかし、他のコンストラクタを追加するとすぐに

public class Foo
{ 
    public Foo(int x, int y)
    { 
        // ... 
    }  
} 

コンパイラはもはやデフォルトコンストラクタを自動的に生成することはありません。もしそのクラスがすでにデフォルトコンストラクタの存在に依存する他のコードで使用されていた場合。 Foo f = new Foo(); の存在に依存している他のコードで既に使用されていた場合、そのコードは現在では壊れてしまいます。

もし誰かがデータを与えずにクラスを初期化できるようにしたくない場合は、デフォルトのコンストラクタを作成する必要があります。 private で、入力データなしでインスタンスが構築されるのを防いでいるという事実を明示します。

しかし、デフォルトのコンストラクタを提供する必要がある場合もあります (パブリックまたはプライベートにかかわらず)。前述したように、シリアライズの種類によってはデフォルトのコンストラクタが必要です。また、クラスが複数のパラメータ化されたコンストラクタを持ち、さらに下位レベルの初期化を必要とする場合もあります。この場合、パラメータ化されたコンストラクタから連鎖したプライベートなデフォルト コンストラクタを使用することができます。

public class Foo
{
   private Foo()
   {
      // do some low level initialization here
   }

   public Foo(int x, int y)
      : this()
   {
      // ...
   }

   public Foo(int x, int y, int z)
      : this()
   {
      // ...
   }
}