Delen via


waar- en onwaaroperators: uw objecten behandelen als een Booleaanse waarde

De true operator retourneert de boolwaarde true om aan te geven dat de operand zeker waar is, terwijl de false operator de bool waarde true retourneert om aan te geven dat de operand absoluut onwaar is.
Houd er rekening mee dat een type dat beide true en false operators implementeert, deze semantiek moet volgen:

  • 'Is dit object waar?' wordt omgezet in operator true. Operator retourneert true true als het object is true. Het antwoord is 'Ja, dit object is waar'.
  • 'Is dit object onwaar?' wordt omgezet in de operator false. Operator retourneert false true als het object is false. Het antwoord is 'Ja, dit object is onwaar'

De true operators en false operators kunnen elkaar niet aanvullen. Dat wil gezegd: zowel de als de true false operator kan de bool waarde false voor dezelfde operand retourneren. Als een type een van deze twee operators definieert, moet het ook de andere operator definiëren.

Tip

Gebruik het bool? type als u ondersteuning wilt bieden voor de logica met drie waarden (bijvoorbeeld wanneer u werkt met databases die ondersteuning bieden voor een booleaanse waarde met drie waarden). C# biedt de & en | operators die ondersteuning bieden voor de drie-waardelogica met de bool? operanden. Zie de sectie Logische Booleaanse operatoren van het artikel Booleaanse logische operators voor meer informatie.

Booleaanse expressies

Een type met de gedefinieerde true operator kan het type zijn van een resultaat van een besturingsvoorwaardelijke expressie in de if, do, while en voor instructies en in de voorwaardelijke operator ?:. Zie de sectie Boole-expressies van de C#-taalspecificatie voor meer informatie.

Door de gebruiker gedefinieerde logische operators

Als een type met de gedefinieerde true operator en false operators de logische OF-operator | of de logische AND-operator & op een bepaalde manier overbelast, kan de voorwaardelijke logische OF-operator of voorwaardelijke logische AND-operator || &&respectievelijk worden geëvalueerd voor de operanden van dat type. Zie de sectie Door de gebruiker gedefinieerde logische operators van de C#-taalspecificatie voor meer informatie.

Opmerking

In het volgende voorbeeld ziet u het type dat zowel als true false operatoren definieert. Het type overbelastt ook de logische AND-operator & op een zodanige manier dat de && operator ook kan worden geëvalueerd voor de operanden van dat type.

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;
    }
}

Let op het kortsluitingsgedrag van de && operator. Wanneer de GetFuelLaunchStatus methode wordt geretourneerd LaunchStatus.Red, wordt de rechteroperand van de && operator niet geëvalueerd. Dat komt omdat LaunchStatus.Red het zeker onwaar is. Vervolgens is het resultaat van de logische AND niet afhankelijk van de waarde van de rechteroperand. De uitvoer van het voorbeeld is als volgt:

Getting fuel launch status...
Wait!

Zie ook