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