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

类型名

NonConstantFieldsShouldNotBeVisible

CheckId

CA2211

类别

Microsoft.Usage

是否重大更改

原因

某公共或受保护静态字段不是常数,也不是只读字段。

规则说明

不是常数也不是只读字段的静态字段不是线程安全的。 必须严格控制对这类字段的访问,并需要高级编程技术来同步对类对象的访问。 由于这些技巧难以学习和掌握,测试这类对象会带来独特挑战,因此最好使用静态字段存储不发生变化的数据。 该规则适用于库;应用程序不应公开任何字段。

如何解决冲突

要修复与该规则的冲突,请将静态字段设置为常数或只读字段。 如果做不到这一点,请重新设计类型以使用替代机制,例如管理对基础字段的线程安全访问的线程安全属性。 请注意,锁争用和死锁等问题会影响库的性能和行为。

何时禁止显示警告

如果您正在开发应用程序,并因此对包含静态字段的类型具有完全访问权限,则可以安全地禁止显示此规则发出的警告。 库设计者不应禁止显示此规则发出的警告;使用非常量的静态字段可能导致开发人员难以正确使用库。

示例

下面的示例演示一个与该规则冲突的类型。


Imports System

Namespace UsageLibrary

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
using System;

namespace UsageLibrary
{
   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;
   }
}