Skip to content

Посты

C# 8 - Типы ссылок, допускающие значение null

4 ноября 2019 г. • 3 мин чтения

C# 8 - Типы ссылок, допускающие значение null

Microsoft добавляет новую функцию в C# 8 под названием Nullable Reference Types. Сначала это может быть запутанным, потому что все типы ссылок допускают значение null… так в чем же разница? В дальнейшем, если функция включена, типы ссылок не допускают значение null, если вы явно не обозначите их как допускающие значение null.

Позвольте мне объяснить.

Типы ссылок, допускающие значение null

Когда включены Nullable Reference Types и компилятор считает, что тип ссылки может быть null, он вас предупреждает. Вы увидите предупреждающие сообщения от Visual Studio:

И предупреждения при сборке:

Чтобы удалить это предупреждение, добавьте вопросительный знак после типа ссылки. Например:

public string StringTest()
{
    string? notNull = null;
    return notNull;
}

Теперь тип ссылки ведет себя так же, как до C# 8.

Эта функция включается путем добавления <span class="inline-code"> #nullable enable </span> в начало любого файла C# или добавления <span class="inline-code">lt;NullableReferenceTypes&gt;true&lt;/NullableReferenceTypes&gt;</span> в файл .csproj. По умолчанию она не включена, что хорошо, потому что если бы она была включена, любая существующая кодовая база, вероятно, светилась бы как елка в Рождество.

Дебаты о null

Почему Microsoft добавляет эту функцию сейчас? Null существует в языке с самого начала? Честно говоря, я не знаю почему. Я всегда использовал null, это факт жизни в C#. Я не понимал, что отсутствие null было вариантом… Может быть, жизнь будет лучше без них. Мы узнаем.

Следует ли вам использовать null или нет? Я резюмировал текущие дебаты, как я их понимаю.

За

Аргумент в пользу null обычно заключается в том, что объект имеет неизвестное состояние. Это неизвестное состояние представляется с помощью null. Вы видите это с типом данных bit в SQL Server, который имеет 3 значения: null (не установлено), 0 и 1. Вы также видите это в пользовательских интерфейсах, где иногда важно знать, касался ли пользователь поля или нет. Кто-то может возразить: “Вместо null, почему бы не создать тип неизвестного состояния или состояние ‘не установлено’?” Чем это отличается от null? Вам все равно пришлось бы проверять это дополнительное состояние. Теперь вы создаете неизвестные состояния для каждого экземпляра. Почему бы не просто использовать null и иметь глобальное неизвестное состояние?

Против

Аргумент против null заключается в том, что это другой тип данных, и его необходимо проверять каждый раз, когда вы используете тип ссылки. Результат - код вроде этого:

var user = GetUser(username, password);

if(user != null)
{
    DoSomethingWithUser(user);
} else 
{
    SetUserNotFoundErrorMessage()
}

Если метод GetUser возвращал пользователя во всех случаях, включая случаи, когда пользователь не найден. Если код никогда не возвращает null, то защита от него - пустая трата и, в идеале, это упрощает код. Однако в какой-то момент вам нужно будет проверить пустого пользователя и отобразить сообщение об ошибке. Неиспользование null не устраняет необходимость решения бизнес-случая “пользователь не найден”.

Является ли эта функция хорошей идеей?

Цель этой функции НЕ в том, чтобы исключить использование null, а в том, чтобы задать вопрос: “Есть ли лучший способ?” И иногда ответ - “Нет”. Если мы можем исключить постоянную проверку null с небольшим предусмотрительностью, что, в свою очередь, упрощает наш код. Я за. Хорошая новость в том, что C# сделал работу с null тривиальной.

Я опасаюсь, что некоторые займут догматическую позицию и будут настаивать на исключении null в ущерб системе. Это безнадежное дело, потому что null является неотъемлемой частью C#.

Является ли Nullable Reference Types хорошей идеей? Да, если результатом является более простой и менее подверженный ошибкам код.

Автор: Chuck Conway — инженер AI с почти 30-летним опытом разработки программного обеспечения. Он создает практические системы AI — конвейеры контента, агенты инфраструктуры и инструменты, которые решают реальные проблемы — и делится тем, что он узнает на этом пути. Свяжитесь с ним в социальных сетях: X (@chuckconway) или посетите его на YouTube и на SubStack.

↑ Вернуться в начало

Вам также может понравиться