CA2211:非常量字段不应是可见的

属性
规则 ID CA2211
标题 非常量字段不应是可见的
类别 使用情况
修复是中断修复还是非中断修复 重大
在 .NET 8 中默认启用 作为建议

原因

公共或受保护的静态字段既不是常量,也不是只读字段。

规则说明

不是常数也不是只读字段的静态字段不是线程安全的。 必须谨慎控制对这类字段的访问,并需要使用高级编程技术来实现对类对象的同步访问。 由于这些都是很难学习的技能,并且测试这种对象有其自身的难度,因此静态字段最好用于存储不会更改的数据。 此规则适用于库;应用程序不应公开任何字段。

如何解决冲突

若要解决与此规则的冲突,请将静态字段设置为常量或只读。 如果无法实现,请重新设计类型,使用替代机制(如线程安全属性)来管理对基础字段的线程安全访问。 请注意,锁争用和死锁之类的问题可能会影响库的性能和行为。

何时禁止显示警告

如果你正在开发应用程序,则可以安全地禁止显示此规则的警告,从而完全控制对包含静态字段的类型的访问。 库设计器不应禁止显示此规则的警告;使用非常量静态字段会让开发人员难以正确使用库。

抑制警告

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

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

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

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

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

示例

下面的示例演示了与此规则发生冲突的类型。


Imports System

Namespace ca2211

    Public Class SomeStaticFields
        ' Violates rule: AvoidNonConstantStatic;
        ' the field is public and not a literal.
        Public Shared publicField As DateTime = DateTime.Now

        ' Satisfies rule: AvoidNonConstantStatic.
        Public Shared ReadOnly literalField As DateTime = DateTime.Now

        ' Satisfies rule: NonConstantFieldsShouldNotBeVisible;
        ' the field is private.
        Private Shared privateField As DateTime = DateTime.Now
    End Class
End Namespace
public class SomeStaticFields
{
    // Violates rule: AvoidNonConstantStatic;
    // the field is public and not a literal.
    static public DateTime publicField = DateTime.Now;

    // Satisfies rule: AvoidNonConstantStatic.
    public static readonly DateTime literalField = DateTime.Now;

    // Satisfies rule: NonConstantFieldsShouldNotBeVisible;
    // the field is private.
    static DateTime privateField = DateTime.Now;
}