CA2104:不要声明只读可变引用类型

“值”
RuleId CA2104
Category Microsoft.Security
重大更改 非中断

注意

规则 CA2104 已过时,并将在 Visual Studio 的未来版本中删除。 由于确定一种类型的实际不可变性所需的分析十分复杂,因此它将不会作为分析器实现。

原因

外部可见类型包含外部可见的只读字段,该字段为可变的引用类型。

注意

此规则已被弃用。 有关详细信息,请参阅已弃用的规则

规则说明

可变类型是实例数据可被修改的类型。 System.Text.StringBuilder 类是可变引用类型的一个示例。 它包含可以更改类实例的值的成员。 System.String 类是不可变引用类型的一个示例。 实例化后,其值永远不会更改。

引用类型字段上的只读修饰符(C# 中的 readonly、Visual Basic 中的 ReadOnly 和 C++ 中的 const)可防止字段被引用类型的不同实例替换。 但是,修饰符不会阻止通过引用字段修改字段的实例数据。

此规则可能会无意中显示一个类型(实际上是不可变的)的冲突。 在这种情况下,可以安全地禁止显示警告。

只读数组字段不受此规则约束,但会违反 CA2105:数组字段不应为只读规则。

如何解决冲突

若要解决此规则冲突,请删除只读修饰符;如果可接受中断性变更,请将字段替换为不可变类型。

何时禁止显示警告

如果字段类型不可变,则可以安全地禁止显示此规则的警告。

示例

以下示例显示了导致此规则违反的字段声明:

using System;
using System.Text;

namespace SecurityLibrary
{
    public class MutableReferenceTypes
    {
        static protected readonly StringBuilder SomeStringBuilder;

        static MutableReferenceTypes()
        {
            SomeStringBuilder = new StringBuilder();
        }
    }
}