CA2104: Schreibgeschützte änderbare Referenztypen nicht deklarieren.

Element Wert
RuleId CA2104
Category Microsoft.Security
Unterbrechende Änderung Nicht unterbrechend

Hinweis

Regel CA2104 ist veraltet und wird in einer zukünftigen Version von Visual Studio entfernt. Aufgrund der komplizierten Analyse, die erforderlich ist, um die tatsächliche Unveränderlichkeit eines Typs zu bestimmen, wird sie nicht als Analysetool implementiert.

Ursache

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

Hinweis

Diese Regel wurde als veraltet markiert. Weitere Informationen finden Sie unter Veraltete Regeln.

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 veränderlichen Verweistyp. Sie enthält Member, die den Wert einer Instanz der Klasse ändern können. Ein Beispiel für einen unveränderlichen Verweistyp ist die System.String-Klasse. Nachdem sie instanziiert wurde, kann sich ihr Wert nie ändern.

Der schreibgeschützte Modifizierer (readonly in C#, ReadOnly in Visual Basic und const in C++) für ein Verweistypfeld (oder 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.

Diese Regel kann fälschlicherweise einen Verstoß für einen Typ anzeigen, der eigentlich unveränderlich ist. In diesem Fall kann eine Warnung von dieser Regel problemlos unterdrückt werden.

Schreibgeschützte Arrayfelder stellen eine Ausnahme von dieser Regel dar, sie verursachen jedoch einen Verstoß gegen die Regel CA2105: Arrayfelder dürfen nicht schreibgeschützt sein.

Behandeln von Verstößen

Um Verstöße gegen diese Regel zu beheben, entfernen Sie den schreibgeschützten Modifizierer, oder ersetzen Sie das Feld durch einen unveränderlichen Typ, wenn ein Breaking Change akzeptabel ist.

Wann sollten Warnungen unterdrückt werden?

Wenn der Feldtyp unveränderlich ist, kann eine Warnung von dieser Regel problemlos unterdrückt werden.

Beispiel

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

using System;
using System.Text;

namespace SecurityLibrary
{
    public class MutableReferenceTypes
    {
        static protected readonly StringBuilder SomeStringBuilder;

        static MutableReferenceTypes()
        {
            SomeStringBuilder = new StringBuilder();
        }
    }
}