2010-10-18 103 views
8

我有以下代碼:代碼分析警告2214 - 如何解決問題?

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

這產生CA2214警告。 BusinessEntityTypeAuditLogCommand方法參數都是枚舉。我不知道這裏有什麼問題,因此我不確定如何滿足警告。

謝謝。

回答

14

是您的一個或多個屬性爲虛擬嗎?那麼這是爲什麼,因爲CA2214 is the "Do not call overridable methods in constructors"警告。

下面是從MSDN該規則的推理:

當虛擬方法被調用時,執行該方法的 實際 類型沒有被選擇,直到運行時間。當構造函數調用虛擬方法時, 可能調用方法 的實例的構造函數尚未執行。

這是什麼意味着是,如果有人從你的類繼承,並覆蓋了在構造訪問的方法或屬性 - 然後壓倒一切的實現將在構造函數之前被擊中的繼承類有跑。這可能會導致問題,如果重寫的實現依賴於構造函數中設置的狀態。

爲了滿足警告,您需要使構造函數中訪問的屬性和方法非虛擬化(如果適用,可以將該類型封閉)。

+0

事實證明'this.Entity'這一行有一個調用虛擬方法的setter。我想這是問題。 – 2010-10-18 21:08:51

+0

是的,如果靜態分析儀可以看到在ctor期間調用任何虛擬方法,則警告將觸發。 – driis 2010-10-19 07:08:58