329

我遇到了几个 C# 代码实例,如下所示:

public static int Foo(this MyClass arg)

在这种情况下,我无法找到this关键字含义的解释。有什么见解吗?

4

7 回答 7

307

这是一种扩展方法。请参阅此处了解说明

扩展方法允许开发人员向现有 CLR 类型的公共协定添加新方法,而无需对其进行子类化或重新编译原始类型。扩展方法有助于将当今动态语言中流行的“鸭子类型”支持的灵活性与强类型语言的性能和编译时验证相结合。

扩展方法支持各种有用的场景,并帮助实现真正强大的 LINQ 查询框架......

这意味着你可以打电话

MyClass myClass = new MyClass();
int i = myClass.Foo();

而不是

MyClass myClass = new MyClass();
int i = Foo(myClass);

这允许构建流畅的接口,如下所述。

于 2009-05-11T05:08:13.580 回答
79

Scott Gu 引用的博客文章很好地解释了这一点。

对我来说,该问题的答案在该帖子的以下声明中:

请注意上面的静态方法如何在字符串类型的第一个参数参数之前有一个“this”关键字。这告诉编译器这个特定的扩展方法应该被添加到“字符串”类型的对象中。在 IsValidEmailAddress() 方法实现中,我可以访问调用该方法的实际字符串实例的所有公共属性/方法/事件,并根据它是否为有效电子邮件返回真/假。

于 2011-03-21T10:54:36.583 回答
12

除了 Preet Sangha 的解释:
Intellisense 用蓝色箭头显示扩展方法(例如在“Aggregate<>”前面):

在此处输入图像描述

你需要一个

using the.namespace.of.the.static.class.with.the.extension.methods;

如果扩展方法与使用它们的代码位于不同的命名空间中,则它们可以显示并可用。

于 2011-11-12T17:33:21.637 回答
8

它们是扩展方法。欢迎来到一个全新的流畅世界。:)

于 2009-05-11T05:09:29.210 回答
5

前几天我自己才知道这一点:this 关键字定义该方法是执行它的类的扩展。因此,对于您的示例,MyClass 将有一个名为 Foo 的新扩展方法(它不接受任何参数并返回一个 int;它可以与任何其他公共方法一起使用)。

于 2009-05-11T05:08:14.097 回答
5

如果您可以巧妙地弹出一个 List<>,即不仅删除第一个元素,而且还返回它,那不是很方便吗?

List<int> myList = new List<int>(1, 2, 3, 4, 5);

没有扩展方法:

public static class ContainerHelper
{
    public static T PopList<T>(List<T> list)
    {
        T currentFirst = list[0];
        list.RemoveAt(0);
        return currentFirst;
    }
}

调用此方法:

int poppedItem = ContainerHelper.PopList(myList);

使用扩展方法:

public static class ContainerHelper
{
    public static T PopList<T>(this List<T> list)//Note the addition of 'this'
    {
        T currentFirst = list[0];
        list.RemoveAt(0);
        return currentFirst;
    }
}

调用此方法:

int poppedItem = myList.PopList();
于 2021-09-08T08:55:13.287 回答
1

"this" 扩展了参数列表中的下一个类

所以在“this”下面的方法签名中扩展了“String”。行作为方法的普通参数传递给函数。public static string[] SplitCsvLine(这个字符串行)

在上面的例子中,“this”类扩展了内置的“String”类。

于 2016-08-22T18:10:41.170 回答