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;
}