struct
今日、大量のデータを保持するために を作成しているときに、この問題に遭遇しました。次に例を示します。
public struct ExampleStruct
{
public int Value { get; private set; }
public ExampleStruct(int value = 1)
: this()
{
Value = value;
}
}
元気でダンディに見えます。問題は、値を指定せずにこのコンストラクターを使用しようとし、パラメーターにデフォルト値の 1 を使用したい場合です。
private static void Main(string[] args)
{
ExampleStruct example1 = new ExampleStruct();
Console.WriteLine(example1.Value);
}
このコードは を出力し、出力0
しません1
。その理由は、すべての構造体にパラメーターのないパブリック コンストラクターがあるためです。したがって、 でthis()
明示的なコンストラクターを呼び出す方法と同様に、が実際に呼び出しているが呼び出していないMain
場所でも同じことが起こります。そのため、のデフォルト値 0 を として使用します。new ExampleStruct()
ExampleStruct()
ExampleStruct(int value = 1)
int
Value
さらに悪いことに、私の実際のコードは、int value = 1
パラメーターがコンストラクター内の有効な範囲内にあるかどうかを確認しています。ExampleStruct(int value = 1)
これを上記のコンストラクターに追加します。
if(value < 1 || value > 3)
{
throw new ArgumentException("Value is out of range");
}
したがって、現状では、デフォルトのコンストラクターは、必要なコンテキストでは無効なオブジェクトを実際に作成しました。誰でも私ができる方法を知っています:
- A.
ExampleStruct(int value = 1)
コンストラクターを呼び出します。 - B.
ExampleStruct()
コンストラクターのデフォルト値の設定方法を変更します。 - C. その他の提案/オプション。
また、Value
プロパティの代わりに次のようなフィールドを使用できることも承知しています。
public readonly int Value;
const
しかし、私の哲学は、フィールドがまたはでない限り、非公開で使用することstatic
です。
最後に、a のstruct
代わりに aを使用している理由class
は、これは変更不可能なデータを保持するための単なるオブジェクトであり、構築時に完全に入力する必要があり、パラメーターとして渡されたときにデータを入力できないようにする必要があるためですnull
( )として値によって渡されますstruct
。これは、構造体が設計されているものです。