在 C 语言中静态方法的形式参数中使用“this”关键字#

Use of "this" keyword in formal parameters for static methods in C#

提问人:kpozin 提问时间:5/11/2009 更新时间:7/27/2023 访问量:176808

问:

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

public static int Foo(this MyClass arg)

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

C# 参数 this

评论

11赞 vulcan raven 1/16/2012
除了公认的答案之外,对于 C# 扩展方法,还必须查看官方 MSDN 文档
5赞 Krishna Gupta 7/22/2015
扩展方法很方便,但我们在创建/使用它们时必须小心 - 它们可能会损坏!引用官方 MSDN 文档中的一般准则:“通常,我们建议您谨慎地实现扩展方法,并且仅在必要时才实现扩展方法。...当使用扩展方法扩展其源代码无法更改的类型时,您将面临更改类型实现将导致扩展方法中断的风险。
0赞 mekb 7/21/2019
这是否意味着这是可能的?因为这就是我要找的。

答:

339赞 Preet Sangha 5/11/2009 #1

这是一种扩展方法。有关说明,请参阅此处。

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

扩展方法支持各种有用的方案,并有助于使 可能是真正强大的 LINQ 查询框架......。

这意味着您可以调用

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

而不是

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

这允许构建如下所述的流畅界面

评论

0赞 Gerry 3/8/2019
子类化很难
0赞 Preet Sangha 3/16/2019
@Gerry - 你什么意思?
27赞 Gerry 3/19/2019
对不起,有点讽刺 - 现在很多语法似乎解决了我什至不知道的问题。可读性应该是一个非常高的优先级。
7赞 Myrddin Emrys 4/29/2020
老实说,@Gerry,这听起来有点像你处于一个经典的 Blub 悖论中。现在很多语法都解决了你没有遇到的问题,因为你不知道有更好的方法,或者你没有做这种语法非常棒的任务。大多数关于“这是寻找问题的解决方案”的评论实际上是“我不知道该功能是如何工作的,所以它一定是无用的”的一个例子。
5赞 jpoh 5/11/2009 #2

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

7赞 JP Alioto 5/11/2009 #3

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

96赞 James Wiseman 3/21/2011 #4

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

对我来说,这个问题的答案在那篇帖子的以下陈述中:

请注意上面的 static 方法如何具有 第一个之前的“this”关键字 字符串类型的参数。 这告诉编译器,这 特定的扩展方法应该是 添加到“string”类型的对象中。 在 IsValidEmailAddress() 中 方法实现 然后我可以 访问所有公众 属性/方法/事件 该方法的实际字符串实例 被召唤,又回来了 true/false,取决于它是否是 电子邮件是否有效。

评论

22赞 Lews Therin 7/19/2018
这应该是公认的答案。这是唯一能真正解释方法签名中关键字的实际用途的答案。其他答案只是无济于事地说“这是一种扩展方法”。在阅读此答案之前,我从未完全理解扩展方法如何“附加”到它们扩展的类型。谢谢!this
12赞 Olivier Jacot-Descombes 11/13/2011 #5

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

在此处输入图像描述

你需要一个

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

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

1赞 dcarl661 8/23/2016 #6

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

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

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

14赞 Dean P 9/8/2021 #7

如果你能整齐地弹出一个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();
-1赞 MathGeeksJay 7/27/2023 #8

修饰符 this 在参数前的用法是关于扩展方法的。

有关更详细的说明和示例,请参阅我的 CSDN 博客。

http://t.csdn.cn/QYeW6

评论

0赞 KargWare 8/1/2023
好的做法是在链接旁边分享,还有内容/摘要。外部链接可以更改或删除。