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érateur true retourne true si l’objet est true. 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érateur false retourne true si l’objet est false. 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 boolfalse 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 surchargel’opérateur OR logique| ou l’opérateur AND logique& d’une façon, l’opérateur OR logique conditionnel|| ou l’opérateur AND logique conditionnel&&, respectivement, peut ê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!

Voir aussi