Цель этой функции - предоставить разработчикам больше инструментов для выявления наиболее распространенных типов ошибок, разграничения нулевой ссылки / указателя и, таким образом, сбоя приложения.
Таким образом, C# Команда разработчиков добавила «ссылочные типы, допускающие значение NULL», с синтаксисом, достаточным для того, чтобы разработчик мог более четко декларировать намерение и требования кода.
Вещи, которые могут быть выражены с помощью нового синтаксиса: * Свойства и поля, которые либо разрешают NULL, либо не допускают NULL
Параметры метода, которые могут быть NULL или должны быть NULL Возвращаемые значения метода могут быть NULL или не могут быть NULL
При включении компилятор будет использовать этот новый синтаксис, а также атрибуты и другие метаданные, чтобы начать выдавать предупреждения, когда он видит код, правильность которого не "гарантированно". Другими словами, если вы прочитаете свойство, в котором говорится, что оно может возвращать NULL, и попытаетесь просто передать это как значение параметра, когда метод говорит, что параметр не должен быть NULL, вы получите предупреждение.
Вы можете, используя существующие директивы в проектах, сказать, что определенные предупреждения должны вместо этого обрабатываться как ошибки, и прервать сборку, включая эти новые предупреждения.
ОДНАКО, они не добавили время выполнения чеки. Если вы говорите, что значение параметра никогда не должно быть NULL, и проигнорируете предупреждение или обойдете его (есть способы сказать «поверьте мне, это правильно»), то метод будет работать, как указано. Не существует невидимых операторов if или защитных операторов, которые проверяют, что параметр не равен нулю.
В принципе, вам все равно следует добавлять такие операторы if.
Это противоречит вашему мнению, именно для этого они разработали эту функцию. Они не забыли добавить эти проверки времени выполнения, они специально не добавляли их.
Например, если вы вызываете метод через отражение, компилятор не участвует, поскольку это вещь времени выполнения, и поэтому нет проверки будут проводиться у всех. Если метод не имеет таких защитных инструкций, вероятно, он будет sh позже взломать исключение NullReferenceException.