Ответ 1
Это синтаксис для объявления методов расширения, новая функция С# 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 + ., это не поможет вам получить правильное использование директив в файле.
Обратите внимание, что параметр метода исчез. Компилятор будет молча перемещаться по важным битам, которые:
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 С# будет искать подходящие именованные методы расширения для объектов в игре, что означает, что вы можете "внедрить" Linq-поддержку в любой тип класса, просто объявив правильные методы расширения. Конечно, полная поддержка Linq - это большая работа, но это возможно.
Кроме того, сами методы расширения действительно полезны, поэтому читайте на нем.
Вот несколько ссылок: