1

C# では、空のクラスを作成するとデフォルトのコンストラクターが提供されますが、コンストラクターにパラメーターを指定すると、デフォルトのコンストラクターは作成されなくなります。

私の質問は次のとおりです。

  1. コンパイラがデフォルトのコンストラクタも提供しなくなったのはなぜですか?
  2. このデフォルトのコンストラクタが常に生成されるように設定はありますか?

これらの質問は、デフォルトのコンストラクターが必要であるが、コンストラクターに値を提供できるようにしたいという WCF での作業から生じました。毎回デフォルトのコンストラクターを配置する必要がなく、使用されていないデフォルトのコンストラクターは考えられません。多くのオーバーヘッドが発生します。

4

5 に答える 5

2

(通常) カスタム コンストラクターを持つということは、オブジェクトの内部状態が、コンストラクター パラメーターを介して提供するカスタム情報で初期化されることを意味します。そのような場合にデフォルトのコンストラクターがまだある場合、初期状態はどうなるでしょうか?

カスタム コンストラクターがない場合は、初期化する内部状態がないため、既定のコンストラクターを使用するだけで問題ないと見なされます。

于 2013-04-22T00:40:16.923 に答える
0

デフォルトのコンストラクターは、まあ...デフォルトで存在します。ただし、独自のパラメーター化されたコンストラクターを作成すると、コンパイラーはそのコンストラクターを使用する必要があると見なし、デフォルトのコンストラクターを発行しなくなります。

WCF で使用する既定値が必要な場合は、それを指定する必要があります。その中で、必要に応じて、パラメーター化されたコンストラクターをいくつかのデフォルト値で呼び出すことができます。

于 2013-04-22T00:39:30.630 に答える
0

そのための設定はありません。

場合によっては、既定のコンストラクターは、データを指定するという契約を強制する方法です。

于 2013-04-22T00:36:00.350 に答える
0

C++、C♯、Java、およびそれらの派生言語では、オブジェクトが初期化され、一貫した状態にあることを確認する必要があるため、カスタム コンストラクターを記述します。コンパイラには、オブジェクトを初期化する方法を推測する方法がないため、試行さえしません。クラスのデフォルト コンストラクターとカスタム コンストラクターの両方を使用する方法は多数あります。

Java には、相互に参照するコンストラクターがあります。

public Name(String givenName, String middleName, String surName) {...}
public Name(String givenName, String surName) {
    this(givenName, null, surname);
}

C++11 では、同じことを行う委譲コンストラクターが導入されました。C++ には常にデフォルトの引数があり、これも同じことを行うことができます。C♯ にはデフォルトの引数しかないようです。

他の言語では慣例が使用されます。Objective-C では、プログラマーは指定された初期化子に関してすべての初期化子を記述します。

要するに、それを行う方法は常にありますが、手動でプログラムする必要があります。自動スキームは存在しません。

于 2013-04-22T00:54:50.400 に答える
0

クラスにコンストラクター定義を指定しなかった場合、コンパイラーはデフォルトのコンストラクターのみを作成します。その理由は次のとおりです。オブジェクトのインスタンスを作成する必要がある場合、コンストラクターを呼び出す必要があるため、コーダーによってコンストラクターが定義されていない場合、コンパイラーはコンストラクターを追加して機能させます。

ただし、コンストラクターを 1 つ定義すると、ユーザーがコンストラクターの必要性を認識したことがコンパイラーに伝えられるため、デフォルトのコンストラクターは自動的に追加されません。独自のデフォルト コンストラクターを手動で挿入する必要があります。この設定はないと思います。

于 2013-04-22T00:56:18.710 に答える