CA1802:在合适的位置使用文本

属性
规则 ID CA1802
标题 在合适的位置使用文本
类别 “性能”
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用

原因

某个字段被声明为 staticreadonly(在 Visual Basic 中为 SharedReadOnly),并使用可在编译时计算的值初始化。

默认情况下,此规则仅查看外部可见的静态只读字段,但这是可配置的。

规则说明

当调用声明类型的静态构造函数时,将在运行时计算 static readonly 字段的值。 如果 static readonly 字段在声明时被初始化并且静态构造函数不是显式声明的,编译器将发出一个静态构造函数来初始化该字段。

const 字段的值是在编译时计算的,并存储在元数据中,与 static readonly 字段相比,这提高了运行时性能。

因为赋给目标字段的值可在编译时计算,所以,请将声明更改为 const 字段,以便在编译时(而非运行时)计算该值。

如何解决冲突

若要解决此规则的冲突,请将 staticreadonly 修饰符替换为 const 修饰符。

注意

不建议对所有方案使用 const 修饰符。

何时禁止显示警告

如果性能无关紧要,则可安全地禁止显示此规则发出的警告,或禁用此规则。

抑制警告

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

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

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

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

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

配置代码以进行分析

使用下面的选项来配置代码库的哪些部分要运行此规则。

可以仅为此规则、为适用的所有规则或为适用的此类别(性能)中的所有规则配置这些选项。 有关详细信息,请参阅代码质量规则配置选项

包含特定的 API 图面

你可以根据代码库的可访问性,配置要针对其运行此规则的部分。 例如,若要指定规则应仅针对非公共 API 图面运行,请将以下键值对添加到项目中的 .editorconfig 文件:

dotnet_code_quality.CAXXXX.api_surface = private, internal

必需的修饰符

可以将此规则配置为重写必需的字段修饰符。 默认情况下,staticreadonly 都是所分析字段的必需修饰符。 可以将其重写为以逗号分隔的包含下表中一个或多个修饰符值的列表:

选项值 总结
none 无修饰符要求。
staticShared 必须声明为“static”(在 Visual Basic 中为“Shared”)。
const 必须声明为“const”。
readonly 必须声明为“readonly”。

例如,若要指定规则应针对静态或实例字段运行,请将以下键值对添加到项目的 .editorconfig 文件中:

dotnet_code_quality.CA1802.required_modifiers = none

示例

下面的示例显示了一个与此规则冲突的 UseReadOnly 类型,以及一个符合此规则的 UseConstant 类型。

Imports System

Namespace ca1802

    ' This class violates the rule.
    Public Class UseReadOnly

        Shared ReadOnly x As Integer = 3
        Shared ReadOnly y As Double = x + 2.1
        Shared ReadOnly s As String = "readonly"

    End Class

    ' This class satisfies the rule.
    Public Class UseConstant

        Const x As Integer = 3
        Const y As Double = x + 2.1
        Const s As String = "const"

    End Class

End Namespace
// This class violates the rule.
public class UseReadOnly
{
    static readonly int x = 3;
    static readonly double y = x + 2.1;
    static readonly string s = "readonly";

    public void Print()
    {
        Console.WriteLine(s);
    }
}

// This class satisfies the rule.
public class UseConstant
{
    const int x = 3;
    const double y = x + 2.1;
    const string s = "const";
}