Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Lassen 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 eine ServerConfig-Klasse im Namespace Settings, die die Serverkonfiguration verwaltet. Sie sollte Folgendes enthalten:
    • Eine schreibgeschützte Eigenschaft ServerName (kann nur im Konstruktor gesetzt werden)
    • Eine schreibgeschützte Eigenschaft Port mit 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), die true zurückgibt, wenn der angegebene Schlüssel mit dem gespeicherten übereinstimmt
    • Einen Konstruktor, der den Servernamen und den Port entgegennimmt
  • Program.cs: Erstellen Sie in Ihrer Hauptdatei ein ServerConfig-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: True

Spickzettel

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}
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung