Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Примером универсальных типов являются типы, допускающие значение null (nullable types). Эти типы являются экземплярами структуры System.Nullable<T>, где T должен быть типом значения. Структура Nullable<T> имеет специальный флаг HasValue, указывающий на наличие значения, и свойство Value, содержащее значение. Попытка прочитать Value при HasValue, равном false, ведёт к генерации исключения. Также в Nullable<T> определён метод GetValueOrDefault().
Язык C# предлагает компактную форму объявления типа, допускающего значение null. Для этого после имени типа указывается знак вопроса.
int? x = 123;
int? y = null;
if (x.HasValue) Console.WriteLine(x.Value);
if (y.HasValue) Console.WriteLine(y.Value);
int k = x.GetValueOrDefault();
int p = y.GetValueOrDefault(10);
Для типов значений определено неявное преобразование к соответствующему типу, допускающему значение null. Если для типа S возможно приведение к типу T, то такая возможность имеется и для типов S? и T?. Также возможно неявное приведение типа S к типу T? и явное приведение S? к T. В последнем случае возможна генерации исключительной ситуации – если значение типа S? не определено.
int x = 10;
int? z = x; // неявное приведение int к int?
double? w = z; // неявное приведение int? к double?
double y = (double)z; // явное приведение int? к double
Хотя для структуры Nullable<T> не определены арифметические операции и операции сравнения, компилятор способен «заимствовать» нужную операцию у соответствующего типа значения. При этом действуют следующие правила:
– Арифметические операции возвращают значение null, если хотя бы один из операндов равен null.
– Операции сравнения, кроме == и!=, возвращают значение false, если хотя бы один из операндов равен null.
– Операции равенства == и!= считают две переменные, равные null, равными между собой.
– Если в операциях & и | участвуют операнды типа bool?, то null | true равняется true, а null & false равняется false.
int? x = 3, y = 5, z = null;
Console.WriteLine(x + y); // 8
Console.WriteLine(x + z); // null
Console.WriteLine(x < y); // true
Console.WriteLine(x < z); // false
Console.WriteLine(null == z); // true
С типами, допускающими значение null, связана операция??. Результатом выражения a?? b является a, если a содержит некое значение, и b – в противном случае. Таким образом, b – это значение, которое следует использовать, если a не определено. Тип выражения a?? b определяется типом операнда b.
int? x = GetNullableInt();
int? y = GetNullableInt();
int? z = x?? y;
int i = z?? -1;
Операцию?? можно применить и для ссылочных типов:
string s = GetStringValue();
Console.WriteLine(s?? "Unspecified");
В этом фрагменте кода на консоль выводится значение строки s, или "Unspecified", если s == null.
Дата публикования: 2015-11-01; Прочитано: 350 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!