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

类型名

DoNotDeclareReadOnlyMutableReferenceTypes

CheckId

CA2104

类别

Microsoft.Security

是否重大更改

非重大更改

原因

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

规则说明

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

引用类型字段上的只读修饰符(在 C# 中为 readonly(C# 参考),在 Visual Basic 中为 ReadOnly (Visual Basic),在 C++ 中为 const (C++))的引用类型字段 (在 C++ 中为指针) 可防止字段被替换为引用类型的不同实例。 但是,该修饰符不妨碍字段的实例数据通过引用类型得到修饰。

只读数组字段不受该规则限制,但是会导致与 CA2105:数组字段不应为只读 规则的冲突。

如何解决冲突

要修复与该规则的冲突,请移除只读修饰符,或者如果可以接受重大更改,请用不可变类型替换该字段。

何时禁止显示警告

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

示例

下面的示例演示导致与该规则冲突的字段声明。

Imports System
Imports System.Text

Namespace SecurityLibrary

    Public Class MutableReferenceTypes

        Shared Protected ReadOnly SomeStringBuilder As StringBuilder

        Shared Sub New()
            SomeStringBuilder = New StringBuilder()
        End Sub

    End Class

End Namespace
using System;
using System.Text;

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

        static MutableReferenceTypes()
        {
            SomeStringBuilder = new StringBuilder();
        }
    }
}
using namespace System;
using namespace System::Text;

namespace SecurityLibrary
{
    public ref class MutableReferenceTypes
    {
    protected:
        static StringBuilder^ const SomeStringBuilder = 
           gcnew StringBuilder();

    private:
        static MutableReferenceTypes()
        {
        }
    };
}