2010-10-18 16 views
8

Ho il codice seguente:Code Analysis Warning 2214 - Come si può risolvere il problema?

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

Questo sta generando un avvertimento CA2214. I parametri del metodo BusinessEntityType e AuditLogCommand sono entrambi enumerazioni. Non vedo quale sia il problema qui, e quindi non sono sicuro di come soddisfare l'avvertimento.

Grazie.

risposta

14

Una o più proprietà sono virtuali? Ecco perché, dal momento che l'avviso CA2214 is the "Do not call overridable methods in constructors".

Ecco la motivazione per la regola da MSDN:

Quando un metodo virtuale viene chiamato, il tipo effettivo che esegue il metodo viene selezionata solo tempo di esecuzione. Quando un costruttore di chiama un metodo virtuale, è possibile che il costruttore per l'istanza che richiama il metodo non sia stato eseguito.

Ciò significa è che se qualcuno eredita dalla classe, e sostituisce un metodo o una proprietà che è accessibile in tuo costruttore - quindi l'attuazione prioritario sarà colpito prima che il costruttore della classe ereditata ha correre. Ciò potrebbe causare problemi se l'implementazione sovrascrivente si basa sullo stato impostato nel costruttore.

Per soddisfare l'avviso, è necessario rendere le proprietà e i metodi accessibili nel costruttore non virtuali (è possibile rendere il tipo sigillato, se appropriato).

+0

Come risulta la linea "this.Entity" ha un setter che chiama un metodo virtuale. Immagino che fosse il problema. –

+0

Sì, l'avviso si attiva se l'analizzatore statico può vedere che ogni metodo virtuale viene chiamato durante il ctor. – driis

Problemi correlati