Operatoren „true“ und „false“ – Behandeln Ihrer Objekte als boolesche Werte
Der Operator true
gibt den bool-Wert true
zurück, um anzugeben, dass der Operand definitiv „true“ ist, während der Operator false
den bool
-Wert true
zurückgibt, um anzugeben, dass der Operand definitiv „false“ ist.
Beachten Sie, dass ein Typ, der beide Operatoren true
und false
implementiert, diese Semantik befolgen muss:
- „Ist dieses Objekt true?“ wird in den Operator
true
aufgelöst. Der Operatortrue
gibttrue
zurück, wenn das Objekttrue
ist. Die Antwort lautet „Ja, dieses Objekt ist true“. - „Ist dieses Objekt false?“ wird in den Operator
false
aufgelöst. Der Operatorfalse
gibttrue
zurück, wenn das Objektfalse
ist. Die Antwort lautet „Ja, dieses Objekt ist false“.
Es ist nicht garantiert, dass sich die Operatoren true
und false
gegenseitig ergänzen. Dies bedeutet, dass sowohl der Operator true
als auch der Operator false
möglicherweise den bool
-Wert false
für den gleichen Operanden zurückgeben. Wenn ein Typ einen dieser beiden Operatoren definiert, muss er auch den anderen Operator definieren.
Tipp
Verwenden Sie den Typ bool?
, wenn Sie die dreiwertige Logik unterstützen müssen (z. B. wenn Sie mit Datenbanken arbeiten, die einen dreiwertigen booleschen Typ unterstützen). C# stellt die &
- und |
-Operatoren zur Verfügung, die die dreiwertige Logik mit den bool?
-Operanden unterstützen. Weitere Informationen finden Sie im Abschnitt Boolesche logische Operatoren, die NULL-Werte zulassen im Artikel Boolesche logische Operatoren.
Boolesche Ausdrücke
Ein Typ mit dem definierten true
-Operator kann der Typ des Ergebnisses eines steuernden bedingten Ausdrucks in if-, do-, while- und for-Anweisungen und im bedingten Operator ?:
sein. Weitere Informationen finden Sie im Abschnitt Boolescher Ausdruck der C#-Sprachspezifikation.
Benutzerdefinierte bedingte logische Operatoren
Wenn ein Typ mit den definierten Operatoren true
und false
den logischen OR-Operator |
oder den logischen AND-Operator &
in einer bestimmten Weise überlädt, kann der bedingte logische OR-Operator ||
bzw. der bedingte logische AND-Operator &&
für Operanden dieses Typs ausgewertet werden. Weitere Informationen finden Sie im Abschnitt Benutzerdefinierte bedingte logische Operatoren der C#-Sprachspezifikation.
Beispiel
Das folgende Beispiel zeigt den Typen, der sowohl true
- als auch false
-Operatoren definiert. Außerdem überlädt der Typ den logischen AND-Operator &
so, dass der Operator &&
auch für die Operanden dieses Typs ausgewertet werden kann.
public struct LaunchStatus
{
public static readonly LaunchStatus Green = new LaunchStatus(0);
public static readonly LaunchStatus Yellow = new LaunchStatus(1);
public static readonly LaunchStatus Red = new LaunchStatus(2);
private int status;
private LaunchStatus(int status)
{
this.status = status;
}
public static bool operator true(LaunchStatus x) => x == Green || x == Yellow;
public static bool operator false(LaunchStatus x) => x == Red;
public static LaunchStatus operator &(LaunchStatus x, LaunchStatus y)
{
if (x == Red || y == Red || (x == Yellow && y == Yellow))
{
return Red;
}
if (x == Yellow || y == Yellow)
{
return Yellow;
}
return Green;
}
public static bool operator ==(LaunchStatus x, LaunchStatus y) => x.status == y.status;
public static bool operator !=(LaunchStatus x, LaunchStatus y) => !(x == y);
public override bool Equals(object obj) => obj is LaunchStatus other && this == other;
public override int GetHashCode() => status;
}
public class LaunchStatusTest
{
public static void Main()
{
LaunchStatus okToLaunch = GetFuelLaunchStatus() && GetNavigationLaunchStatus();
Console.WriteLine(okToLaunch ? "Ready to go!" : "Wait!");
}
static LaunchStatus GetFuelLaunchStatus()
{
Console.WriteLine("Getting fuel launch status...");
return LaunchStatus.Red;
}
static LaunchStatus GetNavigationLaunchStatus()
{
Console.WriteLine("Getting navigation launch status...");
return LaunchStatus.Yellow;
}
}
Beachten Sie das kurzschließende Verhalten des &&
-Operators. Wenn die GetFuelLaunchStatus
-Methode LaunchStatus.Red
zurückgibt, wird der rechte Operand des &&
-Operators nicht ausgewertet. Der Grund dafür ist, dass LaunchStatus.Red
definitiv „false“ ist. Dann hängt das Ergebnis des logischen AND-Operators nicht vom Wert des rechten Operanden ab. Im Beispiel wird Folgendes ausgegeben:
Getting fuel launch status...
Wait!