Skip to content

Instantly share code, notes, and snippets.

@eterekhin
Last active October 17, 2019 06:05
Show Gist options
  • Save eterekhin/c18ea8e32b0ffca1a6cd1a604959dd5c to your computer and use it in GitHub Desktop.
Save eterekhin/c18ea8e32b0ffca1a6cd1a604959dd5c to your computer and use it in GitHub Desktop.

Как компилятор находит метод расширения определенный для типа

Если статический класс содержит метод расширения, то он помечается атрибутом ExtensionAttribute, при вызове метода расширения над типом, когда компилятор видит вызов метода он сначала просматривает все внутренние методы, и если не находит соответсвующий, то компилятор ищет все классы помеченные атрибутом ExtensionAttribute, а в этих классах методы первый параметр которых передан с ключевым словом this, а тип первого аргумента соответсвует типу на котором вызван статический метод

Может ли вызов extension метода выдать NRE? Почему?

Нет, вызов extension метода в CLR, записывается инструкцией call, которая не генерирует NRE, если вызывается на null (первый аргумент - this == null), поэтому метод расширения может быть вызван на null

Как создается Action в приведенном ниже скрине кода?

При создании action принимает два параметра - первый это контекс (на чем он вызывается), второй - само тело метода, при таком вызове "qwew" - контекст на котором будет вызван action, таким образом мы получаем уже созданный action, который остается только вызвать, при обычном вызове статического метода (без передачи контекста), генерируется делегат с контекстом null

Правила и рекомендации по созданию extension методов

  1. Нельзя создавать public extension методы на типе object или , потому что они загрязняют intellisense
  2. Extension методы из другой сборки видны только если исходная сборка ссылается на нее
  3. Если компилятор найдет два одинаковых методов расширения, то не получится вызвать их через Fluent Api, придется явно указать имя класса в котором содержится метод и сам метод, туда передать аргументы
  4. Если вы определили свой extension метод, а потом автор библиотеки в следующей версии создаст такой же метод в типе, над котором вы определили свой extension, то вызов вашего метода будет подменен вызовом метода класса(потому что методы внутри класса имеют приоритет перед extension методам)

Как можно применять partial методы

Partial Плюс partial методов в том, что их можно не объявлять, т.е задавать только объявление без тела, а тело реализовать в другой части partial класса, таким образом можно объявить partial метод без тела, использовать его в автосгенерированном коде, и если программист не заполнит его, то он просто не вызовется(это работает только для void методов, не принимающих out параметров, потому что вызывающий код сможет работать если partial метод - void, но не сможет если метод должен вернуть какое-то значение

Какой код генерирует компилятор, если находит только объявление partial метода без реализации ?

Он вообще не генерирует этот код, игнорируя вызов метода

Ограничения встречающиеся при создании partial методов

Они должны возвращать void и не принимать out параметров Объявляются только в partial классе partial методы должны быть идентичными по сигнатуре, partial метод может иметь только одну реализацию

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment