C# のコンストラクターで仮想メンバーにアクセスすると何が問題になりますか?

零下一度
リリース: 2017-06-24 09:51:10
オリジナル
1710 人が閲覧しました

C# のコンストラクターで仮想メンバーにアクセスすると何が問題になりますか?

クラス内に仮想プロパティや仮想メソッドが定義されており、コンストラクター内で仮想プロパティや仮想メソッドにアクセスした場合、現時点では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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート