Share via


true- och false-operatorer – behandla dina objekt som ett booleskt värde

Operatorn true returnerar bool-värdettrue för att indikera att dess operand definitivt är sann, medan operatorn false returnerar bool värdet true för att indikera att dess operand definitivt är falsk.
Observera att en typ som implementerar både true och false operatorer måste följa dessa semantik:

  • "Är det här objektet sant?" matchar operatorn true. Operatorn true returnerar true om objektet är true. Svaret är "Ja, det här objektet är sant".
  • "Är det här objektet falskt?" matchar operatorn false. Operatorn false returnerar true om objektet är false. Svaret är "Ja, det här objektet är falskt"

Operatorerna true och false är inte garanterade att komplettera varandra. Det innebär att både operatorn true och false kan returnera bool värdet false för samma operand. Om en typ definierar en av dessa två operatorer måste den också definiera den andra operatorn.

Dricks

Använd typen bool? om du behöver stöd för logik med tre värden (till exempel när du arbetar med databaser som stöder en boolesk typ med tre värden). C# tillhandahåller operatorerna & och | som stöder trevärdeslogik med bool? operanderna. Mer information finns i avsnittet Booleska logiska operatorer som kan ogiltigförklaras i artikeln Booleska logiska operatorer .

Booleska uttryck

En typ med den definierade true operatorn kan vara typen av ett resultat av ett kontrollerande villkorsuttryck i if, do, while och for statements och i villkorsoperatorn ?:. Mer information finns i avsnittet Booleska uttryck i C#-språkspecifikationen.

Användardefinierade villkorsstyrda logiska operatorer

Om en typ med de definierade operatorerna och false operatorerna överbelastar den logiska OR-operatorn| eller den logiska AND-operatorn& på ett visst sätt, kan den villkorliga logiska OR-operatorn|| respektive den villkorsstyrda logiska AND-operatorn&& utvärderas för operanderna av den typen.true Mer information finns i avsnittet Användardefinierade villkorsstyrda logiska operatorer i C#-språkspecifikationen.

Exempel

I följande exempel visas den typ som definierar både true operatorer och false operatorer. Typen överbelastar också den logiska AND-operatorn & på ett sådant sätt att operatorn && också kan utvärderas för operanderna av den typen.

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

Observera operatorns kortslutningsbeteende && . GetFuelLaunchStatus När metoden returnerar LaunchStatus.Redutvärderas inte operatorns && högra operande. Det beror på att LaunchStatus.Red är definitivt falskt. Resultatet av det logiska AND-värdet beror inte på värdet för den högra operanden. Resultatet av exemplet är följande:

Getting fuel launch status...
Wait!

Se även