True a false – zachází s objekty jako s logickou hodnotou
Operátor true
vrátí logickou hodnotu true
, která označuje, že jeho operand je rozhodně pravdivý, zatímco false
operátor vrátí bool
hodnotu true
, která označuje, že jeho operand je rozhodně nepravdivý.
Všimněte si, že typ, který implementuje oba true
operátory false
, musí dodržovat tyto sémantiky:
- "Je tento objekt pravdivý?" překládá na operátor
true
. Operátortrue
vrátítrue
, pokud jetrue
objekt . Odpověď je Ano, tento objekt je pravdivý. - "Je tento objekt false?" překládá na operátor
false
. Operátorfalse
vrátítrue
, pokud jefalse
objekt . Odpověď je Ano, tento objekt je false.
false
Operátory true
nejsou zaručeny, že se vzájemně doplňují. To znamená, že operátor true
i false
operátor může vrátit bool
hodnotu false
stejného operandu. Pokud typ definuje jeden z těchto dvou operátorů, musí také definovat druhý operátor.
Tip
bool?
Tento typ použijte, pokud potřebujete podporovat logiku se třemi hodnotami (například při práci s databázemi, které podporují logický typ se třemi hodnotami). Jazyk C# poskytuje operátory &
a |
operátory, které podporují logiku bool?
se třemi hodnotami s operandy. Další informace naleznete v části logické operátory logické operátory s možnou hodnotou Null v článku logické operátory logických operátorů s možnou hodnotou Null.
Logické výrazy
Typ s definovaným true
operátorem může být typ výsledku řízení podmíněného výrazu v if, do, while a pro příkazy a v podmíněném operátoru ?:
. Další informace najdete v části Logické výrazy specifikace jazyka C#.
Uživatelem definované podmíněné logické operátory
Pokud typ s definovanými a operátory přetěžuje logický operátor |
OR nebo logický operátor &
AND určitým způsobem, podmíněný logický operátor ||
OR nebo podmíněný logický operátor &&
AND , v uvedeném pořadí lze vyhodnotit pro operandy daného typu.false
true
Další informace najdete v části Podmíněné logické operátory definované uživatelem specifikace jazyka C#.
Příklad
Následující příklad představuje typ, který definuje jak a true
false
operátory. Typ také přetěžuje logický operátor &
AND takovým způsobem, že &&
operátor lze také vyhodnotit pro operandy daného 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;
}
}
Všimněte si chování zkratování operátoru &&
. Když metoda GetFuelLaunchStatus
vrátí LaunchStatus.Red
, pravý operand &&
operátoru se nevyhodnocuje. To je proto, že LaunchStatus.Red
je rozhodně nepravda. Výsledek logického operátoru AND pak nezávisí na hodnotě pravého operandu. Výstup příkladu je následující:
Getting fuel launch status...
Wait!