Nullable <T>Структура - PullRequest
       30

Nullable <T>Структура

0 голосов
/ 06 июня 2018

Я читаю Nullable Structure и понимаю большинство из них.Но я не знаю, когда и почему люди будут его использовать.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

C # имеет концепцию ссылочных типов (классов) и значений типов (структур и встроенных типов, таких как int, bool, DateTime и т. Д..).

Типы ссылок могут иметь значение null, указывающее, что они не были назначены (или имеют значение "нет").

Типы значений изначально не имелипонятие обнуляемой стоимости.В некоторых контекстах они имеют значение по умолчанию (например, поле int в классе имеет значение по умолчанию 0).Но у них нет понятия «нет».

Введите Nullable<T>.

Nullable<T> (или его сокращенное обозначение T?) указывает тип значения, которыйможет иметь или не иметь значение.

например,

int? foo = null; // No initial value
foo = 9; // Now it has a value
foo = null; // No value again

И существуют методы для запроса, существует ли значение, и извлечения его:

if (foo.HasValue)
{
    int actualValue = foo.Value;
}

Одна областьгде это полезно при написании кода для подключения к базам данных.Числовые (целочисленные) столбцы во многих базах данных можно настроить на обнуляемость.Без обнуляемых типов в самом C # вам нужно было бы перепрыгивать через обручи для обработки нулевого значения БД в коде (например, используя специальное значение Sentinel для представления нулевого значения БД).Обнуляемые типы заставляют это работать более плавно.

0 голосов
/ 06 июня 2018

Использование Nullable<T> является широким.В качестве примера предположим, что у вас есть запрос, который возвращает идентификатор последнего сообщения определенного пользователя в блоге:

int lastId = User.GetLastPostId();

Если у пользователя еще нет сообщений, метод возвращает значение NULL и вызывает исключение.решение использует Nullable<int> вместо int, чтобы избежать ошибки.

int? lastId = User.GetLastPostId();

В этом случае вы можете даже проверить, чтобы быть нулевым или нет:

if(lastId == null)
    // do something
else
    // do something

Что-то вроде вышеПредположим, вы хотите использовать структуру вместо класса в вашем коде.Поскольку структура имеет тип ValueType, он не может принимать нулевое значение, и если вы хотите, чтобы структура приняла нулевое значение, вы должны определить его как Nullable.

Struct Person
{
    public string Name;
}

Person p = null; // Error
Person? p = null; // Correct
...