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

Item [値]
規則 ID CA2104
カテゴリ Microsoft.Security
互換性に影響する変更点 なし

Note

規則 CA2104 は古く、今後のバージョンの Visual Studio では削除される予定です。 型の実際の不変性を特定するために必要とされる複雑な分析のため、これはアナライザーとしては実装されない予定です。

原因

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

Note

このルールは非推奨とされました。 詳細については、「非推奨の規則」を参照してください。

規則の説明

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

参照型フィールド (または C++ のポインター) に読み取り専用修飾子 (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();
        }
    }
}