CA2104: 読み取り専用の変更可能な参照型を宣言しません

TypeName

DoNotDeclareReadOnlyMutableReferenceTypes

CheckId

CA2104

分類

Microsoft.Security

互換性に影響する変更点

なし

原因

外部から参照できる型に、変更可能な参照型である、外部から参照可能な読み取り専用のフィールドがあります。

規則の説明

変更可能な型とは、インスタンス データを変更できる型です。 System.Text.StringBuilder クラスは、変更可能な参照型の一例です。 このクラスには、クラスのインスタンス値を変更できるメンバーが含まれます。 変更できない参照型の例は、System.String クラスです。 インスタンス化された後に、値を変更できません。

参照型フィールド (C++ ではポインター) に、読み取り専用の修飾子 (C# では readonly (C# リファレンス)、Visual Basic では ReadOnly (Visual Basic)、C++ では const (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()
        {
        }
    };
}