考虑以下C#代码:
if (atr == null) throw new InvalidOperationException("No ContentProperty attribute found on type.");
构建项目时,“ CA2204
:文字拼写应正确”由于无法识别的单词“ContentProperty”而发出警告。
我知道我可以禁用规则(全局或仅包含方法)或创建自定义代码分析字典并在其中添加“ContentProperty”作为可识别的单词。但是,这些解决方案都没有吸引我的意义。引用异常消息中的类型或类成员名称必然会在我的项目中发生很多,这是一个应用程序框架。
代码分析是否有办法告诉单词/单词组不是要进行拼写检查 ,就像用引号或其他东西包围一样?或者只是禁用警告?
答案 0 :(得分:3)
我会使用不同的方法 - 因为维护自定义词典可能会成为维护问题:没有指向实际类的链接(在您的示例中为ContentPropertyAttribute
)。如果有人重命名或删除该类,会发生什么?必须手动同步自定义属性中的条目,这很容易出错。
相反,我建议使用一些(我敢说)反射来注入字符串的相应部分(而不是可能以CA1703结尾的资源)。您的示例可能会被重写为:
throw new InvalidOperationException(string.Format("No {0} found on type.", typeof(ContentPropertyAttribute).Name);
现在,您的邮件甚至可以安全编译。
答案 1 :(得分:2)
本文介绍如何为代码分析创建自定义词典:http://msdn.microsoft.com/en-us/library/bb514188.aspx
创建一个名为CustomDictionary.xml的文件并将其添加到您的项目中。将文件的Build Action属性设置为 CodeAnalysisDictionary
文件内容应如下所示:
<Dictionary>
<Words>
<Recognized>
<Word>ContentProperty</Word>
</Recognized>
</Words>
</Dictionary>
正如Willy博士的Apprentice在下面的评论中所建议的那样,根据框架的架构动态生成字典可能是一个好主意。
答案 2 :(得分:2)
代码分析是否有办法告诉单词不是要拼写检查,就像用引号或其他东西包围一样?
仅CA2204 适用于字符串文字,即硬编码的字符串(用引号括起)。禁用此代码分析规则不会阻止CA检查您的类名,公共成员或其他代码属性的拼写。
如果你的项目是一个应用程序框架,大多数/所有字符串文字将以开发人员为目标(如异常消息),我建议禁用此规则。对我来说,这比提出一种排除异常消息中每个无法识别的字符串的复杂方法更有意义。
另一个选择是移动&#34;拼写错误&#34;将字符串转换为Resource.resx
文件。但是,如果启用CA1703,您将遇到同样的问题。
答案 3 :(得分:1)
使用Visual Studio 2017 †,我已经演示了可以通过使用CA2204: Literals should be spelled correctly来避免代码分析警告following additions to C# version 6:
if (atr == null)
{
throw new InvalidOperationException(
$"No {nameof(ContentProperty)} attribute found on type.");
}
您可能还会发现my answer至String Interpolation in Visual Studio 2015 and IFormatProvider (CA1305),以避免CA1305: Specify IFormatProvider有所帮助。
†请注意,Visual Studio 2013附带了C#版本6。为避免出现此警告,可能还需要更新版本的Visual Studio(带有更新版本的Code Analysis)。