Freigeben über


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 Operator true gibt true zurück, wenn das Objekt true ist. Die Antwort lautet „Ja, dieses Objekt ist true“.
  • „Ist dieses Objekt false?“ wird in den Operator false aufgelöst. Der Operator false gibt true zurück, wenn das Objekt false 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!

Weitere Informationen