更新:2007 年 11 月
| TypeName | DoNotDeclareReadOnlyMutableReferenceTypes | 
| CheckId | CA2104 | 
| 类别 | Microsoft.Security | 
| 是否重大更改 | 否 | 
原因
外部可见类型包含外部可见的只读字段,该字段为可变的引用类型。
规则说明
可变类型是实例数据可被修改的类型。System.Text.StringBuilder 类是可变引用类型的一个示例。它包含可以更改类的实例值的成员。不可变引用类型的一个示例是 System.String 类。当它被实例化以后,其值永远不能更改。
引用类型字段(在 C++ 中为指针)上的只读修饰符(在 C# 中为 readonly(C# 参考),在 Visual Basic 中为 ReadOnly (Visual Basic),在 C++ 中为 const (C++))可以防止该字段被引用类型的另一个实例替换,但是不能防止该字段的实例数据被引用类型修改。
只读数组字段不受该规则限制,但是会导致与 数组字段不应为只读 规则的冲突。
如何修复冲突
要修复与该规则的冲突,请移除只读修饰符,或者如果可以接受重大更改,请用不可变类型替换该字段。
何时禁止显示警告
如果字段类型不可变,则可以安全地禁止显示此规则发出的警告。
示例
下面的示例演示导致与该规则冲突的字段声明。
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()
        {
        }
    };
}