扩展方法的工作原理
本文关键字:工作 方法 扩展 | 更新日期: 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
关键字用于扩展方法的第一个参数,以指定它是扩展方法。
(常规方法的内部实现也将对象作为第一个参数引用,因此编译器对扩展方法所做的只是将它们添加到类中的其他方法中。