2010-05-18 49 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