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 bool
true
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'operatoretrue
restituiscetrue
se l'oggetto ètrue
. La risposta è "Sì, questo oggetto è true". - "L'oggetto è false?" viene risolto nell'operatore
false
. L'operatorefalse
restituiscetrue
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 bool
false
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!