.NETでは、値の型(C#struct
)にパラメーターのないコンストラクターを含めることはできません。この投稿によると、これはCLI仕様で義務付けられています。すべての値タイプに対して、デフォルトのコンストラクターが(コンパイラーによって)作成され、すべてのメンバーがゼロ(またはnull
)に初期化されます。
なぜそのようなデフォルトのコンストラクタを定義することができないのですか?
簡単な使い方の1つは有理数です。
public struct Rational {
private long numerator;
private long denominator;
public Rational(long num, long denom)
{ /* Todo: Find GCD etc. */ }
public Rational(long num)
{
numerator = num;
denominator = 1;
}
public Rational() // This is not allowed
{
numerator = 0;
denominator = 1;
}
}
現在のバージョンのC#を使用すると、デフォルトのRationalは0/0
それほどクールではありません。
PS:デフォルトのパラメーターはC#4.0でこれを解決するのに役立ちますか、それともCLRで定義されたデフォルトのコンストラクターが呼び出されますか?
ジョン・スキートは答えました:
あなたの例を使用するには、誰かがしたときに何をしたいですか:
Rational[] fractions = new Rational[1000];
コンストラクタを1000回実行する必要がありますか?
もちろん、そうすべきです。そもそも、デフォルトのコンストラクタを最初に作成した理由です。明示的なデフォルトコンストラクターが定義されていない場合、CLRはデフォルトのゼロ化コンストラクターを使用する必要があります。そうすれば、使用した分だけ支払うことができます。次に、デフォルト以外の1000個のコンテナーが必要な場合Rational
(および1000の構造を最適化したいList<Rational>
場合)、配列ではなくを使用します。
私の考えでは、この理由は、デフォルトのコンストラクターの定義を妨げるほど強力ではありません。
Rational()
は、でなくパラメータなしのctorを呼び出すため、役に立ちませんRational(long num=0, long denom=1)
。
new Rational()
、存在する場合はコンストラクタを呼び出しますが、存在しない場合new Rational()
はと同等になりdefault(Rational)
ます。いずれの場合でもdefault(Rational)
、構造体の「ゼロ値」が必要なときに構文を使用することをお勧めします(これは、の設計で「悪い」数値ですRational
)。値タイプのデフォルト値T
は常にdefault(T)
です。したがって、new Rational[1000]
structコンストラクターを呼び出すことはありません。
denominator - 1
は、構造体内に保存して、デフォルト値が0/1になるようにします
Then if I want a container of 1000 non-default Rationals (and want to optimize away the 1000 constructions) I will use a List<Rational> rather than an array.
配列が構造体のリストに対して別のコンストラクターを呼び出すことを期待するのはなぜですか?