.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>
は、配列ではなく a を使用します。
私の考えでは、この理由は、デフォルトのコンストラクターの定義を妨げるほど強力ではありません。