Использование ключевого слова this в формальных параметрах для статических методов в C # - PullRequest
251 голосов
/ 11 мая 2009

Я встречал несколько примеров кода на C #, таких как:

public static int Foo(this MyClass arg)

Мне не удалось найти объяснение того, что означает ключевое слово this в этом случае. Есть идеи?

Ответы [ 6 ]

247 голосов
/ 11 мая 2009

Это метод расширения . Смотрите здесь объяснение .

Методы расширения позволяют разработчикам добавлять новые методы для общественности контракт существующего типа CLR, без необходимости подкласса его или перекомпилируйте исходный тип. Методы расширения помогают смешать гибкость поддержки "утиной типизации", популярной в динамических языках сегодня с проверкой производительности и времени компиляции строго типизированные языки.

Методы расширения позволяют использовать множество полезных сценариев и помогают возможно действительно мощная структура запросов LINQ ....

это означает, что вы можете позвонить

MyClass myClass = new MyClass();
int i = myClass.Foo();

вместо

MyClass myClass = new MyClass();
int i = Foo(myClass);

Это позволяет создавать плавные интерфейсы , как указано ниже.

39 голосов
/ 21 марта 2011

Цитируемое сообщение в блоге Скотта Гу объясняет это прекрасно.

Для меня ответ на вопрос заключается в следующем утверждении в этом посте:

Обратите внимание, что вышеописанный статический метод имеет Ключевое слово this перед первым аргумент параметра типа строка. Это говорит компилятору, что это конкретный метод расширения должен быть добавлены объекты типа "строка". Внутри IsValidEmailAddress () Реализация метода я могу тогда доступ ко всей публике свойства / методы / события фактический экземпляр строки, что метод вызывается, и вернуться истина / ложь в зависимости от того, действительный адрес электронной почты или нет.

13 голосов
/ 12 ноября 2011

В дополнение к объяснению Прита Сангхи:
Intellisense отображает методы расширения с синей стрелкой (например, перед «Aggregate <>»):

enter image description here

Вам нужен

using the.namespace.of.the.static.class.with.the.extension.methods;

чтобы методы расширения появлялись и были доступны, если они находятся в другом пространстве имен, чем код, использующий их.

7 голосов
/ 11 мая 2009

Это методы расширения . Добро пожаловать в совершенно новый беглый мир . :)

3 голосов
/ 11 мая 2009

Я только что узнал об этом сам на днях: ключевое слово this определяет, что метод является расширением класса, который его обрабатывает. Так что для вашего примера MyClass будет иметь новый метод расширения с именем Foo (который не принимает никаких параметров и возвращает int; его можно использовать как с любым другим открытым методом).

1 голос
/ 22 августа 2016

«this» расширяет следующий класс в списке параметров

Таким образом, в сигнатуре метода ниже "this" расширяет "String". Строка передается функции как обычный аргумент метода. открытая статическая строка [] SplitCsvLine (эта строка String)

В приведенном выше примере класс "this" расширяет встроенный класс "String".

...