繁体   English   中英

扩展方法如何在C#中工作?

[英]How do extension methods work in C#?

我不确定如何确定某个方法是否是扩展方法。 我阅读了以下准则:

  1. 该方法必须在静态类中(例如“ IntExtensions”)。

  2. 该方法必须是“ public static”(例如public static int Half(this int source)

我的扩展方法问题是:

  1. 我不明白我们如何知道该方法将扩展到哪个类。 难道有类this之前呢? 因此,在上面的示例中,它将是字符串吗?
  2. 包围该方法的静态类起什么作用? 整个语法看起来很混乱。
  3. 我不能为同一类下的不同类组合许多不同的扩展方法(这似乎没有意义,因为我只想扩展1个类),例如:

/

public static class IntExtensions 
{
    // method has to be static, first parameter is tagged with the 'this'
    // keyword, the type of the parameter is the type that is extended.
    public static int Half(this int source) 
    {
        return source / 2;
    }

    public static string foo( this string s)
    {
        //some code
    }
}
  1. 扩展方法扩展的类型直接位于签名中this关键字之后,因为这是您的方法将在其上执行的对象的实例。

  2. 扩展方法必须是静态的,因为没有类的实例可以调用它们(而是将它们传递给实例)。 使用静态类可确保所有方法也是静态的。

  3. 是的,你可以。 正如您所说,这没有任何意义。 然后,该类的使用者将接触所有类型的所有扩展方法,而不是与单个类型相关的方法(这就是为什么我通常按其操作的类型来组织扩展方法类的原因)。

我不明白我们如何知道该方法将扩展到哪个类。 难道有类this之前呢?

是。 始终是方法的第一个参数。 您不能使用this装饰任何其他参数。 (而且这是事实, this是目前它告诉你要编写扩展方法的编译程序。)

包围该方法的静态类起什么作用? 整个语法看起来很混乱。

这只是“容纳”扩展方法的类。 尽管扩展方法可以使用,但它们通常不使用编写它们的类的任何其他成员。 (例如,扩展方法可以在包含它的静态类中使用私有静态字段。)

在许多方面(包括这一方面),扩展方法只是一种常规的静态方法。 它必须在顶级静态非泛型类中,并且第一个参数不能为outref ,但是一旦满足这些条件,就方法实现而言,它只是一个普通方法。 调用者而言,这是“特殊的”,就如何调用该方法而言。 (请注意,也可以使用与其他任何静态方法相同的方式来调用它。)

我不能为同一类下的不同类组合一些不同的扩展方法(这似乎没有意义,因为我只想扩展1个类)

是的你可以。 通常这不是一个好主意,但是您绝对可以做到。

方法将扩展到哪个类。 难道有类this之前呢? 因此,在上面的示例中,它将是string

是。

包围该方法的静态类起什么作用? 整个语法看起来很混乱。

请参见扩展方法(C#编程指南)

在您的代码中,您将使用实例方法语法调用扩展方法。 但是,编译器生成的中间语言(IL)将您的代码转换为对静态方法的调用。

因此该类必须是静态的,因为编译器不会创建该类的实例。

我不能为同一类下的不同类组合许多不同的扩展方法

是的你可以。

1)是的,它是'this'之后的类型

2)方法必须始终在类内。 它不能在非静态类中,或者它将是成员,并且需要该类类型的对象才能操作。 因此,唯一的选择是静态类,可以在任何地方调用它。

3)是的,您可以根据需要将它们分组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM