Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist falsch am Zugriff auf virtuelle Mitglieder in Konstruktoren in C#?

Was ist falsch am Zugriff auf virtuelle Mitglieder in Konstruktoren in C#?

零下一度
零下一度Original
2017-06-24 09:51:101698Durchsuche

Was ist falsch am Zugriff auf virtuelle Mitglieder in Konstruktoren in C#?

Wenn eine virtuelle Eigenschaft oder virtuelle Methode in einer Klasse definiert ist und im Konstruktor auf die virtuelle Eigenschaft oder Methode zugegriffen wird, gibt Visual Studio keine Warnung aus und kompiliert kein Problem. aber wenn das Resharper-Plug-in installiert ist, wird eine Warnung ausgegeben: „Auf virtuelles Mitglied im Konstruktor zugegriffen“. Hier ist ein Beispiel:

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; }
    }
}

Dieses Beispiel Das ist sehr einfach. Beim Erstellen von SubClass ist ein Nullreferenzfehler aufgetreten, da der Basisklassenkonstruktor vor dem Unterklassenkonstruktor ausgeführt wird und eine Mitgliedsklasse im Unterklassenkonstruktor initialisiert wird, der Basisklassenkonstruktor jedoch nicht noch nicht erstellt wurde, daher tritt ein Nullreferenzfehler auf. Es gibt viele Möglichkeiten, diese Situation zu vermeiden, indem Sie Unterklassenfelder initialisieren. Der zweite Schritt besteht darin, eine virtuelle Initialisierungsmethode zu definieren Rufen Sie die Unterklasse an, um die erforderlichen Abhängigkeiten bei der Erben dieser Methode zu initialisieren.

Das obige ist der detaillierte Inhalt vonWas ist falsch am Zugriff auf virtuelle Mitglieder in Konstruktoren in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn