我应该禁止 CA2204:应该正确拼写文字吗?

Posted

技术标签:

【中文标题】我应该禁止 CA2204:应该正确拼写文字吗?【英文标题】:Should I suppress CA2204: Literals should be spelled correctly? 【发布时间】:2010-05-18 14:32:22 【问题描述】:

我最近将我的项目从 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应该被检查为两个词:“Get”和“Result”?

我应该抑制 CA2204 吗?

【问题讨论】:

我不明白您的编辑。您收到 GetResult 的警告,但您没有收到 GetResult 的警告?请澄清。 我认为你应该检查你的编辑,现在没有意义了。 我已经使编辑更清楚了,关键是 GetResult() 方法是一个好名字,我没有收到警告。但是,如果我将该名称放在字符串中,我会收到警告。 【参考方案1】:

"Can't initialize MyClass" 对开发人员来说不是一个很好的信息来引入代码。它很少有助于调试,而且只有在显示时才会让最终用户感到困惑。

一般来说,我会说不要隐藏信息,因为拼写错误会使人看起来比实际更愚蠢,而且这不是您想通过应用传达的信息。

在这个特定实例中,它实际上是一个错误消息的警告——告诉用户如何更正它,自动更正它,或者包括它没有初始化的实际原因你的错误日志。

编辑:包括 OP 的编辑 您可以从这个警告中了解到,您不应该将代码详细信息作为错误消息的一部分(主要是因为当您记录异常时它们将包含在调用堆栈中)。

GetResult() has failed for some reason 假设“某种原因”是权限。消息可以是:

您无权查看这些结果。

具体的失败方法就不用说了,因为可以自动记录堆栈跟踪。

【讨论】:

ArgumentNullException 和 ArgumentException 似乎是此建议的例外情况【参考方案2】:

解决此问题的一种方法是不直接将类型名称添加到字符串中。而是将其作为参数传递。例如

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

这样做的好处是既可以绕过 FxCop 规则,又可以安全地进行重构。

【讨论】:

不错的尝试。当我使用方法名称时也会发生这种情况......看看我的编辑。 我认为他需要明确提供 IFormatProvider 否则 FXCop 将引发全球化警告。 String.Format(CultureInfo.CurrentCulture, "Can't initialize 0", typeof(MyClass).Name) 应该可以解决问题。 在 C# 6 中,您可以使用 nameof 获得相同的效果,除了 CodeAnalysis 现在看到字符串文字并抱怨类型名称不是有效单词。这是一个警告,如果它涉及类型名称,则应该禁止显示,imo。【参考方案3】:

也许你不应该把类名变成文字?如何使用或定义可以像这样抛出的异常:

throw new CantInitializeClassException(innerException, typeof(MyClass);

我的想法是将更多信息从更一般的例外转移到更具体的例外。我建议使用上面的示例而不是throw new ApplicationException("Cant initialize MyClass");

【讨论】:

不错的尝试。当我使用方法名称时也会发生这种情况......看看我的编辑。 @brickner - 同样的事情。方法名称包含在堆栈跟踪中。如果你的堆栈链没问题,至少应该是这样。此信息应由异常对象描述。 @Andrey,你是对的。你认为我应该使用 MethodBase.GetCurrentMethod().Name 而不是写名字吗?你可能有一点,但它似乎只是使代码复杂化...... @brickner - 没有。当您抛出异常时,CLR 会将方法名称写入 StackTrace 字段 @bricker:“成词”是指由分隔符分隔的字符序列,即空格。 MyClass 被认为是一个词。真的,我认为这是愚蠢的规则,讨论到了修辞上。如果你不喜欢它 - 压制它并重新开始工作:)【参考方案4】:

CA2204 是关于拼写的。不幸的是,即使在 VS2012 中,它仍然有一个旧的烦人的错误,它无法标记复合词:http://connect.microsoft.com/visualstudio/feedback/details/521030

这导致我在我们的代码分析规则集中关闭了这条规则。

【讨论】:

看起来这种不正确的行为在 Visual Studio 2017 中仍未修复。它必须是一个错误,因为 CA2204 的文档说它分解了复合词。

以上是关于我应该禁止 CA2204:应该正确拼写文字吗?的主要内容,如果未能解决你的问题,请参考以下文章

打字机效果文字动画

ES6 模板文字可以在运行时替换(或重用)吗?

pycharm 提示性信息

你可以在javascript中使用模板文字创建对象属性名称吗?

将图像放在表格的中心,如果有额外的文字,图像下方的文字应该在新行中

NetBeans 编程问题(界面文字显示不正确)