Российский Государственный Технологический Университет им. К.Э. Циолковского
Опубликован: 02.03.2007 | Доступ: свободный | Студентов: 5678 / 802 | Оценка: 3.96 / 3.45 | Длительность: 27:04:00
ISBN: 978-5-9556-0086-4
Лекция 13:

Шаблоны

Обзор Nullable-типов

Nullable обладают следующими характеристиками:

  • Переменной Nullable типа-значения может быть присвоено значение из "базового" диапазона значений или null.
  • шаблон System.Nullable<T> не может быть применен для расширения ссылочных типов. (Ссылочные типы и без того поддерживают null значение).
  • Синтаксис допускает сокращенную форму для объявления Nullable типа: T? ( T — обозначение типа-значения) и System.Nullable<T> —две эквивалентные формы для обозначения типа.
  • Операция присвоения выглядит аналогично операции присвоения типов-значений, например int? x = 10; или double? d = 4.108.
  • Свойство System.Nullable.GetValueOrDefault обеспечивает возвращение присвоенного переменной значения, либо значения, которое соответствует значению, присваиваемому по умолчанию переменной типа-значения. Это свойство позволяет организовать безопасное взаимодействие между объектами – представителями типов System.Nullable<T> и T. Пример использования свойства:
    int j = x.GetValueOrDefault();
  • применение read-only свойств HasValue и Value также позволяет взаимодействовать объектам типа System.Nullable<T> и T в рамках одного предложения. Свойство используется для проверки непустого значения перед присвоением. HasValue возвращает true, если переменная содержит значение, либо false, это null. Свойство Value возвращает значение, если таковое было присвоено. В противном случае возбуждается исключение System.InvalidOperationException:
    if(x.HasValue) j = x.Value;
  • предопределенное значение для объектов Nullable типа может быть определено с помощью ранее описанных свойств. Применительно к значению по умолчанию свойство HasValue возвращает false. Значение свойства Value НЕ ОПРЕДЕЛЕНО.
  • объявленная в шаблоне операторная функция ?? работает следующим образом: если Nullable объекту присвоено непустое значение, операторная функция возвращает это значение. В противном случае возвращается значение второго операнда операторной функции. Например:
    int? x = null; int y = x ?? -1;
  • вложенные конструкции при объявлении Nullable типов не допускаются:
    Nullable<Nullable<int>> n;
  • диапазон значений Nullable<T> типа соответствует диапазону значений простого типа T, и включает еще одно дополнительное (пустое) значение null. Синтаксис C# допускает две эквивалентные формы объявления Nullable -типа:
    System.Nullable<T> variable
    T? variable
  • здесь T обозначает "основной" тип шаблонного типа. Тип T должен быть типом-значением, возможно, что структурой. Тип T не может быть типом-ссылкой.
  • Любой тип-значение может быть основой для шаблонного nullable типа. Например:
    int? i = 10;
     double? d1 = 3.14;
     bool? flag = null;
     char? letter = 'a';
     int?[] arr = new int?[10];

Nullable Types. Члены класса

Прежде всего, пара свойств:

HasValue

Свойство HasValue является свойством типа bool. Оно принимает значение true, если переменная имеет непустое значение (значение, отличное от null ):

Value

Тип свойства Value соответствует "основному" типу. Если значение свойства HasValue является true, свойство Value принимает соответствующее значение. Если свойство HasValue принимает значение false, попытка определения значения свойства Value завершается генерацией исключения InvalidOperationException.

В следующем примере свойство HasValue позволяет без генерации исключения (если это возможно) определить (и распечатать) значение nullable переменной типа int?:

int? x = 10;
 if (x.HasValue)
 {
     System.Console.WriteLine(x.Value);
 }
 else
 {
     System.Console.WriteLine("Undefined");
 }

Проверку значения можно также произвести следующим образом:

int? y = 10;
 if (y != null)
 {
     System.Console.WriteLine(y.Value);
 }
 else
 {
     System.Console.WriteLine("Undefined");
 }
kewezok kewezok
kewezok kewezok
Елена Шляхт
Елена Шляхт
Объясните плиз в чем отличие а++ от ++а
Почему результат разный?
int a=0, b=0;
Console.WriteLine(a++); //0
Console.WriteLine(++b); //1
a++;
++b;
Console.WriteLine(a); //2
Console.WriteLine(b); //2