クラスには必ずデフォルトのコンストラクタを入れるべき?
質問
同僚からこんな質問を受けました。「クラスには常にデフォルトのコンストラクタを含めるべきなのでしょうか?もしそうなら、なぜですか?もしそうでないなら、なぜそうしないのでしょうか?
例
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()
{
// ...
}
}
関連
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み] usingディレクティブはネームスペースの内側と外側のどちらを使うべきですか?
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] 特定のプロパティに対するLINQのDistinct()
-
[解決済み] コンストラクタのシグネチャを定義するインターフェース?
-
[解決済み] C# "internal "アクセス修飾子でユニットテストを行う場合
-
[解決済み】.NETで構造体のデフォルトコンストラクタを定義できないのはなぜですか?
-
[解決済み】デフォルトのコンストラクタとデストラクタの「=default」は「{}」とどう違うのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】Nullableオブジェクトは値を持たなければならない?