gpt4 book ai didi

c# - 函数参数中的 "this"

转载 作者:IT王子 更新时间:2023-10-29 03:39:38 26 4
gpt4 key购买 nike

查看 HtmlHelpers 的一些代码示例,我看到如下声明:

public static string HelperName(this HtmlHelper htmlHelper, ...more regular params )

我不记得在其他任何地方看到过这种类型的构造 - 谁能解释一下“this”的目的?我认为通过声明 public static 意味着不需要实例化该类 - 那么在这种情况下“this”是什么?

最佳答案

这是声明扩展方法的语法,是 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.

在点之后,等待intellisense,注意那里有一个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 支持需要做很多工作,但这是可能的。

此外,扩展方法本身非常有用,因此请仔细阅读。

这里有几个链接:

关于c# - 函数参数中的 "this",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3045242/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com