2010-05-18 32 views
5

我最近將項目從Visual Studio 2008升級到Visual Studio 2010.我應該壓制CA2204:文字應拼寫正確嗎?

通過啓用代碼分析,我得到了許多警告導致規則CA2204:文字應該拼寫正確。

編輯

比方說,我有一個名爲GetResult()方法,並在這我想扔出於某種原因的異常。我想例外地說"GetResult() has failed for some reason"。由於GetResult不是一個單詞,這會給我警告。我不會在方法名GetResult()上發出警告,只有當我把它放在一個字符串中。這是因爲獲取和結果是合法的詞彙。

我不認爲寫作GetResult() has failed for some reason是解決方案。

EDIT:在MSDN它說:

此規則解析文字串 成單詞,令牌化複合詞, 和檢查每個 字/令牌的拼寫。

這並不意味着GetResult應該被檢查爲兩個單詞:「Get」和「Result」?

我應該抑制CA2204嗎?

+3

我不明白你的編輯。你會得到GetResult的警告,但是你沒有得到GetResult的警告?請澄清。 – Gabe 2010-05-18 14:53:51

+1

我認爲你應該檢查你的編輯,現在沒有意義。 – fortran 2010-05-18 14:54:27

+0

我已經使編輯更清晰,重點是GetResult()方法是一個方法的好名字,我沒有得到它的警告。但是如果我把這個名字放在一個字符串中,我會得到一個警告。 – brickner 2010-05-18 15:03:06

回答

5

"Can't initialize MyClass"對於開發人員來說不是一個很好的消息來引入代碼。它很少有助於調試,只會在最終用戶顯示時混淆最終用戶。

一般來說,我會說不要壓制信息,因爲拼寫錯誤讓人看起來比他們真正的笨多了,這不是你想要用你的應用程序傳遞的信息。

在這種具體情況下,這真是一個可憐的錯誤消息的警告 - 要麼告訴用戶如何糾正它,自動更正,或包括它不是在錯誤日誌初始化的實際原因。

編輯:包括OP的編輯
東西你可以從這個警告是,你不應該透露的代碼細節的錯誤信息(主要是因爲它們將包含在您登錄時調用堆棧的一部分例外)。

GetResult() has failed for some reason
讓我們說「某些原因」是權限。該消息可能爲:

您沒有查看這些結果的權限。

沒有必要提及失敗的具體方法,因爲可以自動記錄堆棧跟蹤。

+0

ArgumentNullException和ArgumentException似乎是這個建議的例外 – 2013-07-25 12:17:48

2

可能是你不應該把類名字變成​​文字?怎麼樣使用或定義異常,可以拋出這樣的:

throw new CantInitializeClassException(innerException, typeof(MyClass); 

我的想法是,以瞭解更多信息移動到更從籠統的更具體的例外。我建議使用上面的示例代替throw new ApplicationException("Cant initialize MyClass");

+0

不錯的嘗試。當我使用方法名稱時,也會發生這種情況...查看我的編輯。 – brickner 2010-05-18 14:51:09

+3

@brickner - 同樣的事情。方法名稱包含在堆棧跟蹤中。至少應該如果你的堆棧鏈是好的。這個信息應該由異常對象來描述。 – Andrey 2010-05-18 14:53:06

+0

@Andrey,你說得對。你認爲我應該使用MethodBase.GetCurrentMethod()。Name而不是寫名字嗎?你可能有一點,但它似乎只是使代碼複雜... – brickner 2010-05-18 15:06:41

4

解決此問題的一種方法是不要直接將類型名稱添加到字符串中。而是將其作爲參數傳遞。例如,

var msg = String.Format("Can't initialize {0}", typeof(MyClass).Name); 

這有利於避免FxCop規則和安全重構。

+0

不錯的嘗試。當我使用方法名稱時,也會發生這種情況...查看我的編輯。 – brickner 2010-05-18 14:50:03

+0

我認爲他需要明確提供IFormatProvider或FXCop會發出全球化警告。 'String.Format(CultureInfo.CurrentCulture,「無法初始化{0}」,typeof(MyClass).Name)'應該這樣做。 – Timothy 2010-05-19 12:59:29

+0

在C#6中,您可以使用'nameof'獲得相同的效果,但CodeAnalysis現在可以看到字符串文字並且抱怨type-name不是有效的單詞。這是一個警告,如果它正在討論類型名稱imo,應該予以抑制。 – Dai 2016-06-12 02:24:09