Истинные и ложные операторы — обрабатывают объекты как логическое значение
Статья
Оператор true возвращает логическое значение true , указывающее, что его операнду определенно верно, а false оператор возвращает bool значение true , указывающее, что его операнда определенно false.
Обратите внимание, что тип, реализующий оба true оператора, false должен соответствовать следующей семантике:
"Является ли этот объект истинным?" разрешает оператору true. Оператор возвращает, truetrue если объект имеет значение true. Ответ : "Да, этот объект имеет значение true".
"Является ли этот объект ложным?" разрешает оператору false. Оператор возвращает, falsetrue если объект имеет значение false. Ответ : "Да, этот объект имеет значение false"
false Операторы true не гарантированно дополняют друг друга. То есть оба оператора true и false могут вернуть значение boolfalse для одного операнда. Если тип определяет один из этих двух операторов, он также должен определить другой оператор.
Совет
Используйте тип bool?, если вам нужно использовать трехзначную логику (например, при работе с базами данных, которые поддерживают трехзначный логический тип). В C# предоставляются операторы & и |, которые поддерживают троичную логику с операндами bool?. См. подробнее о логических операторах, поддерживающих значение NULL в описании логических операторов.
В следующем примере представлен тип, который определяет операторы true и false. Этот тип также перегружает логический оператор И & таким образом, что оператор && может быть вычислен для операндов этого типа.
C#
publicstruct LaunchStatus
{
publicstaticreadonly LaunchStatus Green = new LaunchStatus(0);
publicstaticreadonly LaunchStatus Yellow = new LaunchStatus(1);
publicstaticreadonly LaunchStatus Red = new LaunchStatus(2);
privateint status;
privateLaunchStatus(int status)
{
this.status = status;
}
publicstaticbooloperatortrue(LaunchStatus x) => x == Green || x == Yellow;
publicstaticbooloperatorfalse(LaunchStatus x) => x == Red;
publicstatic 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;
}
publicstaticbooloperator ==(LaunchStatus x, LaunchStatus y) => x.status == y.status;
publicstaticbooloperator !=(LaunchStatus x, LaunchStatus y) => !(x == y);
publicoverrideboolEquals(object obj) => obj is LaunchStatus other && this == other;
publicoverrideintGetHashCode() => status;
}
publicclassLaunchStatusTest
{
publicstaticvoidMain()
{
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. Результат логического оператора И не зависит от значения правого операнда. Выходные данные примера могут быть следующими:
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Отзыв о .NET
.NET — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв:
Присоединитесь к серии встреч для создания масштабируемых решений искусственного интеллекта на основе реальных вариантов использования с другими разработчиками и экспертами.