CA2104:不要宣告唯讀的可變動參考型別

型別名稱

DoNotDeclareReadOnlyMutableReferenceTypes

CheckId

CA2104

分類

Microsoft.Security

中斷變更

中斷

原因

外部可見型別包含了可變動參考型別的外部可見唯讀欄位。

規則描述

可變動型別是可以修改執行個體 (Instance) 資料的型別。 System.Text.StringBuilder 類別 (Class) 則是可變動參考型別的範例。 其中包含的成員可以變更類別執行個體的值。 不可變動參考型別的範例則為 System.String 類別。 執行個體化類別之後,該類別的值就不會再變更。

參考型別欄位 (C++ 中的指標) 上的唯讀修飾詞 (Modifier) (在 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()
        {
        }
    };
}