Метод вызывается с нулевым значением или он дает исключение нулевой ссылки?
MyObject myObject = null;
myObject.MyExtensionMethod(); // <-- is this a null reference exception?
Если это так, мне никогда не нужно будет проверять мой параметр this на null?
c#
parameters
null
extension-methods
TPower
источник
источник
Cannot perform runtime binding on a null reference
.Ответы:
Это будет работать нормально (без исключения). Методы расширения не используют виртуальные вызовы (т. Е. Он использует инструкцию il «call», а не «callvirt»), поэтому проверка на ноль не выполняется, если вы не пишете ее самостоятельно в методе расширения. Это на самом деле полезно в нескольких случаях:
и т.д
По сути, вызовы статических вызовов очень буквальны - т.е.
будет выглядеть так:
где явно нет нулевой проверки.
источник
Дополнение к правильному ответу от Марка Гравелла.
Вы можете получить предупреждение от компилятора, если очевидно, что аргумент this равен нулю:
Хорошо работает во время выполнения, но выдает предупреждение
"Expression will always cause a System.NullReferenceException, because the default value of string is null"
.источник
Как вы уже обнаружили, поскольку методы расширения - это просто прославленные статические методы, они будут вызываться с
null
передаваемыми ссылками безNullReferenceException
выброса. Но, поскольку они выглядят как методы экземпляра для вызывающей стороны, они также должны вести себя как таковые. Затем вы должны в большинстве случаев проверятьthis
параметр и выдавать исключение, если оно естьnull
. Это нормально, если метод явно заботится оnull
значениях, и его имя указывает на это должным образом, как в примерах ниже:Я также написал пост в блоге об этом некоторое время назад.
источник
Нуль будет передан в метод расширения.
Если метод пытается получить доступ к объекту без проверки, является ли он пустым, то да, он выдаст исключение.
Парень здесь написал методы расширения "IsNull" и "IsNotNull", которые проверяют, передана ли ссылка на ноль или нет. Лично я думаю, что это заблуждение и не должно было светить днем, но это совершенно справедливо для C #.
источник
Как отмечали другие, вызов метода расширения по нулевой ссылке приводит к тому, что аргумент this будет нулевым, и больше ничего особенного не произойдет. Это порождает идею использовать методы расширения для написания охранных предложений.
Вы можете прочитать эту статью для примеров: Как уменьшить цикломатическую сложность: Guard Clause Короткая версия:
Это метод расширения класса строки, который можно вызвать по нулевой ссылке:
Вызов работает нормально только потому, что среда выполнения успешно вызовет метод расширения по нулевой ссылке. Затем вы можете использовать этот метод расширения для реализации охранных предложений без беспорядочного синтаксиса:
источник
Метод расширения является статическим, поэтому, если вы ничего не делаете с этим MyObject, это не должно быть проблемой, быстрый тест должен это проверить :)
источник
Есть несколько золотых правил, когда вы хотите, чтобы они были читабельными и вертикальными.
В вашем случае - DesignByContract не работает ... вы собираетесь выполнить некоторую логику для нулевого экземпляра.
источник