C# でのメンバー変数の初期化: 宣言またはコンストラクター?
C# を使用したオブジェクト指向プログラミングでよくある質問は、クラス メンバー変数を宣言時に初期化する必要があるか、それともデフォルトのコンストラクターで初期化する必要があるかということです。この記事では、両方のアプローチの長所と短所を検討します。
パフォーマンスに関する考慮事項
パフォーマンスの点では、宣言時にメンバー変数を初期化する場合とコンストラクター内で初期化する場合にほとんど違いはありません。フィールド初期化子は、実際にはコンパイル中にコンストラクター ロジックに変換されます。ただし、フィールド初期化子は、基本コンストラクターまたはこのコンストラクターの実行を含む、コンストラクター ロジックの前に実行されます。
自動実装プロパティ
自動実装プロパティの場合は、フィールド初期化子を使用して初期化できないため、コンストラクターのアプローチが推奨されます。例:
<code class="language-csharp">[DefaultValue("")] public string Foo { get; set; } public Bar() { Foo = ""; }</code>
地域と組織
多くの開発者は、関連コードをローカライズしておくため、フィールド初期化子を好みます。たとえば、フィールド初期化子を使用して項目のプライベート リストを宣言すると、リストとそのアクセサー プロパティがより独立したものになります。
<code class="language-csharp">private readonly List<SomeClass> items = new List<SomeClass>(); public List<SomeClass> Items { get { return items; } }</code>このアプローチにより、メンバー変数に値が割り当てられている場所を見つけるために複数のコードセグメントを検索する必要性が軽減されます。
複雑な初期化とコンストラクターのオーバーロード
ただし、複雑な初期化ロジックが必要な場合、または複数のコンストラクターを処理する場合は、コンストラクターが推奨される方法です。たとえば、Bar クラスを初期化するときは、次のコンストラクターを考慮してください:
<code class="language-csharp">public Bar() : this("") {} public Bar(string foo) { Foo = foo; }</code>この場合、フィールド Foo は呼び出されるコンストラクターに応じて異なる値に初期化できますが、フィールド初期化子はすべてのコンストラクターに対して同じ値を設定します。
結論
メンバー変数を宣言時に初期化するか、コンストラクター内で初期化するかは、最終的にはコードの特定のニーズによって異なります。単純さと局所性を考慮すると、通常はフィールド初期化子が推奨されます。ただし、自動的に実装されるプロパティ、複雑な初期化ロジック、または複数のコンストラクターを処理する場合は、コンストラクター ベースの初期化をお勧めします。以上がC# でのメンバー変数の初期化: 宣言とコンストラクター – どちらが良いですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。