Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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!