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()
{
}
};
}