我最近将我的项目从Visual Studio 2008升级到Visual Studio 2010。
通过启用代码分析,我收到了很多警告,导致规则CA2204:文字应拼写正确。
修改:
假设我有一个名为GetResult()
的方法,其中我想出于某种原因抛出异常。我希望例外说"GetResult() has failed for some reason"
。这将给我警告,因为GetResult不是一个字。我不会在方法名称GetResult()
上收到警告,只有当我把它放在一个字符串中时。这是因为Get和Result是合法的词。
我不相信写GetResult() has failed for some reason
是解决方案。
编辑:在MSDN中说:
此规则解析文字字符串 单词,标记复合词, 并检查每个的拼写 字/令牌。
这是否意味着应该将GetResult检查为两个词:“获取”和“结果”?
我应该抑制CA2204吗?
答案 0 :(得分:5)
"Can't initialize MyClass"
对于开发人员引入代码不是一个好消息。它很少有助于调试,它只会在最终用户显示时混淆。
一般情况下,我会说不要压制邮件,因为拼写错误让人看起来比实际上要笨重,而且这不是你想用你的应用传达的信息。
在这个特定的实例中,它实际上是一个错误消息错误的警告 - 要么告诉用户如何纠正它,自动纠正它,要么包括它没有初始化的实际原因你的错误日志。
编辑:包括OP的编辑 您可以从此警告中获取的一点是,您不应将错误消息中的代码详细信息泄露(主要是因为在您记录异常时它们将包含在调用堆栈中)。
GetResult() has failed for some reason
让我们说“某些原因”是权限。消息可以是:
您无权查看这些结果。
无需提及失败的特定方法,因为可以自动记录堆栈跟踪。
答案 1 :(得分:4)
解决此问题的一种方法是不直接在字符串中添加类型名称。而是将其作为参数传递。例如
var msg = String.Format("Can't initialize {0}", typeof(MyClass).Name);
这有利于绕过FxCop规则并且可以安全地进行重构。
答案 2 :(得分:2)
可能你不应该把类名放入文字中吗?如何使用或定义可抛出的异常:
throw new CantInitializeClassException(innerException, typeof(MyClass);
我的想法是将更多信息转移到更一般的例外。我建议使用上面的示例而不是throw new ApplicationException("Cant initialize MyClass");
答案 3 :(得分:1)
CA2204
就是拼写。不幸的是,即使在VS2012中,它仍然有一个古怪的错误,它无法标记复合词:http://connect.microsoft.com/visualstudio/feedback/details/521030
这导致我在代码分析规则集中关闭此规则。