这是声明扩展方法的语法,这是 C# 3.0 的新特性。
扩展方法是部分代码,部分是编译器“魔术”,其中编译器在 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.
在点之后,等待智能感知,注意那里有一个 GobbleGobble 方法,完成代码如下:
String s = "Turkey Baster!";
s.GobbleGobble();
重要:声明扩展方法的类必须对编译器和智能感知处理器可用,以便智能感知显示该方法。如果您手动输入 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,其中 C# 的 Linq 语法将为正在运行的对象寻找适当命名的扩展方法,这意味着您可以通过声明将 Linq 支持“引入”任何类型的类正确的扩展方法。当然,完整的 Linq 支持需要做很多工作,但这是可能的。
另外,扩展方法本身非常有用,所以请仔细阅读。
这里有几个链接: