opérateurs true et false : traitez vos objets comme une valeur booléenne
L’opérateur true
retourne la valeur booltrue
pour indiquer que son opérande est certainement vrai, tandis que l’opérateur false
retourne la bool
valeur true
pour indiquer que son opérande est certainement faux.
Notez qu’un type implémentant à la fois true
et false
les opérateurs doit suivre ces sémantiques :
- « Cet objet a-t-il la valeur true ? » est résolu en opérateur
true
. L’opérateurtrue
retournetrue
si l’objet esttrue
. La réponse est « Oui, cet objet est vrai ». - « Cet objet a-t-il la valeur false ? » est résolu en opérateur
false
. L’opérateurfalse
retournetrue
si l’objet estfalse
. La réponse est « Oui, cet objet est false »
Les opérateurs true
et false
ne sont pas forcément complémentaires. Autrement dit, les opérateurs true
et false
peuvent retourner la valeur bool
false
pour le même opérande. Si un type définit un des deux opérateurs, il doit aussi définir un autre opérateur.
Conseil
Utilisez le type bool?
si vous voulez suivre une logique à trois valeurs, par exemple pour travailler avec des bases de données qui acceptent un type booléen à trois valeurs. C# fournit les opérateurs &
et |
qui prennent en charge la logique à trois valeurs avec les opérandes bool?
. Pour plus d’informations, voir la section Opérateurs logiques booléens Nullable de l’article Opérateurs logiques booléens.
Expressions booléennes
Un type avec l’opérateur true
défini peut être le type de résultat d’une expression conditionnelle de contrôle dans les instructions if, do, while et for et dans l’opérateur conditionnel ?:
. Pour plus d’informations, voir la section Expressions booléennes de la spécification du langage C#.
Opérateurs logiques conditionnels définis par l’utilisateur
Si un type, avec les opérateurs true
et false
définis, surcharge l’opérateur OU le logique |
ou l’opérateur ET le logique &
d’une façon, l’opérateur OU le logique conditionnel ||
ou l’opérateur ET le logique conditionnel &&
, respectivement, peuvent être évalué pour les opérandes de ce type. Pour plus d’informations, consultez la section Opérateurs logiques conditionnels définis par l’utilisateur de la spécification du langage C#.
Exemple
L’exemple suivant présente le type qui définit les opérateurs true
et false
. Le type surcharge également l’opérateur AND logique &
de sorte que l’opérateur &&
peut aussi être évalué pour les opérandes de ce type.
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;
}
}
Remarquez le comportement de court-circuit de l’opérateur &&
. Lorsque la méthode GetFuelLaunchStatus
retourne LaunchStatus.Red
, l’opérande de la partie droite de l’opérateur &&
n’est pas évalué. En effet, LaunchStatus.Red
est false. Le résultat du AND logique ne dépend donc pas de la valeur de l’opérande de partie droite. Voici la sortie de l’exemple :
Getting fuel launch status...
Wait!