Neu in .NET 10.0 [4]: Neue Operatorüberladungen in C# 14.0
C# 14.0 bietet auch Operatorüberladungen für zusammengesetzte Zuweisungsoperatoren.
Operatorüberladungen beherrscht die Programmiersprache C# seit ihrer ersten Version aus dem Jahr 2002 mit dem Schlüsselwort operator.

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.
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.
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)