Я встречал несколько примеров кода на C #, таких как:
public static int Foo(this MyClass arg)
Я не смог найти объяснение, что this
означает ключевое слово в этом случае. Есть идеи?
Я встречал несколько примеров кода на C #, таких как:
public static int Foo(this MyClass arg)
Я не смог найти объяснение, что this
означает ключевое слово в этом случае. Есть идеи?
Ответы:
Это метод расширения . Смотрите здесь для объяснения .
Методы расширения позволяют разработчикам добавлять новые методы к общедоступному контракту существующего типа CLR без необходимости подкласса его или перекомпиляции исходного типа. Методы расширения помогают сочетать гибкость поддержки «утиной типизации», популярной сегодня в динамических языках, с производительностью и проверкой во время компиляции строго типизированных языков.
Методы расширения позволяют использовать множество полезных сценариев и помогают создать действительно мощную инфраструктуру запросов LINQ ....
это означает, что вы можете позвонить
MyClass myClass = new MyClass();
int i = myClass.Foo();
скорее, чем
MyClass myClass = new MyClass();
int i = Foo(myClass);
Это позволяет создавать плавные интерфейсы, как указано ниже.
Цитируемое сообщение в блоге Скотта Гу хорошо объясняет это.
Для меня ответ на вопрос в следующем утверждении в этом посте:
Обратите внимание, что у статического метода выше есть ключевое слово this перед первым аргументом параметра типа string. Это говорит компилятору, что этот конкретный метод расширения должен быть добавлен к объектам типа «строка». В реализации метода IsValidEmailAddress () я могу затем получить доступ ко всем открытым свойствам / методам / событиям фактического экземпляра строки, к которому вызывается метод, и вернуть истину / ложь в зависимости от того, является ли это действительным письмом или нет.
this
ключевого слова в сигнатуре метода. Другие ответы бесполезно говорят «это метод расширения». Я никогда полностью не понимал, как методы расширения «присоединяются» к типам, которые они расширяют, до прочтения этого ответа. Спасибо!
В дополнение к объяснению Прита Сангхи:
Intellisense отображает методы расширения с синей стрелкой (например, перед «Aggregate <>»):
Ты нуждаешься в
using the.namespace.of.the.static.class.with.the.extension.methods;
чтобы методы расширения появлялись и были доступны, если они находятся в другом пространстве имен, чем код, использующий их.
Это методы расширения . Добро пожаловать в совершенно новый беглый мир . :)
Я только что узнал об этом на днях: ключевое слово this определяет, что метод является расширением класса, который его обрабатывает. Так что для вашего примера MyClass будет иметь новый метод расширения с именем Foo (который не принимает никаких параметров и возвращает int; его можно использовать как с любым другим открытым методом).
«this» расширяет следующий класс в списке параметров
Таким образом, в сигнатуре метода ниже «this» расширяет «String». Строка передается функции как обычный аргумент метода. открытая статическая строка [] SplitCsvLine (эта строка String)
В приведенном выше примере класс «this» расширяет встроенный класс «String».