Kapselung und Invarianten
Verbergen Sie den internen Zustand, stellen Sie sichere Operationen bereit und halten Sie Klasseninvarianten ein (z. B. ein nicht negativer Kontostand und gültige Wertebereiche).
Kapselung und Invarianten ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 3. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 3 Lektionen.
Überblick über die Kapselung
Ziel: Schützen Sie den Zustand Ihres Objekts.
- Kapselung: Felder verbergen und sichere APIs bereitstellen
- Invariante: eine Regel, die immer wahr ist
- Validieren Sie in Konstruktoren, Settern und Methoden
Nur-Lese-Schnittstelle
Halten Sie Felder privat. Stellen Sie Aufrufern eine schreibgeschützte Eigenschaft und sichere Operationen bereit.
using System;
// Expose read-only view; mutate via methods only
public class Counter
{
private int _value; // hidden state
public int Value // read-only to callers
{
get { return _value; }
private set { _value = value; } // keep setter private
}
public void Increment()
{
Value = Value + 1;
}
}
public class Program
{
public static void Main(string[] args)
{
Counter c = new Counter();
c.Increment();
c.Increment();
Console.WriteLine("Value = " + c.Value);
}
}
Prüfungen im Konstruktor
Konstruktoren legen den erforderlichen Zustand fest. Wehren Sie ungültige Eingaben ab, damit Objekte von Anfang an gültig sind.
using System;
// Enforce rules early (constructor guard)
public class User
{
public string Name { get; private set; }
public int Age { get; private set; }
public User(string name, int age)
{
if (string.IsNullOrEmpty(name)) throw new ArgumentException("name");
if (age < 0) throw new ArgumentOutOfRangeException("age");
Name = name;
Age = age;
}
}
public class Program
{
public static void Main(string[] args)
{
try
{
User u = new User("Ada", 28);
Console.WriteLine(u.Name + " (" + u.Age + ")");
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
}
Invarianten in der Praxis
Definieren Sie eine Invariante (z. B. Balance ≥ 0) und setzen Sie sie in Settern und Methoden durch.
using System;
// Invariant: Balance >= 0 at all times
public class BankAccount
{
private decimal _balance;
public decimal Balance
{
get { return _balance; }
private set
{
if (value < 0) throw new InvalidOperationException("Balance would be negative");
_balance = value;
}
}
public BankAccount(decimal opening)
{
if (opening < 0) throw new ArgumentOutOfRangeException("opening");
_balance = opening;
}
public void Deposit(decimal amount)
{
if (amount <= 0) throw new ArgumentOutOfRangeException("amount");
Balance = Balance + amount;
}
public bool TryWithdraw(decimal amount)
{
if (amount <= 0) return false;
if (Balance - amount < 0) return false;
Balance = Balance - amount;
return true;
}
}
public class Program
{
public static void Main(string[] args)
{
BankAccount a = new BankAccount(50m);
a.Deposit(20m);
bool ok = a.TryWithdraw(100m); // fails, invariant protected
Console.WriteLine("ok=" + ok + " balance=" + a.Balance);
}
}
Sammlungen schützen
Stellen Sie interne Listen oder Arrays nicht direkt bereit. Geben Sie eine Kopie (oder eine schreibgeschützte Ansicht) zurück, um Invarianten zu schützen.
using System;
using System.Collections.Generic;
public class Tags
{
private readonly List<string> _items = new List<string>();
public void Add(string tag)
{
if (string.IsNullOrWhiteSpace(tag)) return;
_items.Add(tag.Trim());
}
// Expose a copy so callers cannot mutate internal list
public List<string> GetAllCopy()
{
return new List<string>(_items);
}
}
public class Program
{
public static void Main(string[] args)
{
Tags t = new Tags();
t.Add(" apple ");
t.Add("banana");
List<string> view = t.GetAllCopy();
view.Add("hacker"); // modifies the copy only
Console.WriteLine("copy count=" + view.Count);
Console.WriteLine("original count=" + t.GetAllCopy().Count);
}
}
Tipps zur Kapselung
Checkliste:
- Private Felder, öffentliche Eigenschaften und Methoden.
- Validieren Sie im Konstruktor und in Settern.
- Halten Sie Invarianten nach jedem Aufruf aufrecht.
- Geben Sie interne Sammlungen nicht nach außen.
Prinzip der Kapselung
Zusammenfassung
Zusammenfassung: Kapseln Sie mit privaten Feldern und validierten APIs. Definieren Sie eine Invariante und setzen Sie sie in Konstruktoren, Settern und Methoden durch. Geben Sie interne Sammlungen niemals nach außen.
Häufig gestellte Fragen
Ist die Lektion „Kapselung und Invarianten“ kostenlos?
Ja — der vollständige Text von „Kapselung und Invarianten“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 3 Lektionen.
Was lerne ich in „Kapselung und Invarianten“?
Verbergen Sie den internen Zustand, stellen Sie sichere Operationen bereit und halten Sie Klasseninvarianten ein (z. B. ein nicht negativer Kontostand und gültige Wertebereiche). Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 3.
Wie lange dauert die Lektion „Kapselung und Invarianten“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Felder, automatische Properties und Objektinitialisierer
- Konstruktoren und statische Member
- Kapselung und Invarianten