Это синтаксис для объявления методов расширения, новой функции 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.ssor для того, чтобы intellisense показывал метод.Если вы наберете GobbleGobble вручную и воспользуетесь сочетанием клавиш Ctrl + . , это не поможет вам правильно использовать директивы в файле.
Обратите внимание, чтоПараметр метода исчез.Компилятор будет молча перемещаться по важным битам, которые являются:
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 - большая работа, но это возможно.
Кроме того, методы расширения сами по себе действительно полезны, так что читайте об этом.
Вот несколько ссылок: