クラス内に仮想プロパティや仮想メソッドが定義されており、コンストラクター内で仮想プロパティや仮想メソッドにアクセスした場合、現時点ではVisual Studioは警告を出さず、コンパイルには問題ありませんが、インストールされている場合、Resharper プラグインは「コンストラクターで仮想メンバーがアクセスされています。」という警告を出します。それでは、なぜこれがセキュリティ上のリスクになるのでしょうか。説明するための例を次に示します:
using System; namespace VirtualDemo { class Program { static void Main(string[] args) { var test = new SubClass(); Console.ReadKey(); } } class BaseClass { protected virtual string VirtualProperty { get; set; } public BaseClass() { var p = VirtualProperty; VirtualMethod(); } protected virtual void VirtualMethod() { } } class SubClass : BaseClass { private MockClass _mockClass; public SubClass() { _mockClass = new MockClass(); } protected override string VirtualProperty { get { return _mockClass.MockProperty; } set { _mockClass.MockProperty = value; } } protected override void VirtualMethod() { var p = _mockClass.MockProperty; } } class MockClass { public string MockProperty { get; set; } } }
この例は非常に簡単です。構築時に表示されます SubClass
基本クラス コンストラクターがサブクラス コンストラクターの前に実行され、メンバー クラスがサブクラス コンストラクターで初期化されますが、基本クラス コンストラクターが仮想クラスにアクセスするときにサブクラスがまだ構築されていないため、null 参照エラーが報告されます。メンバーであるため、null 参照エラーが発生します。この状況を回避するには、サブクラス フィールドを初期化することでメンバー クラスを構築できます。この構文により、コンストラクターでのタイミングの問題を回避できます。最初のステップは、サブクラス コンストラクターで仮想 Initialize メソッドを定義することです。このメソッドを継承するときにサブクラスを呼び出して、必要な依存関係を初期化します。
以上がC# のコンストラクターで仮想メンバーにアクセスすると何が問題になりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。