IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Optimisation du code => Avertissement CA2214 [Débutant]


Sujet :

C#

  1. #1
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut Optimisation du code => Avertissement CA2214
    Bonjour @ tous,

    J'ai lancé l'analyse de mon code via VS, et j'ai plusieurs fois le message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Avertissement	CA2214	'tblContact.tblContact(enmFormatFiltre)' contient une chaîne d'appel aboutissant à un appel vers une méthode virtuelle définie par la classe. Vérifiez le parcours de pile suivant et analysez-y toutes les conséquences imprévisibles*: 
    tblContact..ctor(enmFormatFiltre)
    tblContact.set_isCompany(Nullable<Boolean>):Void
    vmBase.OnPropertyChanged(String):Void	Ubrik	...
    J'ai donc été me documenter :
    https://msdn.microsoft.com/fr-fr/library/ms182331.aspx
    Et en fait, j'ai compris que c'est parce que j'affecte des propriétés dans le constructeur d'une classe surchargée.
    Il est vrai que je faisait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public class tblContact : tblModel {
            string _lastName, _firstName;
            bool? _isCompany;
            public string firstName { get { return _firstName; } set { _firstName = value; OnPropertyChanged(nameof(firstName)); } }
            public string lastName { get { return _lastName; } set { _lastName = value; OnPropertyChanged(nameof(lastName)); } }
            public bool? isCompany { get { return _isCompany; } set { _isCompany = value; OnPropertyChanged(nameof(isCompany)); } }
            public ObservableCollection<tblEmail> emails { get; set; }
     
            public tblContact(enmFormatFiltre formatFiltre) : base(formatFiltre) { // Constructeur
                isCompany = false;
                lastName = string.Empty;
                firstName = string.Empty;
                emails = new ObservableCollection<tblEmail>();
            }
    }
    Du coup, si j'ai pu déporter les types simples, comment je peux faire pour les types instanciables ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class tblContact : tblModel {
            string _lastName, _firstName=string.Empty;
            bool? _isCompany = false;
            public string firstName { get { return _firstName; } set { _firstName = value; OnPropertyChanged(nameof(firstName)); } }
            public string lastName { get { return _lastName; } set { _lastName = value; OnPropertyChanged(nameof(lastName)); } }
            public bool? isCompany { get { return _isCompany; } set { _isCompany = value; OnPropertyChanged(nameof(isCompany)); } }
            public ObservableCollection<tblEmail> emails { get; set; }
    
            public tblContact(enmFormatFiltre formatFiltre) : base(formatFiltre) { // Constructeur
                emails = new ObservableCollection<tblEmail>();
            }
    }
    Merci d'avance de vos lumières.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    pour moi il n'y a aucune différence entre tes 2 codes

    à l'exécution, quand tu appelles un constructeur, le constructeur de la classe de base est appelé en 1er
    une fois que c'est fait, les variables avec assignation sont traitées
    puis le code du constructeur
    donc que tu fasses des assignations dans la classe ou dans le constructeur c'est fait au même moment

    un avertissement ne veut pas dire qu'il y a un problème, en plus là il te dit juste de vérifier la pile des appels pour voir si ca te mets en évidence un problème ou pas

    dans le lien ils disent qu'une classe risque ne pas être instanciée au moment ou tu veux accéder à un membre virtual, je pense qu'ils parlent forcément de la classe de base (et ici de onpropertychanged qui doit être sur la classe de base), mais ca me parait étrange vu que j'ai dit que le constructeur de base est forcément appelé en 1er
    à moins que je ne me trompe quelque part dans mon raisonnement donc ... (il vaut donc mieux attendre le 2ème avis ^^)


    sinon pour la réponse à la question, c'est la même méthode que pour un type "non instanciables", il faut une variable privée qui a le new, et une propriété qui pointe vers la variable privée
    je ne sais pas en c#, mais en vb.net on peut écrire le new sur la même ligne que la propriété, la variable privée est implicitement créée à la compilation

  3. #3
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Salut Pol63,

    Merci pour ton avis.
    Oui, en effet, on peut faire un new lors de la déclaration... mais comme tu dis, en fait, mes manips ne changent rien.
    De plus, ca alourdit le code... Si je fait des propriétés privées pour les types simples, c'est parce que je suis obligé pour le OnPropertyChanged.
    Chose qui est inutile pour les tableaux. Ca m'ennuie donc de faire des déclarations privées inutiles.

    Pour l'avertissement, j'ai lu ici (un blog que je conseille fortement pour les dev UWP/WPF) qu'il ne fallait pas le prendre à la légère.
    http://www.e-naxos.com/Blog/post/App...structeur.aspx

    Mais du coup, vu que la classe de base fait partie d'une bibliothèque sur laquelle je n'ai pas la main, je ne sais pas comment faire pour répondre à cet avertissement.

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    merci pour le lien qui explique bien le problème, qui est logique par ailleurs et pas si sournois que ça
    enfin je comprends que ca puisse piéger des débutants, mais quand on travaille avec le polymorphisme et qu'on a déjà fait un peu de pas à pas sur un constructeur dérivé on a atteint un stade de compréhension qui devrait convenir pour voir le problème venir je pense
    et ca ne contredit pas ce que j'ai dit (rassuré ^^)

    le problème se pose quand la classe de base appelle un membre virtual overridé, ca n'a pas l'air d'être ton cas ici, je ne vois rien d'overridé
    et déplacer les initialisations hors du constructeur ne peut pas résoudre ce problème, car ca serait fait après le base.new de toute façon


    (si tu n'as pas saisi l'explication du lien je peux te l'expliciter)

  5. #5
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Oui, je comprends bien ce que tu veux dire.

    Mais en gros, ma façon de faire ne présente pas le cas de figure incohérent, mais je ne peux pas faire en sorte de ne plus avoir l'avertissement.

    C'est un message d'info systématique mais on ne peut pas faire autrement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 08h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo