[解決済み] コンストラクタ内の仮想メンバー呼び出し
2022-03-19 07:08:45
質問
オブジェクトのコンストラクタから仮想メンバを呼び出すと、ReSharperから警告が表示されるのですが。
なぜ、このようなことをしてはいけないのでしょうか?
どのように解決するのか?
C#で書かれたオブジェクトを構築する場合、初期化子は派生クラスから基底クラスの順に実行され、コンストラクタは基底クラスから派生クラスの順に実行されます ( この理由については、Eric Lippertのブログを参照してください。 ).
また、.NETでは、オブジェクトは構築される際に型が変わるのではなく、最初に最も派生した型として始まり、メソッドテーブルも最も派生した型に対応したものとなっています。つまり、仮想メソッドの呼び出しは常に最上位の派生型上で実行されます。
この2つの事実を組み合わせると、コンストラクタで仮想メソッドを呼び出したときに、そのクラスが継承階層の最上位にない場合、コンストラクタが実行されていないクラスで呼び出されることになり、そのメソッドを呼び出すのに適した状態でない可能性があるという問題が残ります。
もちろんこの問題は、クラスをsealedにして継承階層の最上位の派生型であることを確認すれば軽減されますし、その場合は仮想メソッドを呼び出してもまったく問題ありません。
関連
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み] 関数を終了するには?
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] 抽象メソッドと仮想メソッドの違いは何ですか?
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み] あるコンストラクタを別のコンストラクタから呼び出す
-
[解決済み] コンストラクタのシグネチャを定義するインターフェース?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C#で四捨五入する方法
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない