igaz és hamis operátorok – az objektumok logikai értékként való kezelése
Az true
operátor a bool értéket true
adja vissza, amely azt jelzi, hogy az operandusa biztosan igaz, míg az false
operátor az bool
értéket true
adja vissza, hogy jelezze, hogy az operandusa egyértelműen hamis.
Vegye figyelembe, hogy egy mindkettőt true
és false
operátort megvalósító típusnak az alábbi szemantikát kell követnie:
- "Igaz ez az objektum?" feloldja az operátort
true
. Az operátortrue
akkor adtrue
vissza értéket, ha az objektum .true
A válasz: "Igen, ez az objektum igaz". - "Hamis ez az objektum?" operátorral oldja fel a
false
problémát. Az operátorfalse
akkor adtrue
vissza értéket, ha az objektum .false
A válasz: "Igen, ez az objektum hamis"
Az true
operátorok és false
az operátorok nem garantáltan kiegészítik egymást. Ez azt is jelentheti, hogy az operandus és false
az true
operátor is ugyanazt az bool
operandus értékét false
adja vissza. Ha egy típus a két operátor egyikét határozza meg, akkor a másik operátort is meg kell határoznia.
Tipp.
Használja a bool?
típust, ha támogatnia kell a háromértékű logikát (például ha olyan adatbázisokkal dolgozik, amelyek háromértékű logikai típust támogatnak). A C# az &
operandusokkal bool?
támogatja a háromértékű logikát támogató operátorokat|
. További információkért tekintse meg a logikai operátorokról szóló cikk null értékű logikai operátorok szakaszát.
Logikai kifejezések
A definiált true
operátorral rendelkező típus lehet egy vezérlő feltételes kifejezés eredménye a ha, do, while, és az utasításokban és a feltételes operátorban ?:
. További információkért tekintse meg a C# nyelvspecifikáció logikai kifejezések szakaszát.
Felhasználó által definiált feltételes logikai operátorok
Ha egy meghatározott és operátorral rendelkező típus bizonyos módon túlterheli a logikai VAGY vagy |
a logikai ÉS operátort&
, a feltételes logikai VAGY operátor ||
vagy a feltételes logikai ÉS operátor &&
kiértékelhető az adott típusú operandusok esetében.false
true
További információ: A C# nyelv specifikációjának felhasználó által definiált feltételes logikai operátorok szakasza.
Példa
Az alábbi példa a mindkettőt true
és false
az operátorokat meghatározó típust mutatja be. A típus a logikai AND operátort &
is túlterheli oly módon, hogy az &&
operátor az adott típusú operandusok esetében is kiértékelhető legyen.
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;
}
}
Figyelje meg az operátor rövid kapcsolati viselkedését &&
. Amikor a GetFuelLaunchStatus
metódus visszatér LaunchStatus.Red
, az operátor jobb oldali operandusa &&
nem lesz kiértékelve. Ez azért van, mert LaunchStatus.Red
határozottan hamis. Ezután a logikai AND eredménye nem függ a jobb oldali operandus értékétől. A példa kimenete a következő:
Getting fuel launch status...
Wait!