2014-03-12 30 views
7

在我們的代碼庫變量R#,我們有自定義錯誤的電池檢測功能(像那些列出here)檢查參數少冗長。例如,要檢查空的參數使用:如何以指示功能檢查空

Throw.IfNull(theArgument, "theArgument"); 

這種方法的一個缺點是,R·給出值的未來用途的警告「可能的NullReferenceException」,因爲它沒有足夠的智慧來檢測這種作爲一個空檢查(或者至少會失敗,如果參數爲空)。有什麼方法可以表明這個方法檢查參數是否爲空?例如,當我嘗試在這樣一個值上運行一個像Select()這樣的靜態擴展時,R#會警告我'可能爲具有NotNull屬性標記的實體分配空值',但是我找不到這樣的屬性的任何文檔,也沒有我在Enumerable.Select()的參考源中看到它。

回答

12

什麼你問,絕對可以通過應用ReSharper Annotations來解決!這些屬性爲ReSharper的分析提供了額外的提示,允許您將ReSharper「善良」添加到您自己的方法和類中。我最近在JetBrains上錄製了一個名爲ReSharper Secrets的網絡研討會,我在那裏談論並展示註釋,歡迎您觀看!

至於你的問題,有3個註釋屬性,你可以應用到解決您的問題(並添加更多很酷的功能)。

假設爲IfNull的定義是這樣的:

public static class Throw 
{ 
    public static void IfNull<T>(T parameter, string parameterName) where T : class 
    { 
     if (parameter == null) 
      throw ArgumentNullException(string.Format("Parameter {0} is null", parameterName)); 
    } 
} 

3 ReSharper的屬性你可以裝飾它,ContractAnnotationNotNullInvokerParameterName這樣的:

[ContractAnnotation("parameter: null => halt")] 
public static void IfNull<T>([NotNull] T parameter, 
          [InvokerParameterName] string parameterName) 
    where T : class 
{ 
    ... 
} 

下面是這些屬性做:

第一,[ContractAnnotation],告訴ReSharper的,如果parameter是試探性null,則此方法將暫停程序執行,即拋出異常(在運行時)。這是防止「可能的NullReferenceException」警告的原因。用於定義合同註釋的語言解釋爲here

二是[NotNull],告訴ReSharper的是parameter不能是啓發式空。這給出了「可能的空分配給標有[NotNull]屬性的實體」警告。

第三個是[InvokerParameterName]告訴ReSharper,parameterName參數是來自調用(調用)方法的參數之一的名稱,因此它將提供代碼完成,其中列出了所有調用方法參數。如果名稱不是參數,例如,局部變量名稱,這將在ReSharper中發出警告。

下面是這些動作屬性的簡短視頻(適用於另一組API,但想法完全相同):http://screencast.com/t/NhGVaUr7GO3b