CA1507:使用 nameof 代替字符串

属性
规则 ID CA1507
标题 使用 nameof 代替字符串
类别 可维护性
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用 作为建议

原因

与包含方法的参数名或包含类型的属性名匹配的 string 文本或常数用作方法的参数。

规则说明

规则 CA1507 将 string 文本的使用标记为方法或构造函数的参数,其中 nameof(在 Visual Basic 中为 NameOf)表达式将添加可维护性。 如果满足以下所有条件,则会触发规则:

  • 参数是一个 string 文本或常数。

  • 参数对应于方法的 string 类型化参数或正在调用的构造函数(即调用站点不涉及转换)。

  • 可以是:

    • 参数的声明名称为 paramName,并且 string 文本的常数值与在其中调用方法或构造函数的方法、lambda 或本地函数的参数名称相匹配。

    • 参数的声明名称为 propertyName,并且 string 文本的常数值与在其中调用方法或构造函数的类型的属性名称相匹配。

在将来可以重命名参数,但不会错误地重命名 string 文本的情况下,规则 CA1507 可以提高代码的可维护性。 使用 nameof 的情况下,当通过重构操作重命名该参数时,将重命名符号。 此外,编译器将捕获参数名称中的任何拼写错误。

如何解决冲突

若要解决冲突,请将 string 文本替换为 nameof(在 Visual Basic 中为 NameOf)表达式。 例如,以下两个代码片段显示了规则冲突及其解决方法:

public Book(string title)
{
    // Violates rule CA1507
    Title = title ?? throw new ArgumentNullException("title", "All books must have a title.");
}
public Book(string title)
{
    // Resolves rule CA1507 violation
    Title = title ?? throw new ArgumentNullException(nameof(title), "All books must have a title.");
}

提示

Visual Studio 中为此规则提供了代码修补程序。 若要使用它,请将光标置于 string 文本上,然后按“Ctrl+.”(句点)。 从显示的选项列表中选择“使用 nameof 表达符号名称”。

Code fix for CA1507 - use nameof to express symbol names

何时禁止显示警告

如果不在乎代码的可维护性,可安全地禁止显示此规则的冲突。

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

#pragma warning disable CA1507
// The code that's violating the rule is on this line.
#pragma warning restore CA1507

若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none

[*.{cs,vb}]
dotnet_diagnostic.CA1507.severity = none

有关详细信息,请参阅如何禁止显示代码分析警告

另请参阅