當我們在重構或改bug等時候修改代碼時,往往會出現一些未使用的變量和函數,這些未使用的變量和函數一般要么是垃圾,要么是修改引入的bug,往往需要我們及時發現它。例如,對如如下代碼:
class Program
{
static void Main(string[] args)
{
var obj = new object();
}
static void Foo()
{
}
}
其中Main函數的obj變量,Foo函數都是沒有地方調用的,應該刪掉。但是編譯器並不對這些報告警(貌似是為了加快編譯速度的原因)。這個問題在其它語言中也存在,在編譯器不認為它是告警的情況下,我們往往需要借助一些第三方靜態代碼分析工具來進行更嚴格的檢查。例如,在C/C++中,pc-lint就是一個比較常用的靜態代碼分析工具;在.Net語言中通過FxCop進行檢查。
自VisualStudio 2010版本開始,微軟已經把FxCop集成到VisualStudio中了,並命名為代碼分析,可以通過屬性頁進行設置,也有專門的代碼分析窗口設置和執行代碼分析功能。
還是回到最開始這個問題上來,雖然微軟提供了這個功能,但默認的代碼分析規則並不檢查找到程序中未使用的變量和函數,為了找到程序中未使用的變量和函數,我打開了所有的規則,然后執行一遍代碼分析功能,結果如下:
警告項CA1804,CA1811非常准確的找到了未使用的代碼和函數的位置,並且給出了這幾個告警的意義和修改建議的鏈接地址,非常有效。不過用過這個工具的朋友就知道,幾乎在實際項目中沒有敢開所有規則的,那告警多得讓你想吐,實際上也用不着那么嚴格的約束,因此需要我們自己定制帶這個檢查項的規則。
在上一步通過所有規則分析后知道這兩個告警號是CA1804和CA1811,在告警規則編輯器中找到它的位置,然后只要在自定義的告警規則中添加這兩條即可。當然,也可以使用內置了這兩個檢查選項的規則(內置的Microsoft基本設計准則規則和Microsoft擴展設計准則就有,其它規則沒細看)。
需要注意的是,只在XAML或代碼中通過反射方式訪問的變量或函數也會被認為沒有訪問過,因此這種告警未必是錯誤,但當某次修改后新增的告警一般就是錯誤或垃圾了,因此這種告警需要及時發現和修改。
這個檢查也可以設置為每次編譯的時候就開始檢查,不過這個會影響編譯速度。另外,我們也不能保證所有的檢查告警都能消除,每次生成代碼時都看一下有沒有新增也比較費勁。我一般的做法是:每次大的改動后和提交代碼前都進行一次檢查,及時發現規則檢查告警,盡量不新增告警。
最后,共享一個注冊表文件,主要用來刪除所有自定義規則列表的MRU記錄的,不想在規則列表里面看到已經被廢棄了的自定義規則的可以使用一下。
Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\CodeAnalysis]
"RuleSetMRUList"=-