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