我应该禁止 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:应该正确拼写文字吗?的主要内容,如果未能解决你的问题,请参考以下文章
你可以在javascript中使用模板文字创建对象属性名称吗?