Использование ключевого слова "this" в формальных параметрах для статических методов в С#

Я столкнулся с несколькими экземплярами кода С# следующим образом:

public static int Foo(this MyClass arg)

Я не смог найти объяснение того, что означает ключевое слово this. Любые идеи?

Ответ 1

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

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

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

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

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

а не

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

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

Ответ 2

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

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

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

Ответ 3

В дополнение к объяснению Preet Sangha:
Intellisense отображает методы расширения с помощью синей стрелки (например, перед "Агрегатом < > " ):

enter image description here

Вам нужен

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

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

Ответ 5

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

Ответ 6

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

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

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