Der const-Modifizierer kann auf jedes Feld angewendet werden (und sollte es im Allgemeinen auch), dessen Wert zur Kompilierzeit bekannt ist und sich während der Laufzeit des Programms nicht ändert.
private const int num = 1729;
public const string title = "Grand" + " Master";
Der readonly-Modifizierer kann auf jedes Feld angewendet werden (und sollte es im Allgemeinen auch), das nicht zu const gemacht werden kann und dessen Wert sich während der Laufzeit des Programms nicht ändert und das entweder durch einen Inline-Initialisierer oder während der Instanziierung festgelegt wird (durch den Konstruktor oder eine vom Konstruktor aufgerufene Methode).
private readonly int num;
private readonly System.Random rand = new System.Random();
public MyClass(int num)
{
this.num = num;
}
In sicherheitskritischen Situationen (oder auch einfach in einer großen Codebasis, in der Entwickler unterschiedliche Prioritäten und Ziele haben) solltest du vermeiden, dass die öffentliche API einer Klasse umgangen werden kann, indem du veränderliche Parameter einer Methode akzeptierst und speicherst oder ein veränderliches Mitglied einer Klasse über einen Rückgabewert oder einen out-Parameter offenlegst.
Während der readonly-Modifizierer verhindert, dass der Wert oder die Referenz in einem Feld überschrieben wird, bietet er keinen Schutz für die Mitglieder eines Referenztyps.
readonly List<int> ints = new List<int>();
void Foo()
{
ints.Add(1); // ok
ints = new List<int>(); // fails to compile
}
Um sicherzustellen, dass alle Mitglieder eines Referenztyps geschützt sind, können die Felder als readonly deklariert und automatische Eigenschaften ohne einen set-Accessor definiert werden.
Die Base Class Library (BCL) stellt einige schreibgeschützte Versionen von Sammlungen bereit, wenn die Anforderung besteht, zu verhindern, dass Mitglieder einer Sammlung aktualisiert werden. Diese gibt es in Form von Wrappern:
ReadOnlyDictionary<T> stellt ein Dictionary<T> als schreibgeschützt bereit.ReadOnlyCollection<T> stellt ein List<T> als schreibgeschützt bereit.Das Authentifizierungssystem, das du zuletzt in developer-privileges gesehen hast, braucht etwas Aufmerksamkeit. Du wurdest damit beauftragt, den Code aufzuräumen. Ein solches Aufräumprojekt macht nicht nur zukünftigen Maintainern das Leben leichter, sondern deckt auch einige Sicherheitslücken auf und behebt sie.
Dies ist eine Refactoring-Aufgabe. Füge den const-Modifier zu allen Membern von Authenticator oder Identity hinzu, die du für geeignet hältst.
Dies ist eine Refactoring-Aufgabe. Füge den readonly-Modifier zu allen Feldern der Klasse Authenticator oder der Struktur Identity hinzu, die du für geeignet hältst.
Entferne den set-Accessor oder mache ihn private für jede geeignete Eigenschaft der Klasse Authenticator oder der Struktur Identity.
Derzeit gibt ein Aufruf von Admin das Feld mit der Admin-Identität zurück. Das ist nicht ideal, denn der Aufrufer kann das Feld verändern. Finde einen Weg, um zu verhindern, dass der Aufrufer die Details des Admins am Authenticator-Objekt verändern kann.
Derzeit gibt ein Aufruf von GetDevelopers() das Wörterbuch zurück, das die fest codierten privilegierten Entwickleridentitäten enthält. Das ist nicht ideal, denn der Aufrufer kann das Wörterbuch verändern. Finde einen Weg, um zu verhindern, dass der Aufrufer die Details der Entwickler am Authenticator-Objekt verändern kann.
Melde dich bei Exercism an, um C# mit 62 Konzepte178 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.