Condividi tramite


operatori true e false: considerare gli oggetti come valore booleano

L'operatore true restituisce il valore bool true per indicare che il relativo operando è sicuramente true, mentre l'operatore false restituisce il valore booltrue per indicare che il relativo operando è sicuramente false.
Si noti che un tipo che implementa entrambi gli operatori true e false deve seguire queste semantiche:

  • "L'oggetto è true?" viene risolto nell'operatore true. L'operatore true restituisce true se l'oggetto è true. La risposta è "Sì, questo oggetto è true".
  • "L'oggetto è false?" viene risolto nell'operatore false. L'operatore false restituisce true se l'oggetto è false. La risposta è "Sì, questo oggetto è false".

Gli operatori true e false non sono necessariamente complementari tra loro. Questo significa che entrambi gli operatori true e false possono restituire il valore boolfalse per lo stesso operando. Se un tipo definisce uno di questi due operatori, deve definire anche l'altro operatore.

Suggerimento

Usare il tipo bool? se occorre supportare la logica a tre valori, ad esempio quando si lavora con database che supportano un tipo booleano a tre valori. In C# sono disponibili gli operatori & e | che supportano la logica a tre valori con gli operandi bool?. Per altre informazioni, vedere la sezione Operatori logici booleani nullable dell'articolo Operatori logici booleani.

Espressioni booleane

Un tipo con l'operatore true definito può essere il tipo di un risultato di un'espressione condizionale di controllo nelle istruzioni if, do, while e for e nell'operatore condizionale ?:. Per altre informazioni, vedere la sezione Espressioni booleane della specifica del linguaggio C#.

Operatori logici condizionali definiti dall'utente

Se un tipo con gli operatori true e false definiti esegue l'overload dell'operatore logico OR| o dell'operatore AND logico & in un certo modo, l'operatore OR logico condizionale || oppure l'operatore AND logico condizionale &&, rispettivamente, può essere valutato per gli operandi di quel tipo. Per altre informazioni, vedere la sezione Operatori logici condizionali definiti dall'utente di Specifica del linguaggio C#.

Esempio

L'esempio seguente presenta il tipo che definisce entrambi gli operatori true e false. Il tipo esegue anche l'overload dell'operatore AND logico & in modo tale che anche l'operatore && possa essere valutato per gli operandi di quel tipo.

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

Si noti il comportamento che causa il corto circuito dell'operatore &&. Quando il metodo GetFuelLaunchStatus restituisce LaunchStatus.Red, l'operando di destra dell'operatore && non viene valutato. Il motivo è che LaunchStatus.Red è indubbiamente false. Pertanto il risultato dell'operatore AND logico non dipende dal valore dell'operando di destra. L'output dell'esempio è il seguente:

Getting fuel launch status...
Wait!

Vedi anche