Sdílet prostřednictvím


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