Sdílet prostřednictvím


Schreibgeschützte änderbare Verweistypen nicht deklarieren

Aktualisiert: November 2007

     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 Schreibschutzmodifizierer (readonly (C#-Referenz) in C#, ReadOnly (Visual Basic) in Visual Basic und const (C++) in C++) auf einem Referenztypfeld (Zeiger in C++) verhindert, dass das Feld durch eine andere Instanz des Referenztyps ersetzt wird. Es wird jedoch nicht verhindert, dass die Instanzdaten des Felds durch den Referenztyp geändert werden.

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

Behandlung 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 Warnungen unterdrückt werden sollten

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