C# Operatorüberladung: Benutzerdefinierte Operatoren für eigene Typen
Operatorüberladung
C# erlaubt die Neudefinition der meisten eingebauten Operatoren für benutzerdefinierte Typen (struct, class). Ein überladener Operator ist eine static Methode mit dem Namen operator <Symbol>.
Syntax
public static ReturnType operator Op(ParameterList)
{
// Implementierung
}
- Mindestens ein Parameter muss der definierende Typ sein.
- Unäre Operatoren: ein Parameter. Binäre Operatoren: zwei Parameter.
- Rückgabetyp meist der definierende Typ (bei Vergleichsoperatoren
bool).
Beispiel: Box-Klasse mit + Operator
public class Box
{
private double Length, Breadth, Height;
public double Volume => Length * Breadth * Height;
public void SetDimensions(double l, double b, double h)
{
Length = l; Breadth = b; Height = h;
}
// Addition zweier Boxen
public static Box operator +(Box b1, Box b2)
{
Box result = new Box();
result.Length = b1.Length + b2.Length;
result.Breadth = b1.Breadth + b2.Breadth;
result.Height = b1.Height + b2.Height;
return result;
}
}
// Nutzung
Box box1 = new Box(); box1.SetDimensions(6, 7, 5); // Vol 210
Box box2 = new Box(); box2.SetDimensions(12, 13, 10); // Vol 1560
Box box3 = box1 + box2; // nutzt operator+
Console.WriteLine($"Volume: {box3.Volume}"); // 5400 (18×20×15)
Überladbare vs. Nicht überladbare Operatoren
| Kategorie | Operatoren | Überladbar? |
|---|---|---|
| Unär | + - ! ~ ++ -- true false | Ja |
| Binär (arithmetisch) | + - * / % | Ja |
| Vergleich | == != < > <= >= | Ja (paarweise: ==/!=, </>, <=/>=) |
| Bedingt-logisch | && || | Nein (aber über &, |, true, false indirekt) |
| Zuweisung | += -= *= /= %= | Nein (werden aus binärem Operator + = synthetisiert) |
| Andere | = . ?: -> new is sizeof typeof | Nein |
Vergleichsoperatoren überladen
Bei Überladung von == muss != ebenfalls überladen werden. Empfohlen: Auch Equals() und GetHashCode() überschreiben.
public static bool operator ==(Box lhs, Box rhs)
{
if (ReferenceEquals(lhs, null)) return ReferenceEquals(rhs, null);
return lhs.Equals(rhs);
}
public static bool operator !=(Box lhs, Box rhs) => !(lhs == rhs);
public override bool Equals(object obj) => obj is Box other && this == other;
public override int GetHashCode() => HashCode.Combine(Length, Breadth, Height);
Weitere Operatoren im Beispiel
< > <= >= // Vergleiche Volumen oder Dimensionen
ToString() // Für lesbare Ausgabe
Vollständiges Beispiel (Auszug)
public static bool operator <(Box lhs, Box rhs) =>
lhs.Length < rhs.Length && lhs.Breadth < rhs.Breadth && lhs.Height < rhs.Height;
public override string ToString() => $"({Length}, {Breadth}, {Height})";
Ausgabe:
Box 1: (6, 7, 5) Box 2: (12, 13, 10) Volume of Box1: 210 Volume of Box2: 1560 Box 3: (18, 20, 15) Volume of Box3: 5400 Box1 is not greater than Box2 Box1 is less than Box2 Box3 is equal to Box4
C Sprache
- C# Operatoren – Umfassender Leitfaden zu Operatoren in C#
- C# Ternärer Operator: Knapper Leitfaden zu bedingten Ausdrücken
- Methodenüberladung in C# meistern: Konzepte, Beispiele und Best Practices
- Konstruktorüberladung in C# meistern
- Operator Overloading in Python meistern: Ein praktischer Leitfaden
- Java instanceof-Operator: Ein umfassender Leitfaden
- DIY Wall-E-inspirierter Raspberry Pi CD-Box-Roboter
- Operator-beteiligte Instandhaltung: Überwiegen die Gewinne die versteckten Kosten?
- C++ Operator‑Overloading: Praktischer Leitfaden mit Code‑Beispielen
- C++ Overloading: Funktionen & Operatoren erklärt