Zum Hauptinhalt springen

Operatorüberladung

Operatorüberladung

Die Operatorüberladung in ermöglicht es, benutzerdefinierte Implementierungen für bestimmte Operatoren zu definieren, wenn Sie Ihre eigenen Klassen oder Strukturen erstellen. Dadurch kann angeben werden, wie Instanzen von benutzerdefinierten Typen mit den eingebauten C#-Operatoren behandelt werden sollen. Bei der Erstellung der Operator Methode müssen bei Umkehrungen immer beide Richtungen implementiert werden. Implementiere ich z.B. > muss auch < implementiert werden.

 public class FootballPlayer
{
public string Name { get; set; }
public int Age { get; set; }
public string Club { get; set; }
public double MarketValue { get; set; }

public static bool operator >(FootballPlayer left, FootballPlayer right)
{
if (left == null || right == null)
throw new InvalidOperationException();
return left.MarketValue > right.MarketValue;
}

public static bool operator <(FootballPlayer left, FootballPlayer right)
{
if (left == null || right == null)
throw new InvalidOperationException();
return left.MarketValue < right.MarketValue;
}
}

Nun können die Fußballspieler über > und < verglichen werden.

static void Main(string[] args)
{
FootballPlayer player1 = new FootballPlayer
{
Name = "David Storm",
Age = 27,
Club = "Thunder United",
MarketValue = 45.0 // in Millionen Euro
};

FootballPlayer player2 = new FootballPlayer
{
Name = "Max Lightning",
Age = 30,
Club = "Sky Strikers",
MarketValue = 55.5 // in Millionen Euro
};

if (player1 > player2)
Console.WriteLine("Player1 has an higher market value");
}

Benutzerdefinierte Topkonvertierung

Benutzerdefinierte Typkonvertierungen ermöglichen es, benutzerdefinierte Konvertierungsmethoden zu erstellen, um zwischen verschiedenen Typen zu konvertieren. Dazu gehören explizite und implizite Konvertierungen.

public class Celsius
{
public float Temperature { get; set; }

public static explicit operator Celsius(Fahrenheit fahrenheit)
{
Celsius celsius = new Celsius();
celsius.Temperature = (fahrenheit.Temperature * 9 / 5) + 32;
return celsius;
}
}

public class Fahrenheit
{
public float Temperature { get; set; }

public static implicit operator Fahrenheit(Celsius celsius)
{
Fahrenheit fahrenheit = new Fahrenheit();
fahrenheit.Temperature = 1.8f * celsius.Temperature + 32;
return fahrenheit;
}
}

static void Main(string[] args)
{
Celsius celsius = new Celsius
{
Temperature = 20
};

// will be implicit casted
Fahrenheit fahrenheit = celsius;
Console.WriteLine($"It's {fahrenheit.Temperature} F today");

// must explicit casted
Celsius convertBackCelsius = (Celsius)fahrenheit;
Console.WriteLine($"It's {celsius.Temperature} C today");
}

Kommentare