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

項目
RuleId CA2104
類別 Microsoft.Security
重大變更 不中斷

注意

規則 CA2104 已淘汰,將會在未來的 Visual Studio 版本中移除。 由於判斷型別的實際不變性所需的複雜分析,因此不會將它當作分析器實作。

原因

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

注意

此規則已遭取代。 如需詳細資訊,請參閱過時的規則

檔案描述

可變動類型是可以修改執行個體資料的類型。 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();
        }
    }
}