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


286

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

public static int Foo(this MyClass arg)

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


10
除了可接受的答案之外,对于C#扩展方法,还必须查阅MSDN官方文档
vulcan raven 2012年

4
扩展方法很方便,但是在创建/使用扩展方法时一定要小心-它们可能会损坏!引用MSDN官方文档中的 “ 一般准则” :“通常,建议您仅在必要时才少量实施扩展方法。...使用扩展方法扩展无法更改其源代码的类型时,冒着风险,即类型实现的更改会导致扩展方法中断。”
克里希纳·古普塔

这是否意味着将是可能的?因为那是我要的东西。
facepalm42

Answers:


274

这是一种扩展方法。参见这里的解释

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

扩展方法可实现各种有用的方案,并有助于实现真正强大的LINQ查询框架...。

这意味着你可以打电话

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

而不是

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

这样可以构建如下所述的流畅接口


子类别很难
格里(Gerry)

@Gerry-你是什么意思?
Preet Sangha

9
抱歉,有点讽刺-如今,很多语法似乎可以解决我什至不知道是问题的问题。可读性应该是非常重要的。
格里

2
说实话,@ Gerry,听起来像您在经典的Blub Paradox中。如今,许多语法可以解决您所没有的问题,因为您不知道有更好的方法,或者您没有执行该语法令人敬畏的任务。关于“ 这是解决问题的解决方案 ”的大多数评论实际上是“ 我不知道该功能的工作原理,因此它一定没有用 ”的一个示例。
Myrddin Emrys

53

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

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

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


9
这应该是公认的答案。这是唯一可以真正解释this方法签名中关键字的实际目的的答案。其他答案只能无奈地说“这是一种扩展方法”。在阅读此答案之前,我从未完全理解扩展方法如何“附加”到它们扩展的类型。谢谢!
Lews Therin



4

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


1

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

因此,在“ this”下面的方法签名中扩展了“ String”。将行作为方法的常规参数传递给函数。公共静态字符串[] SplitCsvLine(此字符串行)

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.