GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
http://cnsendnet.taobao.com
来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=476php
扩展方法使你可以向现有类型“添加”方法,而无需建立新的派生类型、从新编译或以其余方式修改原始类型。 扩展方法是一种特殊的静态方法,但能够像扩展类型上的实例方法同样进行调用。 以上是msdn官网对扩展方法的描述,如今我经过一个情景例子来对此进行阐释。假设一个控制台程序class Program{}里面的主函数以下:编程
static void Main(string[] args)
{
DateTime now = DateTime.Now;
string time = now.ToString("yyyy-MM-dd HH:mm:ss");
Console.WriteLine(time);
Console.ReadKey();
}网络
假设需求变了,日期的显示格式要变成"yyyy-MM-dd"这种格式,固然只须要初始化time时按下面写法改写便可:
string time = now.ToString("yyyy-MM-dd");
可是若是要改变日期格式的有不少个类呢?每一个都要改一次吗?这样一旦需求变来变去就忙死人了。传统的解决方式是封装一个帮助类,在里面写方法,而后供其余类调用。
本例在当前项目模仿添加一个DateHelper类:public class DateHelper{},在类里面定义方法:
public static string DateToString(DateTime dt)
{
return dt.ToString("yyyy-MM-dd HH:mm:ss");
}
因而原来的主函数改写以下:运维
static void Main(string[] args)
{
DateTime now = DateTime.Now;
string time = DateHelper.DateToString(now);
Console.WriteLine(time);
Console.ReadKey();
}ide
此时若是变需求,只须要改写DateHelp类里的DateToString()方法就好了,无论有多少个类调用此方法,都会被影响。问题解决了,但是这样要调用另外一个类的方法,仍是有点麻烦,有没有什么方法可以让咱们像now.DateToString()同样直接调用呢?固然DateTime是微软写好的,咱们改不了,没法建立想要的实例方法,因而,便引出了扩展方法。
下面是扩展方法的要素:
1.此方法必须是一个静态方法
2.此方法必须放在静态类中
3.此方法的第一个参数必须以this开头,而且指定此方法是扩展自哪一个类型
根据以上要素,咱们DateHelper类改为静态类:public static class DateHelper{} ,同时改写DateToString()方法:
public static string DateToString(this DateTime dt)
{
return dt.ToString("yyyy-MM-dd HH:mm:ss");
}
此时回到主函数方法体,输入"now."即可以看见自动提示有个DateToString()方法,因而代码能够这样写:函数
static void Main(string[] args)
{
DateTime now = DateTime.Now;
string time = now.DateToString();
Console.WriteLine(time);
Console.ReadKey();
}学习
显而易见,这样用起来会更加便捷,并且这样让咱们看起来确实就像是被扩展类型自己具备的实例方法同样,可读性很高。下面归纳一下扩展方法的特色:
1.扩展方法扩展自哪一个类型,就必须是此类型的变量来使用,其余类型没法使用,本例扩展自DateTime类型,就只能是被DateTime类型的变量.出来(now.DateToString())
2.扩展方法中的this后面的参数不属于方法的参数,本例是无参数,this后面的DateTime dt是指明扩展方法扩展自何种类型
3.若是扩展方法和实例方法具备相同的签名,则优先调用实例方法
4.扩展自父类上的方法,能够被子类的对象直接使用
5.扩展自接口上的方法,能够被实现类的对象直接使用
6.扩展方法最终仍是被编译器编译成:静态类.静态方法(),本例中now.DateToString()最终仍是会被编译成DateHelper.DateToString(now),这是它的本质
实际上,咱们可能会遇到这样的情景,如在接口扩展一个方法的时候,全部的本来已实现该接口的类都要实现新扩展的方法,这样的改动是一个很麻烦的工做,可使用扩展方法“曲线救国”;而有时候咱们想为某个类添加新方法却不想改动这个类,那么扩展方法这种“伪添加”方法的方式就体现出它的价值了。最多见的扩展方法是LINQ标准查询运算符,运用普遍,这种方便快捷的方式理应博得码农们点1024个赞。动画
什么是扩展方法?
扩展方法从字面上理解是指扩展的方法,而对应到面向对象编程这个格局中则是指为一个类提供的扩展方法。按照咱们一般的理解,咱们首先须要得到某个类的源代码,而后在这个类代码中增长成员方法,这样就能够达到为一个类提供扩展方法的目的。但是不幸地是,这种方法在没有源代码的状况下就没法奏效了,并且咱们人为地去改变源代码有可能会破坏整个代码的稳定性。那么有没有一种方法能在不改变源代码的前提下为某个类提供扩展方法呢?这就是咱们今天要说的扩展方法,因此咱们能够将扩展方法理解为在不改变源代码的前提下向外部提供扩展方法的一种方式。C#中的扩展方法实现起来是相对来讲比较简单的,例如咱们作在Unity3D游戏开发的时候,可能会用到DOTween这个插件。这个插件是iTween的做者从新编写一个动画插件,效率上比iTween有较大的提高。更为重要的一点是,它采用扩展方法这种实现方式,使得咱们在调用这些API接口的时候难以感受到咱们是在使用一个插件,更像是在使用Unity3D的原生函数,因此当咱们使用DOTween + uGUI 这样的组合的时候,心里会感到无比的舒畅,一切都像是水到渠成通常。
扩展方法有哪些特色?
扩展方法在实现上和普通的面向对象编程是同样的,换句话说,咱们只须要定义一个类,而后在里面添加并实现相应的方法便可。可是这里须要注意的地方有三点,第一,实现扩展方法的类必须是静态类且类的名称和实现扩展方法的类无关;第2、实现扩展方法的类方法必须是静态方法;第3、实现扩展方法的类方法的第一个参数必须是使用this关键字指明要实现扩展方法的类。例如,咱们知道将一个合法字符串类型转换为整型,可使用int.parse()方法,假如咱们但愿为string类型扩展一个ToInt方法应该怎么办呢?咱们一块儿来看下面的这段代码:网站
GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
http://cnsendnet.taobao.com
来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=476this