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

零下一度
Libérer: 2017-06-24 09:51:10
original
1709 Les gens l'ont consulté

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; }
    }
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal