[解決済み] C#のメンバ変数の初期化、ベストプラクティス?
2023-02-02 05:19:05
質問
宣言時にクラスのメンバ変数を初期化した方が良いのでしょうか?
private List<Thing> _things = new List<Thing>();
private int _arb = 99;
それともデフォルトのコンストラクタで?
private List<Thing> _things;
private int _arb;
public TheClass()
{
_things = new List<Thing>();
_arb = 99;
}
それは単にスタイルの問題なのでしょうか、それとも一方にパフォーマンスのトレードオフがあるのでしょうか?
どのように解決するのですか?
フィールドの初期化はコンストラクタのロジックとして実装されます。唯一の違いは、フィールド初期化子はどの "base"/"this" コンストラクタの前でも起こるということです。
コンストラクタのアプローチは、自動実装のプロパティで使用することができます (フィールド初期化機能は使用できません)。
[DefaultValue("")]
public string Foo {get;set;}
public Bar() { // ctor
Foo = "";
}
それ以外の点では、私はフィールド初期化構文を好む傾向があります; その方がローカライズされた状態を保てるからです。
private readonly List<SomeClass> items = new List<SomeClass>();
public List<SomeClass> Items {get {return items;}}
どこに割り当てられているのか、上下に探し回る必要はないのですが...。
明らかな例外は、複雑なロジックを実行したり、コンストラクタのパラメータを処理したりする必要がある場合です。この場合、コンストラクタベースの初期化を行うのが望ましいと言えます。同様に、複数のコンストラクタがある場合、フィールドは常に同じ方法で設定されることが望ましいでしょう。
public Bar() : this("") {}
public Bar(string foo) {Foo = foo;}
edit: 余談ですが、上記の例では、フィールド初期化子を持つ他のフィールド(表示されていません)がある場合、それらは
base(...)
- すなわち
public Bar(string foo)
のコンストラクタです。もうひとつのコンストラクタは
ではなく
によって実行されることを知っているので、フィールド初期化を実行しません。
this(...)
ctorによって行われることを知っているからです。
関連
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み] C#のオートプロパティに初期値を与える最良の方法は何ですか?
-
[解決済み] C#がforeachで変数を再利用するのは理由があるのか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] コンストラクタ内の仮想メンバー呼び出し
-
[解決済み] すべてのサーバーサイドのコードでConfigureAwaitを呼び出すためのベストプラクティス
-
[解決済み] 配列の初期化に関するすべての可能な構文
-
[解決済み】コンストラクタがパラメータを必要とするジェネリック型のインスタンスを作成しますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】「namespace」なのに「type」のように使われる。
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み] クラスフィールドの初期化はコンストラクタで行うか、宣言時に行うか?