Це синтаксис оголошення методів розширення, нової функції 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+ ., це не допоможе вам отримати правильне використання директив у файлі.
Зверніть увагу, що параметр методу зник. Компілятор буде мовчки рухатись по важливих бітах, а саме:
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 - це багато роботи, але це можливо.
Крім того, методи розширення самі по собі дійсно корисні, тому прочитайте про них.
Ось кілька посилань: