Structs: Wertsemantik und Muster für Unveränderlichkeit
Verstehen Sie die Wertsemantik von Structs in C# 6 und erstellen Sie ein Muster für unveränderliche Structs (Änderungen durch Kopieren).
Structs: Wertsemantik und Muster für Unveränderlichkeit ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 1 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 Structs
Ziel: Verwenden Sie Structs sicher.
- Wertsemantik (Kopie bei Zuweisung)
- Muster für unveränderliche Structs in C# 6
- Übergabe als Wert oder als Referenz
- Hinweis zum Boxing
Kopiersemantik
Structs sind Werttypen: Bei einer Zuweisung wird eine Kopie erstellt. Änderungen an der Kopie verändern das Original nicht.
using System;
// Simple struct with public fields for demo (okay for small POD data)
public struct Point
{
public int X;
public int Y;
}
public class Program
{
public static void Main(string[] args)
{
Point a = new Point();
a.X = 1; a.Y = 2;
Point b = a; // copy the value
b.X = 9; // change the copy
Console.WriteLine("a=(" + a.X + "," + a.Y + ")");
Console.WriteLine("b=(" + b.X + "," + b.Y + ")"); // different from a
}
}
Muster für unveränderliche Structs
Bevorzugen Sie unveränderliche Structs: schreibgeschützte Felder, einen Konstruktor für den erforderlichen Zustand und kleine With-Hilfsmethoden für neue Werte.
using System;
// Immutable struct pattern (C# 6): readonly fields + constructor + With method
public struct Money
{
private readonly decimal _amount;
private readonly string _currency;
public decimal Amount { get { return _amount; } }
public string Currency { get { return _currency; } }
public Money(decimal amount, string currency)
{
_amount = amount;
_currency = currency ?? "USD";
}
// Copy-on-change: returns a new value with updated amount
public Money WithAmount(decimal amount)
{
return new Money(amount, _currency);
}
}
public class Program
{
public static void Main(string[] args)
{
Money m1 = new Money(10m, "USD");
Money m2 = m1.WithAmount(15m); // new value
Console.WriteLine("m1: " + m1.Amount + " " + m1.Currency);
Console.WriteLine("m2: " + m2.Amount + " " + m2.Currency);
}
}
Als Wert oder als Referenz
Methoden erhalten standardmäßig eine Kopie. Verwenden Sie ref, um das Struct des Aufrufers zu ändern.
using System;
public struct Counter
{
public int Value;
}
public class Program
{
static void IncrementByValue(Counter c)
{
c.Value = c.Value + 1; // changes only the local copy
}
static void IncrementByRef(ref Counter c)
{
c.Value = c.Value + 1; // changes the caller's variable
}
public static void Main(string[] args)
{
Counter a = new Counter();
IncrementByValue(a);
Console.WriteLine("After by-value: " + a.Value); // 0
IncrementByRef(ref a);
Console.WriteLine("After by-ref: " + a.Value); // 1
}
}
Grundlagen des Boxing
Beim Boxing wird ein Struct in eine Objekt- oder Schnittstellenreferenz kopiert. Beim Unboxing wird eine weitere Kopie erstellt.
using System;
public interface IShow { string Show(); }
public struct Temperature : IShow
{
public int C;
public string Show() { return C + "C"; }
}
public class Program
{
public static void Main(string[] args)
{
Temperature t = new Temperature();
t.C = 25;
object boxed = t; // boxing: copy into object
Temperature copy = (Temperature)boxed; // unbox (another copy)
copy.C = 30;
Console.WriteLine("t = " + t.C); // 25
Console.WriteLine("copy = " + copy.C); // 30
}
}
Tipps zu Structs
Tipps:
- Verwenden Sie Structs für kleine, unveränderliche Wertobjekte (Koordinaten, Geldbeträge).
- Vermeiden Sie große oder stark veränderliche Structs.
- Denken Sie an Kopien bei Zuweisungen und bei der Übergabe als Wert.
- Beachten Sie Boxing, wenn Sie in object oder eine Schnittstelle umwandeln.
Wertsemantik von Structs
Zusammenfassung
Zusammenfassung: Structs sind Werttypen. Bevorzugen Sie kleine, unveränderliche Designs (Konstruktor + readonly-Felder + With). Beachten Sie, wie die Übergabe als Wert oder mit ref und das Boxing sich auf Kopien auswirken.
Häufig gestellte Fragen
Ist die Lektion „Structs: Wertsemantik und Muster für Unveränderlichkeit“ kostenlos?
Ja — der vollständige Text von „Structs: Wertsemantik und Muster für Unveränderlichkeit“ 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 „Structs: Wertsemantik und Muster für Unveränderlichkeit“?
Verstehen Sie die Wertsemantik von Structs in C# 6 und erstellen Sie ein Muster für unveränderliche Structs (Änderungen durch Kopieren). 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 1 von 3.
Wie lange dauert die Lektion „Structs: Wertsemantik und Muster für Unveränderlichkeit“?
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
- Structs: Wertsemantik und Muster für Unveränderlichkeit
- Record-ähnliche Typen und wertbasierte Gleichheit (Muster)
- Enums und [Flags]