博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3. Extension Methods(扩展方法)
阅读量:4192 次
发布时间:2019-05-26

本文共 2512 字,大约阅读时间需要 8 分钟。

什么是扩展方法?简而言之,扩展方法是一种开发人员轻松快捷地扩展已有类型的方法定义和实现的机制。具体一点儿讲,首先,扩展方法必须是静态方法,从语法的层面来看它的调用和实例方法没有什么区别,我们还是看码说话吧:

1: public static class ExtensionMethodDemo
2: {
3:     public static decimal ToMoney(this string money)
4:     {
5:         decimal number = 0m;
6:  
7:         if (!decimal.TryParse(money, out number))
8:         {
9:             throw new ArgumentException("Money Error Information.");
10:         }
11:  
12:         return number;
13:     }
14:  
15:     public static int ToAge(this string age)
16:     {
17:         int number = 0;
18:  
19:         if (!int.TryParse(age, out number))
20:         {
21:             throw new ArgumentException("Age Error Information.");
22:         }
23:  
24:         return number;
25:     }
26: }

这段代码的作用是扩展string类型,使其拥有直接将string类型转换成decimal或int类型的方法,调用方法如下:

1: static void Main(string[] args)
2: {
3:     string moneyInput = Console.ReadLine();
4:  
5:     decimal money = moneyInput.ToMoney();
6:     int age = "24".ToAge();
7:  
8:     // TODO: Do something...
9: }

不难看出,我们很轻松地就为字符串增加了两个可能在实际项目中常常需要用到的方法,同时扩展方法还传承了C#简洁高雅的语法传统,接下来我们来仔细研究一下上面的这两段代码吧。

如前所示,扩展方法必须是静态的,因此static关键字是少不了的,扩展方法只能在非泛型或非嵌套的静态类中声明,它是通过关键字this作为其第一个参数的修饰符来声明,它的第一个参数除了this关键字以外可以没有别的修饰符,同时这个参数不能是指针类型。扩展方法具备和常规静态方法一样的能力,我们不妨来看一个复杂一点儿的扩展方法:

1: namespace DevLab
2: {
3:     class Program
4:     {
5:         static void Main(string[] args)
6:         {
7:             string[] names = new string[] { "ZeroCool", "Michael", "Autumoon" };
8:             string[] nameRange = names.Range(0, 2);
9:  
10:             var ages = new int[] { 1, 2, 3, 4 };
11:             var ageRange = ages.Range(1, 2);
12:  
13:             // TODO: Do something...
14:         }
15:     }
16:  
17:     public static class ExtensionMethodDemo
18:     {
19:         public static T[] Range         (     this T[] original,      int startIndex,      int count)
20:         {
21:             if (startIndex < 0 || count < 0 || startIndex > original.Length)
22:             {
23:                 throw new ArgumentException("Argument Error Information.");
24:             }
25:  
26:             T[] result = new T[count];
27:             Array.Copy(original, startIndex, result, 0, count);
28:  
29:             return result;
30:         }
31:     }
32: }

通过上面这段代码,大家可以看到扩展方法这套机制的强大之处了吧。

另外,我们需要注意的是,实例方法要优先于扩展方法的调用,在命名空间内声明的扩展方法要优先于命名空间外声明的扩展方法的调用;并且,由于就功能性而言,扩展方法相比实例方法更不明显且具有更多的限制,所以微软官方推荐大家谨慎适用扩展方法,最好只在实例方法不可行的情况下使用。最后,扩展方法目前还不支持属性、事件和操作符等类型。

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1887761

你可能感兴趣的文章
(七)Git--自定义Git
查看>>
(五)Git--分支管理
查看>>
(四)Git--远程仓库
查看>>
(六) Git--标签管理
查看>>
java中继承,子类是否继承父类的构造函数
查看>>
什么是Spring Cloud ?
查看>>
pyqt实现界面化编程
查看>>
qt写DLL文件并调用和出现的问题分析
查看>>
工厂模式(Factory)-设计模式(一)
查看>>
建造者模式(Builder)-设计模式(三)
查看>>
初学Java必备基础知识,编程领域你需要掌握的关键点!
查看>>
阿里五年Java程序员的总结,献给还在迷茫中的你!
查看>>
程序员身上有异味,同事为什么都不会直接告诉他?
查看>>
大数据折射算法“歧视”?王思聪微博抽奖113位,仅有一位男性
查看>>
Java、C、C+ +、PHP、Python分别用来开发什么?一篇文章告诉你!
查看>>
Linux-SHELL常用命令
查看>>
Linux-网络运维基础
查看>>
Verilog编程网站学习——门电路、组合电路、时序电路
查看>>
android——学生信息显示和添加
查看>>
Android——ImageSwitcher轮流显示动画
查看>>