English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# базовый учебник

C# продвинутый учебник

C#面向对象(OOP)

Типы с возможностью Null (Nullable) в C#

Известно, что null значение не может быть назначено типу значения. Например,int i = null Будет выведен компиляторная ошибка.

C# 2.0 ввел nullable типы, позволяющие назначать null значению типа значения. Вы можете использовать Nullable<t> для объявления nullable типа, где T - тип.

Определение nullable типа

Nullable<int> i = null;

Тип nullable может представлять правильный диапазон значений базового типа значения, а также дополнительное значение null. Например, Nullable<int> может быть назначен любому значению в диапазоне от -2147483648 до 2147483647 или значению null.

Тип nullable является экземпляром System.Nullable<t> struct.

[Serializable]
public struct Nullable<T> where T : struct
{        
    public bool HasValue { get; }
      
    public T Value { get; }
        
    // Другие реализации
}

Тип Int nullable аналогичен обычному типу int, с добавлением флага, указывающего, имеет ли int значение (является ли null).... Все остальное - магия компилятора, которая рассматривает "null" как действительное значение.

static void Main(string[] args)
{
    Nullable<int> i = null;
    if (i.HasValue)
        Console.WriteLine(i.Value); // или Console.WriteLine(i)
    else
        Console.WriteLine("Null");
}
Вывод:
Null

Если объект был назначен значение, возвращает true; если не было назначено ningún valor или назначен null, возвращает false.

Если тип NullableType.value равен null или не был назначен ningún valor, попытка доступа к значению с помощью NullableType.value вызовет исключение во время выполнения. Например, если i равен null, значение вызовет исключение:

Неправильное использование nullable типов

Если не null, то Использование метода GetValueOrDefault() для получения фактического значения; если null, то используется значение по умолчанию. Например:

static void Main(string[] args)
{
    Nullable<int> i = null;
    Console.WriteLine(i.GetValueOrDefault()); 
}

Сокращенная синтаксис для nullable типов

Вы можете использовать оператор "?" для сокращения синтаксиса, например int ?, long? вместо Nullable <T>.

int? i = null;
double? D = null;

Оператор объединения null (??)

Использование оператора '??' для назначения nullable типов non-nullable типам.

int? i = null;
            
int j = i ?? 0;
Console.WriteLine(j);
Вывод:
0

В приведенном выше примере i является nullable int, если его присвоить non-nullable int j, то если i null, то будет выброшено исключение во время выполнения. Поэтому, чтобы уменьшить риск возникновения исключений, мы используем оператор "??", который присваивает 0 j, если i null.

using System;
namespace CalculatorApplication
{
   class NullablesAtShow
   {
         
      static void Main(string[] args)
      {
         
         double? num1 = null;
         double? num2 = 3.14157;
         double num3;
         num3 = num1 ?? 5.34; // Если num1 пуст, то возвращается 5.34
         Console.WriteLine("Значение num3: {0}", num3);
         num3 = num2 ?? 5.34;
         Console.WriteLine("Значение num3: {0}", num3);
         Console.ReadLine();
      }
   }
}

Результат вывода:

Значение num3: 5.34
Значение num3: 3.14157

Правила назначения

Правила назначения для nullable типов такие же, как и для значимых типов. Если в функции nullable тип объявлен как локальная переменная, то перед использованием его необходимо присвоить значение. Если это поле любого класса, то по умолчанию оно будет иметь пустое значение.

Например, объявите и используйте следующий nullable int без назначения ему какого-либо значения. Компилятор выдаст“Использование неассигнованной локальной переменной 'i'”Ошибка:

Ошибка неассигнованного nullable типа

В следующем примере nullable типа int является полем класса, поэтому не возникает никакой ошибки.

class MyClass
{
    public Nullable<int> i;
}
class Program
{
    static void Main(string[] args)
    {
        MyClass mycls = new MyClass();
        if (mycls.i == null)
            Console.WriteLine("Null");
    }
}
Вывод:
Null

Метод сравнения класса Nullable

Null считается меньше любого значения. Поэтому операторы сравнения не могут использоваться с null. Вот пример, где i ни меньше j, ни больше j, ни не равно j:

static void Main(string[] args)
{
    int? i = null;
    int j = 10;
    if (i < j)
        Console.WriteLine("i < j");
    else if (i > 10)
        Console.WriteLine("i > j");
    else if (i == 10)
        Console.WriteLine("i == j");
    else
        Console.WriteLine("Невозможно сравнить");
}
Вывод:
Невозможно сравнить

Статический класс Nullable является вспомогательным классом для типа Nullable. Он предоставляет методы сравнения для сравнения типов, которые могут быть null. У него также есть метод GetUnderlyingType, который возвращает базовый тип параметра типа, который может быть null.

static void Main(string[] args)
{
    int? i = null;
    int j = 10;
    if (Nullable.Compare<int>(i, j) < 0)
        Console.WriteLine("i < j");
    else if (Nullable.Compare<int>(i, j) > 0)
        Console.WriteLine("i > j");
    else
        Console.WriteLine("i = j");
}
Вывод:
i < j

Свойства типа, который может быть null

  1. Типы, которые могут быть null, могут использоваться только с типами значений.

  2. Если Value равно null, то свойство Value выбрасывает InvalidOperationException; в противном случае возвращает значение.

  3. Если переменная содержит значение, то свойство HasValue возвращает true; если null, то false.

  4. Могут быть использованы только операторы == и != с типами, которые могут быть null. Для других сравнений используйте статический класс Nullable.

  5. Запрещается использовать вложенные типы с возможностью Null. Пример: Nullable <Nullable <int>> i; вызовет ошибку в время компиляции.

 Основные моменты, которые нужно запомнить

  1. Тип Nullable <T> позволяет присваивать null типам значений.

  2. ?Оператор - это сокращенная синтаксис для типа с возможностью Null.

  3. Использование свойства value для получения значения типа с возможностью Null.

  4. ИспользованиеHasValueПроверка свойств, которая определяет, передается ли значениеВозможностьПустой тип.

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