c# 扩展方法
由来
一个类想要有新的方法,除了简单粗暴的在类中直接添加,当然可以用继承来实现,不过若为扩展一个方法就用继承,这就大材小用了,况且有些类是不能被继承的。于是乎,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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)