Каково различие между “bool” и “bool?”?

Эмпирическое правило, которое я услышал, является наследованием, должен использоваться, когда это, "-" отношения и состав, когда это, "имеет - a". Даже с этим я чувствую, что необходимо всегда склоняться к составу, потому что он устраняет большую сложность.

55
задан Community 4 October 2016 в 18:56
поделиться

6 ответов

Различным людям, которые прокомментировали, что книга xyz непроста, я бы указал, что алгоритмика - непростая тема. Чтобы понять концепции, вам понадобится математика не ниже начального уровня, а также способность рассуждать о вычислениях на подходящем абстрактном уровне. Если вы когда-нибудь найдете книгу «Алгоритмика для чайников», не тратьте зря!

bool? эквивалентно Nullable .

bool - это тип значения , это означает, что он не может быть null , поэтому тип Nullable в основном позволяет вам оборачивать типы значений и иметь возможность назначать им null .

bool? может содержать три разных значения: true , false и null .

Кроме того, нет коротких операторов (&& ||) определен для bool?

Определяются только логические операторы AND, включая OR, и они ведут себя следующим образом:

x        y      x & y   x | y   
true    true    true    true
true    false   false   true
true    null    null    true
false   true    false   true
false   false   false   false
false   null    false   null
null    true    null    true
null    false   false   null
null    null    null    null

Тип Nullable - это в основном общая структура, которая имеет следующие общедоступные свойства :

public struct Nullable<T> where T: struct
{
    public bool HasValue { get; }
    public T Value { get; }
}

Свойство HasValue указывает, имеет ли текущий объект значение, а свойство Value получит текущее значение объекта, или, если HasValue имеет значение false, оно вызовет исключение InvalidOperationException.

Теперь вам должно быть интересно кое-что, Nullable - это структура, тип значения, который не может быть нулевым, поэтому почему следующий оператор действителен?

int? a = null;

Этот пример будет скомпилирован в это:

.locals init (valuetype [mscorlib]System.Nullable`1<int32> V_0)
IL_0000:  ldloca.s   V_0
IL_0002:  initobj    valuetype [mscorlib]System.Nullable`1<int32>

Вызов initobj , который инициализирует каждое поле типа значения по указанному адресу как пустая ссылка или 0 соответствующего примитивного типа.

Вот и все, здесь происходит инициализация структуры по умолчанию .

int? a = null;

Эквивалентно:

Nullable<int> a = new Nullable<int>();
87
ответ дан 7 November 2019 в 07:14
поделиться

Символ ? после типа является только ярлыком для типа Nullable , bool? эквивалентно ] Nullable .

bool - это тип значения , это означает, что он не может быть null , поэтому тип Nullable в основном позволяет вам обернуть типы значений и возможность присвоить им null .

bool? может содержать три разных значения: true , false и null .

Кроме того, нет коротких операторов (&& ||) определен для bool?

Определяются только логические операторы AND, включая OR, и они ведут себя следующим образом:

x        y      x & y   x | y   
true    true    true    true
true    false   false   true
true    null    null    true
false   true    false   true
false   false   false   false
false   null    false   null
null    true    null    true
null    false   false   null
null    null    null    null

Тип Nullable - это в основном общая структура, которая имеет следующие общедоступные свойства : первый будет null , а второй будет false .

Типичный вариант использования - если вы хотите знать, было ли присвоение переменной. Поскольку bool - это тип значения (так же, как int , long , double , DateTime и некоторые другие типы), он всегда будет инициализирован значением по умолчанию ( false в случае bool , 0 в случае int ). Это означает, что вы не можете легко узнать, является ли он ложным , потому что ему присвоен код false , или если он ложный , потому что он еще не назначен. В этом случае пригодится bool? .

15
ответ дан 7 November 2019 в 07:14
поделиться

Когда вы видите? символ, следующий за именем типа, это сокращение для Nullable . Nullable - это специальный тип, который позволяет типам значений действовать как нулевое значение. Это способ явного выражения типа значения, который может иметь значение, не являющееся значением.

Для bool он фактически превращает переменную в трехступенчатое значение

  • Со значением: Истина
  • Со значением: Ложь
  • Без значения
5
ответ дан 7 November 2019 в 07:14
поделиться

Adding ? makes the type null-able. Which means you can do this:

bool? x = null;

And it would be totally OK.

4
ответ дан 7 November 2019 в 07:14
поделиться

логический? означает, что логическое значение допускает значение NULL и является синтаксическим сахаром для структуры Nullable . Поскольку логическое значение является типом значения, вы не можете установить для него значение NULL, но в некоторых случаях вам может потребоваться класс доступа к данным, поскольку поля базы данных могут иметь значения NULL.

3
ответ дан 7 November 2019 в 07:14
поделиться

bool может содержать только значения true и false , тогда как bool? также может иметь значение null .

2
ответ дан 7 November 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: