Neu in .NET 10.0 [4]: Neue Operatorüberladungen in C# 14.0
C# 14.0 bietet auch Operatorüberladungen für zusammengesetzte Zuweisungsoperatoren.
(Bild: Pincasso/Shutterstock)
- Dr. Holger Schwichtenberg
Operatorüberladungen beherrscht die Programmiersprache C# seit ihrer ersten Version aus dem Jahr 2002 mit dem Schlüsselwort operator.
In C# 14.0 hat Microsoft dabei nun eine Verbesserungsmöglichkeit entdeckt: Entwicklerinnen und Entwickler können jetzt für die zusammengesetzten/verkürzten Zuweisungsoperatoren (engl. Compound Assignment Operators) +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= und >>>= eigene Operatorimplementierungen definieren.
Bisher wurden hier immer die Operatorimplementierungen des Basisoperators (also + bei +=, - bei -=, & bei &= usw.) aufgerufen. Das passiert auch weiterhin, aber nur, wenn es keine eigene Operatorimplementierung für den Compound Assignment Operator gibt.
Videos by heise
Das erlaubt mehr Kontrolle über die Speichernutzung: Bei den zusammengesetzten/verkürzten Zuweisungsoperatoren kann man die Operation zwischen zwei Objekten so implementieren, dass kein neues Objekt erzeugt wird, sondern ein bestehendes Objekt weiterverwendet wird.
Die Compound Assignment Operators sind (anders als andere Operatoren) nicht static und geben void zurück, da sie das Objekt selbst manipulieren.
Folgender Codeausschnitt verwendet die User Defined Compound Assignment Operators:
namespace NET10_Console;
/// <summary>
/// Klasse mit Operatorüberladung für +, ++ und +=
/// </summary>
public class Kontostand
{
public string IBAN { get; set; }
public decimal Betrag { get; set; }
public Kontostand(string iBAN, decimal betrag)
{
Betrag = betrag;
IBAN = iBAN;
}
// ALT: Operatorüberladung für +
public static Kontostand operator +(Kontostand a, Kontostand b)
{
if (a == null || b == null)
throw new ArgumentNullException();
return new Kontostand(a.IBAN, a.Betrag + b.Betrag);
}
// NEU: Operatorüberladung für ++
public void operator ++()
{
this.Betrag += 1;
}
// NEU: Operatorüberladung für +=
public void operator +=(decimal b)
{
this.Betrag += b;
}
public override string ToString()
{
return $"Konto {IBAN}: {Betrag:c}"; // formatiert als Währung
(rme)