在字符串字面量中提及类型名称的CA2204警告

10

考虑以下 C# 代码:

if (atr == null) throw new InvalidOperationException("No ContentProperty attribute found on type.");

在构建项目时,由于无法识别"ContentProperty"单词,会发出"CA2204: 应正确拼写文字"的警告。

我知道我可以禁用规则(全局或仅限包含方法),或创建自定义代码分析字典并将"ContentProperty"添加为已识别单词之一。然而,这些解决方案都不太吸引我。在我的项目中,即一个应用程序框架中,在异常消息中引用类型或类成员名称是经常发生的事情。

代码分析是否有办法告诉单词/一组单词不必进行拼写检查,比如当其被引号或其他方式包围时?或者禁用警告是唯一的解决方法吗?

4个回答

3
我建议采用不同的方法 - 因为维护自定义字典可能会成为一个维护问题:在您的示例中,没有与实际类的链接(如ContentPropertyAttribute)。如果有人重命名或删除该类会发生什么?必须手动同步Custom Attributes中的条目,这很容易出错。相反,我建议使用一些(敢说)反射来注入字符串相应部分(而不是可能最终导致 CA1703 的资源)。您的示例可以重写为:
throw new InvalidOperationException(string.Format("No {0} found on type.", typeof(ContentPropertyAttribute).Name);

现在,您的消息甚至可以在编译时得到保障。

不幸的是,那只适用于类型。正如我在问题中所说的,我将涉及到类型和成员。但仍然是一个有价值的答案。谢谢。 - Crono

2
本文介绍如何创建用于代码分析的自定义字典:http://msdn.microsoft.com/en-us/library/bb514188.aspx 创建一个名为CustomDictionary.xml的文件并将其添加到您的项目中。将文件的构建操作属性设置为CodeAnalysisDictionary 文件的内容应如下所示:
<Dictionary>
    <Words>
        <Recognized>
            <Word>ContentProperty</Word>
        </Recognized>
    </Words>
</Dictionary>

如下所示,根据Willy博士的学徒在下面的评论中提出的建议,动态生成一个基于框架架构的字典可能是一个好主意。

正如我所说,自定义字典在我的情况下不是可行的解决方案。我的异常消息中可能会引用许多属性和类型。为每个属性和类型维护一个字典并不高效。此外,这将使重构变得更加困难。 - Crono
1
我认为一个很好的下一步是在这个答案的基础上构建(虽然我认为这将是很多工作),创建一个自定义代码生成器,它实际上会根据项目中的类型、方法、属性等以及任何可能的引用项目来生成CustomDictionary.xml文件的内容。这样,您就不必手动更新它了。编辑:抱歉,我给出的链接可能不适用于此目的,因为它涉及单个输入文件代码生成器。 - Dr. Wily's Apprentice
嗯,这确实是一个有趣的想法。 :) 但那可能会太多了吗?我不希望代码分析需要永远才能完成,因为它必须分析一个巨大的字典文件。 :p - Crono
你可以创建一个自定义属性来标记你的代码。之后,你可以使用反射来查找那些被标记的类型,并将它们导出到生成的字典文件中。或者,如果所有类型和属性都可以出现在异常文本中,那么可以跳过标记并全部导出。 - Fredrik Ljung
这可能有些过度设计,但肯定可以解决大小问题,同时保持维护的轻松。不过我必须让它变得更智能,因为我不喜欢在代码中添加太多属性。也许我可以将一个属性放在类型上,并让字典生成器假设我希望将类型及其公共成员视为有效单词... - Crono
显示剩余7条评论

2
代码分析是否有一种方法可以告诉它一个单词不需要进行拼写检查,比如用引号括起来的时候或其他什么?CA2204仅适用于字符串字面量,即由引号括起来的硬编码字符串。禁用此代码分析规则将不会阻止CA检查类名、公共成员或其他代码属性的拼写。如果您的项目是应用程序框架,其中大多数/所有字符串字面量都将针对开发人员(如异常消息),我建议禁用此规则。对我来说,这比想出一种排除异常消息中每个未识别字符串的复杂方法更有意义。另一个选择是将“拼写错误”的字符串移动到Resource.resx文件中。但是,如果启用了CA1703,您将遇到相同的问题。

CA1703确实已启用。我真正意思是字符串文字中的引号,例如“This is my /“literal/” string.”。 - Crono

1

使用 Visual Studio 2017,我已经证明编程分析警告CA2204: 字面值应正确拼写可以通过使用以下 C#6 版本的以下补充来避免:

if (atr == null)
{
    throw new InvalidOperationException(
        $"No {nameof(ContentProperty)} attribute found on type.");
}

您可能会发现我的答案Visual Studio 2015中的字符串插值和IFormatProvider(CA1305)以避免CA1305:指定IFormatProvider有所帮助。


请注意,C# 6版本是在Visual Studio 2013中发布的。为了避免此警告,可能需要使用更新的Visual Studio(带有更新的代码分析版本)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接