в 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 = !p.Enabled;, напротив p.Enabled.


тест 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
}