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
. Operatortrue
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
. Operatorfalse
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ąża operator |
logiczny OR lub operator logiczny AND &
w określony sposób, warunkowy operator ||
LOGICZNY OR lub warunkowy operator &&
LOGICZNY AND , można odpowiednio ocenić dla operandów tego typu.false
true
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.Red
wartość , 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!