Поделиться через


Истинные и ложные операторы — обрабатывают объекты как логическое значение

Оператор true возвращает логическое значение true , указывающее, что его операнду определенно верно, а false оператор возвращает bool значение true , указывающее, что его операнда определенно false.
Обратите внимание, что тип, реализующий оба true оператора, false должен соответствовать следующей семантике:

  • "Является ли этот объект истинным?" разрешает оператору true. Оператор возвращает, true true если объект имеет значение true. Ответ : "Да, этот объект имеет значение true".
  • "Является ли этот объект ложным?" разрешает оператору false. Оператор возвращает, false true если объект имеет значение false. Ответ : "Да, этот объект имеет значение false"

false Операторы true не гарантированно дополняют друг друга. То есть оба оператора true и false могут вернуть значение boolfalse для одного операнда. Если тип определяет один из этих двух операторов, он также должен определить другой оператор.

Совет

Используйте тип bool?, если вам нужно использовать трехзначную логику (например, при работе с базами данных, которые поддерживают трехзначный логический тип). В C# предоставляются операторы & и |, которые поддерживают троичную логику с операндами bool?. См. подробнее о логических операторах, поддерживающих значение NULL в описании логических операторов.

Логические выражения

Тип с определенным оператором true может быть типом результата управляющего условного выражения в операторах if, do, while и for и условном операторе?:. Дополнительные сведения см. в описании логических выражений в спецификации языка C#.

Пользовательские условные логические операторы

Если тип с определенными операторами true и false перегружает логические операторы OR | или AND & определенным образом, условные логические операторы OR || или AND && соответственно могут вычисляться для операндов этого типа. Дополнительные сведения см. в разделе Пользовательские условные логические операторы в Спецификации языка C#.

Пример

В следующем примере представлен тип, который определяет операторы true и false. Этот тип также перегружает логический оператор И & таким образом, что оператор && может быть вычислен для операндов этого типа.

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

Обратите внимание на поведение сокращенного вычисления оператора &&. GetFuelLaunchStatus Когда метод возвращаетсяLaunchStatus.Red, правый операн && оператора не вычисляется. Это обусловлено тем, что LaunchStatus.Red имеет значение false. Результат логического оператора И не зависит от значения правого операнда. Выходные данные примера могут быть следующими:

Getting fuel launch status...
Wait!

См. также