Истинные и ложные операторы — обрабатывают объекты как логическое значение
Оператор true
возвращает логическое значение true
, указывающее, что его операнду определенно верно, а false
оператор возвращает bool
значение true
, указывающее, что его операнда определенно false.
Обратите внимание, что тип, реализующий оба true
оператора, false
должен соответствовать следующей семантике:
- "Является ли этот объект истинным?" разрешает оператору
true
. Оператор возвращает,true
true
если объект имеет значениеtrue
. Ответ : "Да, этот объект имеет значение true". - "Является ли этот объект ложным?" разрешает оператору
false
. Оператор возвращает,false
true
если объект имеет значениеfalse
. Ответ : "Да, этот объект имеет значение false"
false
Операторы true
не гарантированно дополняют друг друга. То есть оба оператора true
и false
могут вернуть значение bool
false
для одного операнда. Если тип определяет один из этих двух операторов, он также должен определить другой оператор.
Совет
Используйте тип 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!