Рассмотрим этот код:
A a = null;
a.f(); //Will it throw NullReferenceException?
Вышеуказанный бросок NullReferenceException
?
Ответ: это зависит от того, что f()
.
Это различие приводит к вопросу: как каждый тип метода реализуется и просматривается компиляторами C #? Кроме того, почему метод-член должен выдавать исключение , даже если он не обращается ни к каким данным ? Кажется, что компилятор C # заранее предполагает, что метод-член получит доступ к данным-членам, и поэтому он выдает исключение, если объект имеет значение null, поскольку использование данных-членов с нулевым объектом недоступно. Однако в случае метода расширения он откладывает это решение до тех пор, пока на самом деле не попытается получить доступ к данным члена, используя нулевую ссылку, только тогда он выдаст исключение .
Насколько мое понимание верно? И если это так, то почему такая разница?
Да, я знаю, что если f()
является методом расширения, то a.f()
эквивалентно записи AExt.f(a)
, поэтому последний не должен выдавать исключение, пока a
не будет использован для доступа к члену. Но я сосредоточен в основном на реализациях компилятора (которые могут реализовывать даже методы-члены таким же образом).