Ключевое слово this в параметрах метода

182
03 января 2022, 09:50

В процессе изучения заметил конструкцию метода:

public void myMethod(this int[] array)
{
// ignore
}

Подскажите, какая роль ключевого слова this в данной ситуации?

Answer 1

Это метод расширения (Extension Method)

Методы расширения позволяют "добавлять" методы в существующие типы без создания нового производного типа, перекомпиляции и иного изменения первоначального типа. Методы расширения представляют собой особую разновидность статического метода, но вызываются так же, как методы экземпляра в расширенном типе. Для клиентского кода, написанного на языках C#, F# и Visual Basic, нет видимого различия между вызовом метода расширения и вызовом методов, фактически определенных в типе.

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

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

вместо

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

Это позволяет сделать "текучий интерфейс" (fluent interface)

Вот здесь показан пример

Answer 2

какая роль ключевого слова this в данной ситуации?

То определение метода, что вы привели не имеет никакого смысла, и скорее всего выдаст ошибку компиляции. Наверно вы потеряли static и имели ввиду это

public static void MyMethod(this int[] array)
{
// ignore
}

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

public static class MyExtensions
{
    public static void myMethod(this int[] array)
    {
    // ignore
    }
}

Теперь в пространстве имён, в котором объявлен MyExtensions и во всех модулях, в которые будет добавлен using этого пространства имён, у массивов int появится метод MyMethod()

var arr = new int[4]{0,1,2,3};
arr.MyMethod();

При выполнении метода в качестве первого аргумента выступит собственно сам массив. Если бы вы добавили еще параметров в MyMethod(), то они получали бы аргументы из оператора вызова ().

Нужно иметь ввиду, что методы расширения это приём нарушающий классические ООП принципы. Но в тоже время такая замечательная вещь как LINQ реализована на их основе.

READ ALSO
C# общая структура программы!

C# общая структура программы!

Я новичокПисал программу пару недель, сейчас обнаружил, что основной файл проекта это Program

178
Зачем нужен атрибут [Conditional("DEBUG")]?

Зачем нужен атрибут [Conditional("DEBUG")]?

Есть такой код но я не могу понять зачем тут нужен я гуглил и так и не понял что делает: [Conditional("DEBUG")] ,ссылка от куда я брал код https://docsmicrosoft

266
C# вывод элементов из публичного класса в ListBox

C# вывод элементов из публичного класса в ListBox

Дорогие друзья! Сразу прошу прощения за мою неопытностьИмею две формы, в которых есть ListBox

97
LINQ groupby отсортировать в группе

LINQ groupby отсортировать в группе

Нужно сгруппировать все паллеты по сроку годности, отсортировать по возрастанию срока годности, в каждой группе отсортировать паллеты по весу

159