operatory true i false — traktują obiekty jako wartość logiczną

Operator true zwraca wartość true logiczną, aby wskazać, że jego operand jest zdecydowanie prawdziwy, podczas gdy false operator zwraca bool wartośćtrue, aby wskazać, że jego operand jest zdecydowanie fałszywy.
Należy pamiętać, że typ implementujący zarówno operatory, jak true i false muszą być zgodne z tymi semantykami:

  • "Czy ten obiekt ma wartość true?" jest rozpoznawany jako operator true. Operator true zwraca wartość true , jeśli obiekt ma wartość true. Odpowiedź brzmi "Tak, ten obiekt jest prawdziwy".
  • "Czy ten obiekt false?" jest rozpoznawany jako operator false. Operator false zwraca wartość true , jeśli obiekt ma wartość false. Odpowiedź to "Tak, ten obiekt jest fałszywy"

Operatory true i false nie mają gwarancji, że się uzupełniają. Oznacza to, że operator true i false może zwrócić bool wartość false dla tego samego operandu. Jeśli typ definiuje jeden z tych dwóch operatorów, musi również zdefiniować drugi operator.

Napiwek

bool? Użyj typu , jeśli potrzebujesz obsługi trzywartej logiki (na przykład podczas pracy z bazami danych obsługującymi trzywarty typ logiczny). Język C# udostępnia & operatory i | , które obsługują trzywarte logiki z bool? operandami. Aby uzyskać więcej informacji, zobacz sekcję Operatory logiczne dopuszczane do wartości null w artykule Logiczne operatory logiczne.

Wyrażenia logiczne

Typ ze zdefiniowanym true operatorem może być typem wyniku kontrolującego wyrażenia warunkowego w instrukcji if, do, while, oraz dla instrukcji i w operatorze ?:warunkowym . Aby uzyskać więcej informacji, zobacz sekcję Wyrażenia logiczne specyfikacji języka C#.

Warunkowe operatory logiczne zdefiniowane przez użytkownika

Jeśli typ ze zdefiniowanymi operatorami i przeciążaoperator| logiczny OR lub operator logiczny AND& w określony sposób, warunkowy operator|| LOGICZNY OR lub warunkowy operator&& LOGICZNY AND, odpowiednio, można ocenić dla operandów tego typu.falsetrue Aby uzyskać więcej informacji, zobacz sekcję Operatory logiczne warunkowe zdefiniowane przez użytkownika w specyfikacji języka C#.

Przykład

W poniższym przykładzie przedstawiono typ, który definiuje operatory true i .false Typ przeciąża również operator & logiczny AND w taki sposób, że && operator może być również oceniany dla operandów tego typu.

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

Zwróć uwagę na zachowanie && zwarć operatora. GetFuelLaunchStatus Gdy metoda zwraca LaunchStatus.Redwartość , operand && po prawej stronie operatora nie jest obliczany. To dlatego, że LaunchStatus.Red jest zdecydowanie fałszywe. Następnie wynik logiczny AND nie zależy od wartości operandu po prawej stronie. Dane wyjściowe przykładu są następujące:

Getting fuel launch status...
Wait!

Zobacz też