Maison  >  Article  >  développement back-end  >  Quel est le problème avec l'accès aux membres virtuels dans les constructeurs en C# ?

Quel est le problème avec l'accès aux membres virtuels dans les constructeurs en C# ?

零下一度
零下一度original
2017-06-24 09:51:101710parcourir

Quel est le problème avec l'accès aux membres virtuels dans les constructeurs en C# ?

Si une propriété virtuelle ou une méthode virtuelle est définie dans une classe et que la propriété ou la méthode virtuelle est accessible dans le constructeur, Visual Studio ne donnera pas d'avertissement et ne compilera pas. Il n'y a pas de problème, mais si le plug-in Resharper est installé, un avertissement sera donné : "Membre virtuel accédé dans le constructeur". Alors, pourquoi est-ce un risque de sécurité ? Voici un exemple :

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

Cet exemple ? est très simple. Une erreur de référence nulle s'est produite lors de la construction de SubClass car le constructeur de la classe de base s'exécute avant le constructeur de la sous-classe et une classe membre est initialisée dans le constructeur de la sous-classe, mais le constructeur de la classe de base n'a pas accès aux membres virtuels. n'a pas encore été construit, donc une erreur de référence nulle se produit. Il existe de nombreuses façons d'éviter cette situation. Vous pouvez construire des classes membres en initialisant les champs de sous-classe. Ce sucre syntaxique peut éviter le problème de timing du constructeur. La deuxième étape consiste à définir une méthode Initialize virtuelle dans le constructeur de sous-classe. pour appeler la sous-classe pour initialiser les dépendances requises lors de l'héritage de cette méthode.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn