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

时间:2009-05-11 05:05:02

标签: c# parameters this

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

public static int Foo(this MyClass arg)

我无法找到this关键字在这种情况下的含义的解释。任何见解?

6 个答案:

答案 0 :(得分:247)

这是扩展方法。请在此处查看explanation

  

扩展方法允许开发人员向公众添加新方法   现有CLR类型的合同,无需对其进行子类化   重新编译原始类型。扩展方法有助于混合   动态语言中流行的“鸭子打字”支持的灵活性   今天的性能和编译时验证   强类型语言。

     

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

这意味着您可以致电

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

而不是

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

这允许构建fluent interfaces,如下所述。

答案 1 :(得分:39)

Scott Gu's quoted blog post很好地解释了。

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

  

注意上面的静态方法有一个   “this”关键字在第一个之前   string类型的参数参数。   这告诉编译器这个   特殊的扩展方法应该是   添加到“string”类型的对象。   在IsValidEmailAddress()内   方法实现我可以   访问所有公众   属性/方法/事件   该方法的实际字符串实例   被召唤,并返回   是/否取决于是否   是否有效的电子邮件。

答案 2 :(得分:13)

In addition to Preet Sangha's explanation:
Intellisense用蓝色箭头显示扩展方法(例如在“Aggregate<>”前面):

enter image description here

你需要一个

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

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

答案 3 :(得分:7)

他们是extension methods。欢迎来到全新的fluent world。 :)

答案 4 :(得分:3)

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

答案 5 :(得分:1)

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

所以在下面的方法签名"这个"扩展"字符串"。 Line作为方法的正常参数传递给函数。 public static string [] SplitCsvLine(this String line)

在上面的例子中"这个" class正在扩展内置的" String"类。