В С#, что означает "bool = bool!= true"?
В моей охоте за некоторой помощью к проблеме, с которой я столкнулся, я наткнулся на это:
p.Enabled = p.Enabled != true;
Что именно это означает? Я никогда не видел его раньше,
nb: предыдущая строка была var p = this.PageRepository.GetPage(id);
Ответы
Ответ 1
Когда p.Enabled
является нормальным bool
, поскольку обычно это свойства Enabled,
p.Enabled = p.Enabled != true;
совпадает с
p.Enabled = ! p.Enabled;
Другими словами: он переворачивает или переключает p.Enabled
.
Теперь, когда Enabled является bool?
, сокращением для Nullable<bool>
, результаты разные:
! ((bool?) null) -> null
((bool?) null) != true -> true
Итак, p.Enabled = p.Enabled != true
установит true
, когда старое значение было false
или null
.
Ответ 2
Это неловко написанный переключатель тупика bool. Каждый вызов переключает состояние с true на false. Я бы написал это:
p.Enabled = !p.Enabled;
Редактировать - я полагаю, я должен сказать, неловко написанный только на мой взгляд.
Ответ 3
Так много ответов... Я просто хочу разбить его немного больше:
p.Enabled = p.Enabled != true;
Семантически эквивалентно:
var IN = p.Enabled;
var OUT = IN != true;
p.Enabled = OUT;
Итак:
p.Enabled -> IN IN != true OUT -> p.Enabled
--------------- ------------- ----------------
true true != true false
false false != true true
(if nullable) null null != true true
Таким образом, из таблицы Truth Table видно, что это то же самое, что и логический не (!
) и может быть переписан как:
p.Enabled = !p.Enabled;
(Я бы предположил, что большинство [опытных] программистов предпочитают эту последнюю форму, поскольку это довольно распространенная идиома.)
Счастливое кодирование.
* Обратите внимание на добавление null
в качестве третьего входного состояния в случае типов bool?
(aka Nullable<bool>
). (Спасибо, Томас Мэйфилд; -)
Ответ 4
Это то же самое, что и p.Enabled = !p.Enabled;
, противоположное p.Enabled
.
Ответ 5
Проверяется тест p.Enabled != true
. Результат этого (который является логическим) присваивается p.Enabled
. Поэтому, если p.Enabled
истинно, то p.Enabled
будет установлено значение false. Другой способ сказать это p.Enabled = !p.Enabled
. То есть, он в основном инвертирует значение p.Enabled
.
Ответ 6
если p.Enabled
является простой bool
, что эквивалентно p.Enabled = !p.Enabled
. то есть он переключает p.Enabled
.
Но если p.Enabled
является нулевым bool, он будет отображать null
и false
в true
, а map true
- false
. Но я бы предпочел написать p.Enabled = !(p.Enabled ?? true)
в этом случае.
Если p.Enabled
является настраиваемым типом с перегруженными операторами неявного преобразования, все может произойти.
Ответ 7
По существу это будет переворачивать значение p.Enabled. Итак, если это правда, то p.Enabled != true
оценивается как false, а затем это ложное значение присваивается p.Enabled = false
. И это будет работать наоборот, если p.Enabled были ложными.
Это может иметь смысл, если бы оно было написано так:
p.Enabled = !(p.Enabled);
Ответ 8
Подумайте об этом так:
p.Enabled = (p.Enabled != true);
Теперь (p.Enabled != true)
оценивается как bool
, который затем может быть назначен другой переменной bool
.
Ответ 9
Линия оценивает p.Enabled != true
, которая является false
, если p.Enabled - true и true
, если p.Enabled - false. Другими словами, очень неудобный способ писать
p.Enabled = !p.Enabled
Ответ 10
Используйте эту функцию:
bool cond = (p.Enabled != true);
if (cond == true)
{
p.Enabled = cond; // = true
}
else
{
p.Enabled = cond; // = false
}