由来
一个类想要有新的方法,除了简单粗暴的在类中直接添加,当然可以用继承来实现,不过若为扩展一个方法就用继承,这就大材小用了,况且有些类是不能被继承的。于是乎,c#3.0提出了扩展方法,用它来为现有的类型(比如自定义的类)添加方法。
如何定义扩展方法
a) 扩展方法必须在非嵌套(类中类)非泛型的静态类中定义。
b) 他至少要有一个参数;
c) 第一个参数必须加this关键字作为前缀(第一个参数类型也称为扩展类型,即指方法对这个类型进行扩展);
d) 第一个参数不能使用任何其他的修饰符(如不能用ref、out等修饰符)
e) 第一个参数的类型不能是指针类型。
注意:
c#的代码智能提示中,扩展方法前面都有一个向下的箭头标识。
当我们为一个类型定义扩展方法时,应尽量扩展具体的类型,而不要扩展其基类。
扩展方法无法访问它们所扩展的类型中的私有变量。
编译器如何发现扩展方法
当他看到某个类型的变量在调用方法时,它首先去对象的实例方法中进行查找,如果没有找到与调用方法同名并且参数一致的实例方法,编译器就会去查找是否存在合适的扩展方法。
若从编译器发现扩展方法的过程来看,方法调用的优先级顺序应为:
类型的实例方法——当前命名空间下的扩展方法——导入命名空间的扩展方法。
空引用也可以调用扩展方法。
在c#中,在空引用(即null)上调用实例方法是会引发NullReferenceException异常的,但在空引用上却可以调用扩展方法。这是因为对编译器而言,这个过程就是把空引用对象(或者说变量)当成参数传入静态方法(扩展方法)而已;所以这并不是真正的在空引用上调用方法,故不会出错。//以上是可以通过IL代码来证实的。
怎么调用扩展方法
- 像调用被扩展类型的实例对象的其它实例方法一样调用。
- 静态方法调用方式。类名用定义扩展方法时所在的类。
代码示例
/*main 方法*/
Console.WriteLine(DateTime.Now.GetDatetimeStr());
Console.WriteLine(ExtendClass.GetDatetimeStr(DateTime.Now));
//扩展类
public static class ExtendClass
{
public static string GetDatetimeStr(this DateTime dateTime)
{
return dateTime.ToString("yyyy年MM月dd日 HH时mm分ss秒");
}
}
输出:
2023年04月17日 18时06分22秒
2023年04月17日 18时06分22秒
更新于:2023-04-17
标签:调用,c#,扩展,实例,类型,方法 From: https://www.cnblogs.com/idasheng/p/17326714.html