English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Известно, что null значение не может быть назначено типу значения. Например,int i = null Будет выведен компиляторная ошибка.
C# 2.0 ввел nullable типы, позволяющие назначать null значению типа значения. Вы можете использовать Nullable<t> для объявления nullable типа, где T - тип.
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, значение вызовет исключение:
Если не null, то Использование метода GetValueOrDefault() для получения фактического значения; если null, то используется значение по умолчанию. Например:
static void Main(string[] args) { Nullable<int> i = null; Console.WriteLine(i.GetValueOrDefault()); }
Вы можете использовать оператор "?" для сокращения синтаксиса, например int ?, long? вместо Nullable <T>.
int? i = null; double? D = 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 типа 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
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, могут использоваться только с типами значений.
Если Value равно null, то свойство Value выбрасывает InvalidOperationException; в противном случае возвращает значение.
Если переменная содержит значение, то свойство HasValue возвращает true; если null, то false.
Могут быть использованы только операторы == и != с типами, которые могут быть null. Для других сравнений используйте статический класс Nullable.
Запрещается использовать вложенные типы с возможностью Null. Пример: Nullable <Nullable <int>> i; вызовет ошибку в время компиляции.
Тип Nullable <T> позволяет присваивать null типам значений.
?Оператор - это сокращенная синтаксис для типа с возможностью Null.
Использование свойства value для получения значения типа с возможностью Null.
ИспользованиеHasValueПроверка свойств, которая определяет, передается ли значениеВозможностьПустой тип.
Статический класс Nullable - это помощник, который используется для сравнения типов с возможностью Null.