コード検査: コンストラクター内の仮想メンバーコール
Eric Lippert がこの投稿で説明しているように、基本型初期化子は派生型初期化子の後に実行されますが、コンストラクターは逆の順序で実行されます。つまり、派生型のコンストラクターは基本型のコンストラクターの後に呼び出されます。一方、仮想メソッドの呼び出しは、常に最も派生した型で実行されます。
つまり、基本型のコンストラクターから仮想メンバーを呼び出す場合、派生型のコンストラクターが呼び出される前に、派生型のこの仮想メンバーのオーバーライドがそれぞれ実行されます。
想像しているように、派生型のオーバーライドでメンバーが使用されていると、混乱とエラーが発生する可能性があります。
コンストラクター内の仮想呼び出しは、派生型が基本型の何らかの側面を設定できるようにすることを目的としていることがよくあります。このような仮想メソッドは、実際には、ある値を返し、派生した型の状態に依存しない純粋な関数でなければなりません。これが当てはまる場合は、そのような関数を静的にして(純粋なので)、その戻り値を protected コンストラクターのパラメーターとして基本型に渡します。
関連ページ:
コードインスペクション設定を構成する
設計時コードインスペクションを構成する:デフォルトでは、ReSharper は、サポートされている言語に対応するすべてのファイルで設計時コードインスペクションを有効にします。必要に応じて、無効にすることができます。設計時コードインスペクションが有効かどうかに関係なく、コードインスペクションは常に特定のスコープで実行できます。メインメニューからを選択するか、Alt+R O を押してから、左側のを選択します。設計時コードインスペクションを切り替えるには、コード分析を有効にするチェックボックスを使用し...
コード検査: 文字列補間式を使用する
C# 6.0 以降では、を呼び出す代わりに、文字列補間式を使用できます。メソッドに多くの引数を渡すと、文字列が理解しにくくなります。と比較すると、補間された文字列式では、変数を文字列に直接挿入できます。var greeting = string.Format("Hi {0}! How do you feel at {1}?", name, location);var greeting = $"Hi {name}! How do you feel at {location}?"; 最終更新日: 20...