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