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


Истинные и ложные операторы

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

Справочные документы по языку C# описывают последнюю выпущенную версию языка C#. Она также содержит начальную документацию по функциям в общедоступных предварительных версиях для предстоящего языкового выпуска.

Документация определяет любую функцию, впервые представленную в последних трех версиях языка или в текущих общедоступных предварительных версиях.

Совет

Чтобы узнать, когда функция впервые появилась в C#, ознакомьтесь со статьей об истории версий языка C#.

Тип, реализующий как true операторы, так и false операторы, должны соответствовать следующим семантикам:

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

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

Совет

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

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

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

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

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

Пример

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

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, правый операн && оператора не вычисляется. Это условие, безусловно, ложно. Результат логического И не зависит от значения правого операнда. Выходные данные примера могут быть следующими:

Getting fuel launch status...
Wait!

См. также