CA2104: Nedeklaruje proměnlivé odkazové typy pouze pro čtení
TypeName |
DoNotDeclareReadOnlyMutableReferenceTypes |
CheckId |
CA2104 |
Kategorie |
Microsoft.Security |
Narušující změna |
Nenarušující |
Příčina
Externě viditelný typ obsahuje externě viditelné pole měnitelného referenčního typu, které je určeno jen pro čtení.
Popis pravidla
Měnitelný typ je typ, jehož instanční data lze upravit.Třída StringBuilder je příkladem takového měnitelného referenčního typu.Obsahuje členy, které mohou změnit hodnotu instance této třídy.Příklad neměnitelného referenčního typu je třída String.Po jejím vytvoření se její hodnota nikdy nezmění.
Modifikátor jen pro čtení (readonly – modifikátor (Referenční dokumentace jazyka C#) v jazyce C#, ReadOnly (Visual Basic) v jazyce Visual Basic a const (C++) v jazyce C++) na poli referenčního typu (ukazatel v jazyce C++) zabraňuje nahrazení pole jinou instancí referenčního typu.Tento modifikátor však nebrání změně instančních dat pole pomocí metod referenčního typu.
Pole obsahující pole určené jen pro čtení jsou osvobozena od tohoto pravidla, ale místo toho způsobí porušení pravidla CA2105: Pole polí by neměly být pouze pro čtení.
Jak vyřešit porušení
Porušení tohoto pravidla se vyřeší odebráním modifikátoru jen pro čtení nebo, pokud je přijatelná narušující změna, nahrazením měnitelného typu pole na neměnitelný typ.
Kdy potlačit upozornění
Je bezpečné potlačit upozornění na toto pravidlo, pokud je typ pole neměnitelný.
Příklad
Následující příklad ukazuje deklaraci pole, která způsobuje porušení tohoto pravidla.
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()
{
}
};
}