Это синтаксис для объявления методов расширения, новой функции C # 3.0.
Метод расширения - это часть кода, часть "волшебства" компилятора, где компилятор с помощью intellisense в Visual Studio создает впечатление, что ваш метод расширения действительно доступен как метод экземпляра для рассматриваемого объекта.
Приведу пример.
В классе String нет метода с именем GobbleGobble, поэтому давайте создадим метод расширения:
public static class StringExtensions
{
public static void GobbleGobble(this string s)
{
Console.Out.WriteLine("Gobble Gobble, " + s);
}
}
Имя класса - это просто мое соглашение об именах, не обязательно называть его так, но оно должно быть статическим, как и метод.
После объявления вышеуказанного метода вы можете в Visual Studio ввести следующее:
String s = "Turkey Baster!";
s.
после точки дождитесь intellisense и обратите внимание, что там есть метод GobbleGobble, завершите код следующим образом:
String s = "Turkey Baster!";
s.GobbleGobble();
Важно : класс, в котором объявлен метод расширения, должен быть доступен компилятору и процессору intellisense, чтобы intellisense мог показать метод. Если вы вводите GobbleGobble вручную и используетеCtrl. сочетанием клавиш + , это не поможет вам получить права using в файле.
Обратите внимание, что параметр метода исчез. Компилятор будет незаметно перемещать важные биты, а именно:
String s = "Turkey Baster!";
s.GobbleGobble();
^ ^
| +-- the compiler will find this in the StringExtensions class
|
+-- will be used as the first parameter to the method
Таким образом, приведенный выше код будет преобразован компилятором в следующий:
String s = "Turkey Baster!";
StringExtensions.GobbleGobble(s);
Так что во время вызова в этом нет ничего волшебного, это просто вызов статического метода.
Обратите внимание, что если ваш метод расширения объявляет более одного параметра, только первый поддерживает this
модификатор, а остальные должны быть указаны как часть вызова метода как обычно:
public static void GobbleGobble(this string value, string extra)
{ | |
... | |
} | |
| |
+--------------------------------------------+ |
| |
v |
s.GobbleGobble("extra goes here"); |
^ |
| |
+-----------------------------------+
Методы расширения были добавлены частично из-за Linq, где синтаксис Linq C # будет искать методы расширения с соответствующими именами для объектов в игре, что означает, что вы можете «внедрить» поддержку Linq в любой тип класса, просто объявив правильное расширение. методы. Конечно, полная поддержка Linq - это большая работа, но это возможно.
Кроме того, сами по себе методы расширения действительно полезны, так что читайте об этом.
Вот несколько ссылок: