C#. Значение null. Типы данных, допускающих значение null




Значение null. Типы данных, допускающих значение null. Операции ?, ??


Содержание


Поиск на других ресурсах:

1. Значение null. Присваивание

Значение null используется для представления пустой ссылки на объект. Это значение может быть присвоено переменным ссылочных типов.

Пример.

В примере продемонстрировано присваивание null-значениий ссылкам на объекты классов CMyClass и string. Если попробовать присвоить значение null переменной типа int, то компилятор выдаст сообщение об ошибке.

class CMyClass
{
  public int value;
}

class Program
{
  static void Main(string[] args)
  {
    CMyClass obj;
    obj = null; // пустая ссылка на объект класса CMyClass
    string s = null; // пустая ссылка на строку

    // int d = null; - ошибка: тип int не является null-типом
    Console.ReadKey();
  }
}

  

2. Синтаксис типа данных, допускающих значение null. Суффикс ?

В языке программирования C# все базовые числовые типы данных (int, float, double, bool и прочие) есть типами-значениями. Этим типам никогда не может быть присвоено значение null. Значение null может присваиваться переменным ссылочных типов таким как классы.

Существуют случаи, когда нужно чтобы тип-значение допускал null. Например, в таблицах баз данных при некоторых условиях могут быть поля, которые содержат неопределенные null-значения.

Для того, чтобы тип-значение мог поддерживать null, в C# используется следующая общая форма, которая содержит символ ?

type? variable;

где

  • type – тип-значение, который должен допускать значение null;
  • variable – название переменной, которой может быть присвоено значение null.

  

3. Примеры использования значений null в переменных базовых типов

 

...
// Nullable-типы

// Это ошибка
// int d = null; // ошибка - d не есть Nullable-тип

// Так работает
int? d2 = null;

double? x;
x = 25;
x = null;

bool? b;
b = true;
b = null;

float? f;
f = null;

...





  

4. Суффикс ? и структура System.Nullable<T>. Назначение. Пример

Если компилятор после имени типа встречает суффикс ?, то он создает экземпляр обобщенной структуры System.Nullable<T>.

Структура System.Nullable<T> обеспечивает дополнительный набор средств, которые работают с типами, допускающими значение null. К этим средствам можно отнести:

  • свойство HasValue. Это свойство определяет, имеет ли текущий объект типа System.Nullable<T> стойкое значение типа T (здесь вместо типа T задается любой базовый тип int, double и т.д.). Свойство возвращает true, если текущий объект имеет такое значение, в противном случае возвращается false (см. пример ниже). Иными словами, свойство HasValue возвращает false, если значение объекта равно null;
  • свойство Value – возвращает текущее значение, которое присвоено переменной типа, допускающей null;
  • метод GetValueOrDefault(). Если Nullable-переменная имеет значение не равное null, то этот метод возвращает это значение. Если Nullable-переменная равна null, то метод возвращает значение по умолчанию (как правило это 0). Этот метод нужно использовать для корректного присваивания значения из Nullable-типа в обычный базовый тип.

Пример.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp8
{
  class Program
  {
    static void Main(string[] args)
    {
      // 1. Объявление переменной типа System.Nullable<int>
      System.Nullable<int> d; // можно было и так: int? d;

      // 2. Объявление переменной типа System.Nullable<double>
      double? t = null;

      // 3. Свойство Value - демонстрация правильного присваивания
      // тип int?
      d = null;
      int d2; // не Nullable-тип

      if (d == null)
        d2 = 0;
      else
        d2 = d.Value; // d2 = 335

      // тип double?
      t = -10.55;
      double t2;

      if (t != null)
        t2 = t.Value; // t2 = -10.55
      else
        t2 = 0.0;

      // 4. Свойство HasValue
      // Проверка, равна ли переменная t значению null
      t = null;
      if (t.HasValue)
        Console.WriteLine("t != null");
      else
        Console.WriteLine("t == null");

      // 5. Метод GetValueOrDefault() - не нужно делать проверку на null
      t = null;
      double t3 = t.GetValueOrDefault(); // t3 = 0 - значение по умолчанию

      Console.WriteLine("d2 = {0}", d2);
      Console.WriteLine("t2 = {0}", t2);
      Console.WriteLine("t3 = {0}", t3);
      Console.ReadKey();
    }
  }
}

Результат выполнения программы

t == null
d2 = 0
t2 = -10.55
t3 = 0

  

5. Как программно определить, было ли присвоено null-значение Nullable-переменной?

Если переменная допускает null, то определить, содержит ли эта переменная значение null можно следующими способами:

  • использовать одну из операций == или !=;
  • использовать свойство HasValue.

Пример.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp8
{
  class Program
  {
    static void Main(string[] args)
    {
      // Проверка, было ли присвоено null-значение Nullable-переменной
      char? symbol; // некоторая Nullable-переменная

      // Способ 1. Операция ==
      symbol = null;
      if (symbol == null)
        Console.WriteLine("symbol == null");
      else
        Console.WriteLine("symbol != null");

      // Способ 2. Операция !=
      symbol = 'a';
      if (symbol != null)
        Console.WriteLine("symbol != null");
      else
        Console.WriteLine("symbol == null");

      // Способ 3. Свойство HasValue
      symbol = null;
      if (symbol.HasValue)
        Console.WriteLine("symbol != null");
      else
        Console.WriteLine("symbol == null");

      Console.ReadKey();
    }
  }
}

Результат работы программы

symbol == null
symbol != null
symbol == null

  

6. Операция ?? (null-coalescing). Назначение. Пример

Операция ?? позволяет присваивать объекту Nullable-типа заданное значение в случае, если значение этого объекта равно null. Операция позволяет заменить программный код, который использует конструкцию if-else. По сравнение if-else эта операция есть более компактной.

Пример.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp8
{
  class Program
  {
    static void Main(string[] args)
    {
      // Операция ??
      uint? d; // некоторый Nullable-тип
      uint? t;

      d = null;
      t = d ?? 50; // t = 50
      Console.WriteLine("t = {0}", t);

      d = 20;
      t = d ?? 50; // t = 20
      Console.WriteLine("t = {0}", t);

      Console.ReadKey();
    }
  }
}

Результат работы программы

t = 50
t = 20

  


Связанные темы