Megosztás a következőn keresztül:


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átor true akkor ad true vissza értéket, ha az objektum .true A válasz: "Igen, ez az objektum igaz".
  • "Hamis ez az objektum?" operátorral oldja fel a falseproblémát. Az operátor false akkor ad true 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!

Lásd még