Nur lesbare/schreibbare Eigenschaften
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy. Lektion 11 von 70.
Manchmal benötigst du Eigenschaften, die nur gelesen oder nur geschrieben werden können. Du kannst dies steuern, indem du private für einzelne Accessoren verwendest.
Eine schreibgeschützte Eigenschaft hat einen öffentlichen Getter, aber einen privaten setter (oder überhaupt 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 bei der Konstruktion einmal festgelegt werden sollten.
Eine schreibgeschützte 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;
}
}Nur-Schreib-Eigenschaften sind selten, aber nützlich für sensible Daten wie Passwörter, wenn du Eingaben akzeptieren möchtest, ohne den gespeicherten Wert offenzulegen.
Du kannst auch wirklich 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 ausschließlich get; können nur im Konstruktor oder bei der Deklaration zugewiesen werden und sind nach der Erstellung des Objekts unveränderlich.
Aufgabe
EinfachErstellen wir ein sicheres Konfigurationssystem, das veranschaulicht, wann schreibgeschützte und nur beschreibbare Eigenschaften zum Schutz sensibler Daten verwendet werden.
Du wirst zwei Dateien erstellen, um deinen Code zu organisieren:
Config.cs: Definiere eineServerConfig-Klasse imSettings-Namespace, die die Serverkonfiguration verwaltet. Sie sollte Folgendes enthalten:- Eine schreibgeschützte Eigenschaft
ServerName(kann nur im Konstruktor festgelegt werden) - Eine schreibgeschützte Eigenschaft
Portmit einem privaten Setter (wird über den Konstruktor festgelegt) - Eine nur beschreibbare Eigenschaft
ApiKey, die einen geheimen Schlüssel intern speichert - Eine Methode
ValidateApiKey(string key), dietruezurückgibt, wenn der bereitgestellte Schlüssel mit dem gespeicherten übereinstimmt - Einen Konstruktor, der den Servernamen und den Port akzeptiert
- Eine schreibgeschützte Eigenschaft
Program.cs: Erstelle in deiner Hauptdatei einServerConfig-Objekt mithilfe von Eingabewerten, lege den API-Schlüssel fest und validiere ihn anschließend gegen einen Testschlüssel.
Du erhältst vier Eingaben:
- Servername
- Portnummer
- Zu speichernder API-Schlüssel
- Zu validierender API-Schlüssel
Gib 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 lauten, sollte die Ausgabe wie folgt aussehen:
Server: MainServer, Port: 8080
API Key Valid: TrueProbier 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-Schlüssel über die nur-schreibbare Eigenschaft
// TODO: Validiere den API-Schlüssel 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. EigenschaftenKonstruktorenObjektinitialisiererWiederholung – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbungs-(:)-SyntaxDas „base“-Schlüsselwort„virtual“- und „override“-SchlüsselwörterVersiegelte KlassenDie „object“-BasisklasseWiederholung – Mitarbeiterhierarchie7Erweiterte Funktionen
Überladen von OperatorenIndexer (this[])ToString()-ÜberschreibungErweiterungsmethodenRückblick – Benutzerdefinierte Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterThread-sicheres SingletonFactory-MusterObserver-Muster (Events)Strategy-Muster13Abschließende Herausforderungen
E-Learning-PlattformKomponente für SpielfigurenFahrzeugvermietungsdienst2Eigenschaften & statische Member
Automatisch implementierte EigenschaftenNur lesbare/schreibbare EigenschaftenStatische Felder & MethodenStatische KlassenMember mit Ausdruckskörpern5Polymorphie & Interfaces
Compile- vs. Laufzeit-PolymorphieInterface vs. abstrakte KlasseMehrere InterfacesExplizite InterfacesUpcasting & DowncastingWiederholung – Formenrechner3Klassenarchitektur
Instanz- vs. statische DatenSchlüsselwörter 'readonly' & 'const'Backing FieldsRückblick – Bankkontenverwaltung6Kapselung
ZugriffsmodifikatorenEigenschaften zur KapselungImplementierung der DatenkapselungMuster für UnveränderlichkeitRückblick – SchülerdatenÜbe selbstständig: Online-C#-Compiler