в C# что делает ' bool = bool! значит = правда'?
в моей охоте за некоторой помощью к проблеме, с которой я столкнулся, я наткнулся на это:
p.Enabled = p.Enabled != true;
что именно это означает? Я никогда не видел его раньше,
nb: предшествующая строка была var p = this.PageRepository.GetPage(id);
10 ответов
, когда p.Enabled
это нормально bool
, как обычно включены свойства,
p.Enabled = p.Enabled != true;
это то же самое, что
p.Enabled = ! p.Enabled;
другими словами: он переворачивает или переключает p.Enabled
.
теперь, когда включено, является bool?
, сокращение для Nullable<bool>
, результаты разные:
! ((bool?) null) -> null
((bool?) null) != true -> true
так p.Enabled = p.Enabled != true
устанавливается true
когда старое значение было false
или null
.
это неуклюже написанный переключатель bool. Каждый вызов переключает состояние с true на false. Я бы написал:"!--2-->
p.Enabled = !p.Enabled;
Edit-я полагаю, я должен сказать, неловко написано только на мой взгляд.
так много ответов ... Я просто хочу разбить его немного больше:
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
таким образом, с Таблица Истинности, видно, это же* как логическое не (!
оператор) и может быть переписана следующим образом:
p.Enabled = !p.Enabled;
(Я бы предположил, что большинство [опытных] программистов предпочитают эту последнюю форму, поскольку она довольно распространена идиома.)
удачи в кодировании.
*обратите внимание на добавление null
как третий вход в случае bool?
(он же Nullable<bool>
) типов. (Спасибо, Томас Мэйфилд ; -)
тест p.Enabled != true
оценивается. Результат этого (который является логическим) присваивается p.Enabled
. Так что если p.Enabled
истинно, то p.Enabled
будет установлено значение false. Другой способ сказать это p.Enabled = !p.Enabled
. То есть, это в основном инвертирование значения p.Enabled
.
если p.Enabled
простой bool
Это эквивалентно p.Enabled = !p.Enabled
. то есть он переключает p.Enabled
.
но если p.Enabled
является nullable bool, он будет отображать null
и false
to true
и картой true
to false
. Но я предпочитаю писать!--10--> в этом случае.
если p.Enabled
- это пользовательский тип с перегруженными неявными операторами преобразования, все может случиться.
по существу это перевернет значение p.Включено. Значит, если это правда, то ... --1--> вычисляет значение false, а затем это значение false присваивается p.Enabled = false
. И это будет работать наоборот, если p.Включено были false.
это могло бы иметь больше смысла, если бы это было написано так:
p.Enabled = !(p.Enabled);
подумайте об этом так:
p.Enabled = (p.Enabled != true);
теперь (p.Enabled != true)
оценивает в bool
, который затем может быть назначен еще один bool
переменной.
линия оценивает p.Enabled != true
, которая составляет false
Если p.Включено true и true
Если p.Включено-false. Другими словами, очень неудобный способ письма
p.Enabled = !p.Enabled
использовать эту функцию:
bool cond = (p.Enabled != true);
if (cond == true)
{
p.Enabled = cond; // = true
}
else
{
p.Enabled = cond; // = false
}