Эмпирическое правило, которое я услышал, является наследованием, должен использоваться, когда это, "-" отношения и состав, когда это, "имеет - a". Даже с этим я чувствую, что необходимо всегда склоняться к составу, потому что он устраняет большую сложность.
Различным людям, которые прокомментировали, что книга 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>();
Символ ?
после типа является только ярлыком для типа 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?
.
Когда вы видите? символ, следующий за именем типа, это сокращение для Nullable
. Nullable - это специальный тип, который позволяет типам значений действовать как нулевое значение. Это способ явного выражения типа значения, который может иметь значение, не являющееся значением.
Для bool он фактически превращает переменную в трехступенчатое значение
Adding ?
makes the type null-able. Which means you can do this:
bool? x = null;
And it would be totally OK.
логический? означает, что логическое значение допускает значение NULL и является синтаксическим сахаром для структуры Nullable
. Поскольку логическое значение является типом значения, вы не можете установить для него значение NULL, но в некоторых случаях вам может потребоваться класс доступа к данным, поскольку поля базы данных могут иметь значения NULL.
bool
может содержать только значения true
и false
, тогда как bool?
также может иметь значение null
.