2010-10-18 8 views
8

J'ai le code suivant:Code Analyse Avertissement 2214 - Comment corriger au mieux?

public partial class AuditLog : IBusinessEntity 
    { 
     public BusinessEntityType EntityType { get { return BusinessEntityType.AuditLog; } } 

     /// <summary> 
     /// Constructor accepting parameter initialization arguments 
     /// </summary> 
     /// <param name="userName"></param> 
     /// <param name="entity"></param> 
     /// <param name="command"></param> 
     /// <param name="commandText"></param> 
     public AuditLog(string userName, BusinessEntityType entity, AuditLogCommand command, string commandText) 
     { 
      this.Timestamp = DateTime.Now; 
      this.UserName = userName; 
      this.Entity = entity.ToString(); 
      this.Command = command.ToString(); 
      this.CommandText = commandText; 
     } 
    } 

Ce génère un avertissement de CA2214. Les paramètres de méthode BusinessEntityType et AuditLogCommand sont les deux énumérations. Je ne vois pas quelle est la question ici, et je ne suis donc pas sûr de savoir comment satisfaire l'avertissement.

Merci.

Répondre

14

Une ou plusieurs de vos propriétés sont-elles virtuelles? Alors c'est pourquoi, depuis CA2214 is the "Do not call overridable methods in constructors" avertissement.

Voici le raisonnement de la règle de MSDN:

Lorsqu'une méthode virtuelle est appelée, le type réel qui exécute la méthode n'est pas sélectionnée jusqu'à l'heure de l'exécution. Lorsqu'un constructeur appelle une méthode virtuelle, il est possible que le constructeur pour l'instance qui appelle la méthode n'a pas exécuté.

Qu'est-ce signifie est que si quelqu'un hérite de votre classe, et remplace une méthode ou une propriété qui est accessible dans votre constructeur - puis la mise en œuvre prioritaire sera frappé avant que le constructeur de la classe héritée a courir. Cela peut entraîner des problèmes si l'implémentation prioritaire repose sur l'état défini dans le constructeur.

Pour satisfaire l'avertissement, vous devez rendre les propriétés et les méthodes accessibles dans le constructeur non virtuelles (vous pouvez rendre le type scellé, si approprié).

+0

Il s'avère que la ligne 'this.Entity' a un setter qui appelle une méthode virtuelle. Je suppose que c'était le problème. –

+0

Oui, l'avertissement se déclenche si l'analyseur statique peut voir, que toute méthode virtuelle est appelée pendant le ctor. – driis

Questions connexes