operátory true a false (Referenční dokumentace jazyka C#)

trueOperátor vrátí hodnotu bool true pro indikaci, že jeho operand je jednoznačně true. falseOperátor vrátí bool hodnotu true pro indikaci, že jeho operand je jednoznačně false. trueOperátory and nejsou false zaručené doplňují sebe. To znamená, že true operátor i false může vracet bool hodnotu false pro stejný operand. Pokud typ definuje jeden ze dvou operátorů, musí také definovat jiný operátor.

Tip

Použijte bool? typ, pokud potřebujete podporovat logiku se třemi hodnotami (například při práci s databázemi, které podporují logický typ se třemi hodnotami). Jazyk C# poskytuje & | operátory a, které podporují logiku se třemi hodnotami s bool? operandy. Další informace naleznete v části s možnou hodnotou null logických operátorů v článku Boolean Logical Operators .

Logické výrazy

Typ s definovaným true operátorem může být typ výsledku řídicího podmíněného výrazu v příkazech if, do, whilea for a v podmíněných operátorech ?: . Další informace naleznete v části booleovské výrazy ve specifikaci jazyka C#.

Podmíněné logické operátory definované uživatelem

Pokud typ s definovanými true a false operátory přetěžuje logický operátor OR | nebo logického operátoru and, & lze pro operandy daného typu vyhodnotit podmíněný logický operátor or || nebo podmíněný logický operátor and && (v uvedeném pořadí). Další informace naleznete v části Podmíněné logické operátory definované uživatelem v tématu specifikace jazyka C#.

Příklad

Následující příklad představuje typ, který definuje true false operátory and. Typ také přetěžuje logický operátor AND tak & , že && operátor lze také vyhodnotit pro operandy daného typu.

using System;

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;
    }
}

Všimněte si chování operátoru při krátkém obvodu && . Když se GetFuelLaunchStatus Metoda vrátí LaunchStatus.Red , není && vyhodnocen pravý operand operátoru. Důvodem je, že LaunchStatus.Red je jednoznačně false. Pak výsledek logické hodnoty a není závislý na hodnotě operandu na pravé straně. Výstup příkladu je následující:

Getting fuel launch status...
Wait!

Viz také