Freigeben über


CA2104: Schreibgeschützte änderbare Referenztypen nicht deklarieren

TypeName

DoNotDeclareReadOnlyMutableReferenceTypes

CheckId

CA2104

Kategorie

Microsoft.Security

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Ein extern sichtbarer Typ enthält ein extern sichtbares schreibgeschütztes Feld, bei dem es sich um einen änderbaren Referenztyp handelt.

Regelbeschreibung

Ein änderbarer Typ ist ein Typ, dessen Instanzdaten geändert werden können. Die System.Text.StringBuilder-Klasse ist ein Beispiel für einen änderbaren Referenztyp. Sie enthält Member, die den Wert einer Instanz der Klasse ändern können. Ein Beispiel für einen nicht änderbaren Referenztyp ist die System.String-Klasse. Nachdem sie instanziiert wurde, kann sich ihr Wert nie ändern.

Der schreibgeschützte Modifizierer (readonly (C#-Referenz) in C#, ReadOnly (Visual Basic) in Visual Basic und const (C++) in C++) in einem Feld mit einem Verweistyp (Zeiger in C++) verhindert, dass das Feld durch eine andere Instanz des Verweistyps ersetzt wird. Der Modifizierer verhindert jedoch nicht, dass die Instanzdaten des Felds durch den Verweistyp geändert werden.

Schreibgeschützte Arrayfelder sind von dieser Regel ausgenommen, verursachen jedoch stattdessen einen Verstoß gegen die Regel CA2105: Arrayfelder dürfen nicht schreibgeschützt sein.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, entfernen Sie den Schreibschutzmodifizierer. Falls eine unterbrechende Änderung vertretbar ist, können Sie das Feld auch durch einen nicht änderbaren Typ ersetzen.

Wann sollten Warnungen unterdrückt werden?

Eine Warnung dieser Regel kann gefahrlos unterdrückt werden, wenn der Feldtyp unveränderlich ist.

Beispiel

Das folgende Beispiel zeigt eine Felddeklaration, die einen Verstoß gegen diese Regel verursacht.

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