Подтвердить что ты не робот

В С#, что означает "bool = bool!= true"?

В моей охоте за некоторой помощью к проблеме, с которой я столкнулся, я наткнулся на это:

p.Enabled = p.Enabled != true;

Что именно это означает? Я никогда не видел его раньше,

nb: предыдущая строка была var p = this.PageRepository.GetPage(id);

4b9b3361

Ответ 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
}