扩展方法的工作原理

本文关键字:工作 方法 扩展 | 更新日期: 2023-09-27 18:08:53

我想了解扩展方法的工作原理吗?我们可以在非静态类中定义扩展方法吗?

*

为什么我们要把扩展方法放在静态类中?

*

根据MSDN,

**它们的第一个参数指定方法操作的类型,参数前面有 this 修饰符。扩展方法 仅当您将命名空间显式导入您的 带有 using 指令的源代码。

**

这个运算符在这里的作用是什么,它如何将该扩展方法与该参数相关联?

扩展方法的工作原理

不可以,不能在非静态类上定义扩展方法。

this是语法糖,允许在实例上调用静态扩展方法。但归根结底,扩展方法只不过是静态类中的静态方法。

所以基本上:

var test = myInstance.MyExtensionMethod();

var test = MyExtensionClass.MyExtensionMethod(myInstance);
它们是

方法成为扩展方法的 4 个要求:

  • 它必须在静态类中声明
  • 它必须是静态的(如果满足第一个,这实际上总是正确的(
  • 它必须是公开的
  • 它必须用this关键字标记第一个参数

因此,您无法在非静态类中定义扩展方法。

整个扩展方法功能是某种语法糖。在MyClass上声明以下扩展方法:

// The following extension methods can be accessed by instances of any  
// class that is or inherits MyClass. 
public static class Extension
{
    public static void MethodA(this MyClass myInterface, int i)
    {
        Console.WriteLine
            ("Extension.MethodA(this IMyInterface myInterface, int i)");
    }
}

可以通过两种方式调用:

var myClassObject = new MyClass();
Extension.MethodA(myClassObject);

myClassObject.MethodA();

但是,无论如何,编译器都会将第二个转换为第一个。

这个运算符在这里的作用是什么,它是如何与之关联的 该参数的扩展方法?

在这种情况下,this不是运算符,而是修饰符。它可以被称为其他东西,它与this对象无关,该对象在正常方法调用中引用当前对象。

this修饰符的作用是告诉编译器这实际上是一个扩展方法,而不是一个标准的静态方法,这样当你以看起来像实例方法调用的方式调用它时,它就不会抱怨,尽管它不是。

不,扩展方法必须在静态类中,这只是规则。本来可以允许在任何地方定义扩展方法,但为了更容易找到它们,不允许将它们埋在带有许多其他代码的类中。

this 关键字用于扩展方法的第一个参数,以指定它是扩展方法。

(常规方法的内部实现也将对象作为第一个参数引用,因此编译器对扩展方法所做的只是将它们添加到类中的其他方法中。