Read-Only- & Write-Only-Eigenschaften
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy — Lektion 11 von 70.
Manchmal benötigen Sie Eigenschaften, die nur gelesen oder nur geschrieben werden können. Sie können dies steuern, indem Sie private für einzelne Accessoren verwenden.
Eine schreibgeschützte Eigenschaft hat einen öffentlichen Getter, aber einen privaten Setter (oder gar keinen Setter):
public class User
{
public string Username { get; private set; }
public User(string username)
{
Username = username;
}
}Externer Code kann Username lesen, aber nur die Klasse selbst kann ihn ändern. Dies ist nützlich für Werte, die einmalig während der Konstruktion gesetzt werden sollten.
Eine Write-only-Eigenschaft hat einen öffentlichen Setter, aber einen privaten Getter:
public class Account
{
public string Password { private get; set; }
public bool ValidatePassword(string input)
{
return input == Password;
}
}Write-only-Eigenschaften sind selten, aber nützlich für sensible Daten wie Passwörter, bei denen man Eingaben akzeptieren möchte, ohne den gespeicherten Wert offenzulegen.
Sie können auch echte schreibgeschützte Eigenschaften mit nur einem Getter erstellen:
public class Circle
{
public double Radius { get; }
public double Area => Math.PI * Radius * Radius;
public Circle(double radius)
{
Radius = radius;
}
}Eigenschaften mit nur get; können nur im Konstruktor oder bei der Deklaration zugewiesen werden, was sie nach der Objekterstellung unveränderlich macht.
Aufgabe
EinfachLassen Sie uns ein sicheres Konfigurationssystem erstellen, das demonstriert, wann schreibgeschützte (read-only) und lesegeschützte (write-only) Eigenschaften verwendet werden sollten, um sensible Daten zu schützen.
Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:
Config.cs: Definieren Sie eineServerConfig-Klasse im NamespaceSettings, die die Serverkonfiguration verwaltet. Sie sollte Folgendes enthalten:- Eine schreibgeschützte Eigenschaft
ServerName(kann nur im Konstruktor gesetzt werden) - Eine schreibgeschützte Eigenschaft
Portmit einem privaten Setter (wird über den Konstruktor gesetzt) - Eine lesegeschützte Eigenschaft
ApiKey, die einen geheimen Schlüssel intern speichert - Eine Methode
ValidateApiKey(string key), dietruezurückgibt, wenn der angegebene Schlüssel mit dem gespeicherten übereinstimmt - Einen Konstruktor, der den Servernamen und den Port entgegennimmt
- Eine schreibgeschützte Eigenschaft
Program.cs: Erstellen Sie in Ihrer Hauptdatei einServerConfig-Objekt unter Verwendung von Eingabewerten, setzen Sie den API-Schlüssel und validieren Sie ihn anschließend gegen einen Testschlüssel.
Sie erhalten vier Eingaben:
- Servername
- Portnummer
- Zu speichernder API-Schlüssel
- Zu validierender API-Schlüssel
Geben Sie die Serverdetails und das Validierungsergebnis in diesem Format aus:
Server: {ServerName}, Port: {Port}
API Key Valid: {True/False}Wenn die Eingaben beispielsweise MainServer, 8080, secret123 und secret123 sind, sollte die Ausgabe wie folgt aussehen:
Server: MainServer, Port: 8080
API Key Valid: TrueSpickzettel
Sie können den Zugriff auf Eigenschaften steuern, indem Sie private für einzelne Accessoren verwenden.
Schreibgeschützte Eigenschaft (Read-only) mit einem privaten Setter:
public class User
{
public string Username { get; private set; }
public User(string username)
{
Username = username;
}
}Externer Code kann Username lesen, aber nur die Klasse selbst kann ihn ändern.
Nur-Lese-Eigenschaft (Write-only) mit einem privaten Getter:
public class Account
{
public string Password { private get; set; }
public bool ValidatePassword(string input)
{
return input == Password;
}
}Nützlich für sensible Daten, bei denen Sie Eingaben akzeptieren möchten, ohne den gespeicherten Wert offenzulegen.
Echte schreibgeschützte Eigenschaft mit nur einem Getter:
public class Circle
{
public double Radius { get; }
public Circle(double radius)
{
Radius = radius;
}
}Eigenschaften mit nur get; können nur im Konstruktor oder bei der Deklaration zugewiesen werden, was sie nach der Objekterstellung unveränderlich macht.
Probier es selbst
using System;
using Settings;
class Program
{
public static void Main(string[] args)
{
// Eingaben lesen
string serverName = Console.ReadLine();
int port = Convert.ToInt32(Console.ReadLine());
string apiKeyToStore = Console.ReadLine();
string apiKeyToValidate = Console.ReadLine();
// TODO: Erstelle ein ServerConfig-Objekt mit serverName und port
// TODO: Setze den API-Key über die write-only-Eigenschaft
// TODO: Validiere den API-Key und gib die Ergebnisse aus
// Format: Server: {ServerName}, Port: {Port}
// API Key Valid: {True/False}
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienNamespaces & DirektivenEinführung in Klassen & ObjekteDas 'this'-SchlüsselwortMethoden und ParameterFelder vs. EigenschaftenKonstruktorenObjekt-InitialisiererZusammenfassung - Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (:) SyntaxDas 'base'-SchlüsselwortVirtual & Override SchlüsselwörterVersiegelte KlassenDie 'object'-BasisklasseZusammenfassung – Mitarbeiter-Hierarchie7Fortgeschrittene Funktionen
OperatorüberladungIndexer (this[])ToString() überschreibenErweiterungsmethodenZusammenfassung - Benutzerdefinierte Liste2Eigenschaften & Statische Member
Automatisch implementierte EigenschaftenRead-Only- & Write-Only-EigenschaftenStatische Felder & MethodenStatische KlassenExpression-Bodied Member5Polymorphismus & Interfaces
Compile- vs. Runtime-PolymorphismusInterface vs. abstrakte KlasseMehrfache InterfacesExplizite InterfacesUpcasting & DowncastingRecap – Shape Calculator3Klassenarchitektur
Instanz- vs. statische Daten'readonly' & 'const' SchlüsselwörterBacking FieldsZusammenfassung - Bankkonto-Manager6Kapselung
ZugriffsmodifikatorenProperties zur KapselungImplementierung von Data HidingImmutability-MusterRückblick – Studierendendaten