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