Home Articles

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

Asked
Viewed 177 times
239

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

public static int Foo(this MyClass arg)

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

6 Answers

  • 236

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

    enter image description here

    你需要一个

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

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

  • 32

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

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

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

  • 13

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

    所以在下面的方法签名中,“this”扩展了“String” . Line作为方法的正常参数传递给函数 . public static string [] SplitCsvLine(this String line)

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

  • 7

    这是 extension method . 在这里查看explanation .

    扩展方法允许开发人员将新方法添加到现有CLR类型的公共协定中,而无需对其进行子类化或重新编译原始类型 . 扩展方法有助于将当今动态语言中流行的“duck typing”支持的灵活性与强类型语言的性能和编译时验证相结合 . 扩展方法支持各种有用的场景,并有助于实现真正强大的LINQ查询框架....

    这意味着你可以打电话

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

    而不是

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

    这允许构建如下所述的fluent interfaces .

  • 3

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

  • 1

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

Related