`
k_lb
  • 浏览: 798511 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论
  • kitleer: 据我所知,国内有款ETL调度监控工具TaskCTL,支持ket ...
    kettle调度

C#3.0新体验 (二) 扩展方法

 
阅读更多
前言:

学习除了要坚持不懈,还需要有好的方法!总结整理自己学习的资料能使得所学的内容条理清晰,查找回顾也很方便!俗话说的好:“好记性不如烂笔头”;以前很多知识都是看过后,过一段时间就忘记,时间花下去了,但效果甚微;看的多,但杂而不精;这些都是没有做笔记,没有深入学习而导致的时间与精力的浪费,因此每个研究课题,都要好好整理资料,做一个系列的研究!

三.扩展方法 (续接上一编)

扩展方法定义如下:

public static class Extensions{
public static void Foo(this string s) {

}
}

使用:
String s=“Hello,World”;
s.Foo();

我们以前会对一些参数、对象进行某些处理,而写一些独立方法来封装这些处理语句;这些方法为了方便重用,可能会写在一些公共类里供大家调用,例如:

定义一个公共方法计算每天有多少分钟,
public class PublicCenter
{
//传入参数为天数
public long GetDaysMin(int pDays)
{
return pDays * 24 * 60;
}
}
外部使用调用:
int days = 3;
PublicCenter pCenter = new PublicCenter();
int minutes = pCenter.GetDaysMin(days);

我想大家对上面这段代码的使用都非常熟悉,以前这样处理的情况非常的多!现在我们看看用扩展方法来处理会是怎么样;

定义一个静态类静态方法计算每天有多少分钟(注意必须是静态)
public staticclass PublicCenter
{
//传入参数为天数(注意this关键字必不可少)
public staticlong GetDaysMin( this int pDays)
{
return pDays * 24 * 60;

}
}
外部使用调用:(注意静态类必须同在一个命名空间,或添加引用,这个大家应该也知道的(啰嗦))
int days = 3;
//当我们在所以int类型的变量后按下".",就会智能提示出这些自己写的扩展方法GetDaysMin()。
int minutes = days.GetDaysMin()

大家可以看出扩展方法的本质为将实例方法调用在编译期改变为静态类中的静态方法调用。

MSDN中对扩展方法的定义是:扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。

为什么使用扩展方法?

第一.使用方便:定义好某个类型的扩展方法后,只要是在这个类型后面点一个“.",就可以找到所有的扩展方法;而不用像以前先要找到方法所放的那个类,然后用通过调用该类的方法来实现;(很多时候,公共类库和实际调用是不同开发人员开发的,往往需要调用的人员不知道哪个类有哪些功能可以使用,这个在公共类库比较庞大的时候很麻烦)

第二.扩展方便:可以很方便的扩展底层类库,接口,第三方类库(控件,插件)等等,在上面添加我们需要的功能;而不需要我们重新修改这些底层类库,控件等(有很多时候这些东西我们根本没有办法更改,例如第三方提供的,非开源的);


扩展方法几种使用情况:

1.传递参数:

public static class Extensions{
//this必须放第一个位置,后面传递参数类型没有限制
public static void Foo(this string s,string pName) {

}
}

使用:
String s=“Hello,World”;
s.Foo("maotin");


2.扩展方法的优先级:

注意扩展方法的优先级:现有实例方法优先级最高,其次为最近的namespace下的静态类的静态方法,最后为较远的namespace下的静态类的静态方法。

//下面这段从网友博客中拷贝修改(原文地址:http://blog.joycode.com/ghj/archive/2007/06/06/103872.aspx
情况一 : 扩展方法跟原来类的方法重名时候的处理逻辑。
namespace Hongjun.Guo
{
public class MyClass
{
public void Print()
{
Console.WriteLine("****");
}
}

static class MyExtensionMethods
{
internal static void Print(this MyClass s)
{
Console.WriteLine("haha " + s.ToString());
}

}

}

调用范例:

using Hongjun.Guo;

static void Main(string[] args)
{
MyClass o = new MyClass();
o.Print();

Console.ReadLine();
}

这时候我们会看到何种结果呢??

答案:看到的是 ****

分析:

我们把上述两组代码编译后,再反编译成IL,我们就可以看到,实际上,扩展方法在IL层上是不存在的。

扩展方法实际是编译器调用某个类的某个方法的时候,先去这个类找,如果有这个方法,则就调用;如果找不到,根据引用的命名空间,再去找扩展方法(静态类的静态方法)。找到,就使用,找不到当然就编译错误了。

根据这个分析结果,我们就可以理解上述问题处理的结果了。


情况二: 扩展方法的嵌套

比如我们有如下扩展方法。

namespace Hongjun.Guo
{
static class MyExtensionMethods
{
public static int Test01(this int i)
{
return i * 3;
}

public static int Test02(this int i)
{
return i + 5;
}
}
}

下面是调用范例:

static void Main(string[] args)
{
int mm = 7;
Console.WriteLine(mm.Test01().Test02());
Console.WriteLine("*****");
Console.WriteLine(mm.Test02().Test01());

Console.WriteLine("*****");

Console.WriteLine(MyExtensionMethods.Test02(MyExtensionMethods.Test01(mm)));

Console.ReadLine();
}


问,调用的显示结果是何值?

答案: 依次显示: 26,36,26

分析:

mm.Test01().Test02()

这行代码编译后相当于如下代码:

MyExtensionMethods.Test02(MyExtensionMethods.Test01(mm))

这两行代码在编译后的IL中是完全一样的。


扩展方法冲突也是要考虑的问题,如果对同一个类定义了相同的扩展函数(方法名,参数都一样),在外面调用是就会产生调用不明确的编译问题,因此定义扩展方法也需要考虑是否冲突!


扩展方法提供了不错一种编程方式,在日常工作中应该会逐渐被引进,但是也有一些限制,目前体会还不是很深入,后期有新观点会不断补充!

转自:http://blog.csdn.net/maotin/archive/2008/09/24/2972414.aspx

扩展方法是一种编译时技术,注意与反射等运行时技术进行区别,并慎重使用。

分享到:
评论

相关推荐

    Head First C#, 3 edition.part2 高清版

    这本书是针对你的大脑特别制作的,涵盖C#3.0,讲授了从垃圾回收到扩展方法以至双缓冲动画等多方面知识。你还将掌握C#的最的热门语法LINQ,可以用来查询.NET集合、SQL数据库等不同来源的数据。读完这本书,你将成为...

    《Head.First.C#》中文版 斯泰尔曼 pdf带源代码

    这本书是针对你的大脑特别制作的,涵盖C#3.0和Visual Studio 2008,讲授了从垃圾回收到扩展方法以至双缓冲动画等多方面知识。你还将掌握C#的最的热门语法LINQ,可以用来查询.NET集合、SQL数据库等不同来源的数据。...

    HEAD FIRST C#

    这本书是针对你的大脑特别制作的,涵盖C#3.0和Visual Studi0 2008,讲授了从垃圾回收到扩展方法以至双缓冲动画等多方面知识。你还将掌握C#的最的热门语法LINQ,可以用来查询.NET集合、SQL数据库等不同来源的数据。...

    Visual Studio 扩展插件v3.0

    基于Microsoft Visual Studio 2008环境(具体项目类型为“其他项目类型”→“扩展性”→“Visual Studio 外接程序”),用C#语言开发实现的Visual Studio扩展插件,对.NET项目开发很有用,尤其是项目经理,可以批量...

    Head First C# 2nd Edition 2010

    这本书是针对你的大脑特别制作的,涵盖C#3.0和Visual Studi0 2008,讲授了从垃圾回收到扩展方法以至双缓冲动画等多方面知识。你还将掌握C#的最的热门语法LINQ,可以用来查询.NET集合、SQL数据库等不同来源的数据。...

    asp.net知识库

    Visual C# 3.0 新特性概览 C# 2.0会给我们带来什么 泛型技巧系列:如何提供类型参数之间的转换 C#2.0 - Object Pool 简单实现 Attributes in C# 手痒痒,也来个c# 2.0 object pool 泛型技巧系列:用泛型打造可复用的...

    FlyTreeViewdll4.4.1.2破解版

    ASP.NET的FlyTreeView(版本2.0,3.0,3.5,4.0)是一种快速,更轻,功能齐全的AJAX TreeView控件。 此控件提供给开发者用于tree数据的列层次最强大的解决方案。 灵活的外观选项为能够创建独特的树状外观。内置...

    25亿企业网站管理系统 v3.0

    25亿企业网站管理系统 v3.0,25亿企业网站管理系统采用asp.net(C#)+Mssql2000构架,全站页面使用div+css 2.0设计界面,内置功能强大的SEO搜索引擎优化机制,同时支持全球多国语言建站(高达支持51个国家语言自由设置...

    .Net.Framework3.5开发技术详解[中文][共二卷][PDF][VOL2]

    许多技术人员在面对.NET Framework 3.0/3.5大量的新知识、新技术的时候感到彷徨,对自己现有的技术知识是否过时会产生疑问,对新技术会产生抵触的情绪,其实,只要能学习到真正代表业界趋势的技术,花不太多的时间...

    VirtualizingWrapPanel:WPF运行.NET Framework 4.5+或.NET Core 3.0+的VirtualizingWrapPanel的实现

    特征水平和垂直方向按页面,项目或像素缓存集装箱回收分组(实验性) GridView控件(易于使用的开箱即用体验) GridDetailsView控件(带有项目扩展的网格视图) VirtualizingItemsControl资源下载

    Silverlight在线几何绘图

    项目使用Silverlight 2.0(可以使用Microsoft Expression v3 beta 转换成 silverlight v3.0) 以及 C#3.0进行开发(在silverlight 和 wpf 上各自实现了一个版本)。核心的绘图引擎具备了良好的灵活性和扩展性,方便...

    .Net.Framework3.5开发技术详解[中文][PDF][VOL1]

    许多技术人员在面对.NET Framework 3.0/3.5大量的新知识、新技术的时候感到彷徨,对自己现有的技术知识是否过时会产生疑问,对新技术会产生抵触的情绪,其实,只要能学习到真正代表业界趋势的技术,花不太多的时间...

    log4Net详解(共2讲)

    Extjs在经过两年的发展,Ext JS从2.0版开始,越来越受用户欢迎,今年,Extjs不但推出3.0版本,而且还推出了Ext Core,准备在Web2.0网站开发中占一席之地,如在 Extjs2.x版本中为人所诟病的速度问题在ExtJs3.0中有所...

    InstallAnywhere v5.5.1--专业、强大的安装工具

    无论应用程序是用Java, C++, PERL, C#编写的,还是用EJB 或.NET Web services配置的,InstallAnywhere都可以将你的桌面、企业或多层Web services软件配置到你的平台上。 更低成本的开发和支持费用,提供最佳的...

    vc++ 应用源码包_6

    MyIE3.0浏览器源代码 如题。完整的代码,重载控件实现,非常适合初学者。 MyPhpServer(原创,有实现的主要代码) microcai-ibus-t9-输入法源码 如题,主要源码就几个,详细见代码。 MzfHips主动防御 主要在...

    vc++ 应用源码包_5

    MyIE3.0浏览器源代码 如题。完整的代码,重载控件实现,非常适合初学者。 MyPhpServer(原创,有实现的主要代码) microcai-ibus-t9-输入法源码 如题,主要源码就几个,详细见代码。 MzfHips主动防御 主要在...

    vc++ 应用源码包_1

    MyIE3.0浏览器源代码 如题。完整的代码,重载控件实现,非常适合初学者。 MyPhpServer(原创,有实现的主要代码) microcai-ibus-t9-输入法源码 如题,主要源码就几个,详细见代码。 MzfHips主动防御 主要在...

    vc++ 应用源码包_2

    MyIE3.0浏览器源代码 如题。完整的代码,重载控件实现,非常适合初学者。 MyPhpServer(原创,有实现的主要代码) microcai-ibus-t9-输入法源码 如题,主要源码就几个,详细见代码。 MzfHips主动防御 主要在...

    vc++ 应用源码包_3

    MyIE3.0浏览器源代码 如题。完整的代码,重载控件实现,非常适合初学者。 MyPhpServer(原创,有实现的主要代码) microcai-ibus-t9-输入法源码 如题,主要源码就几个,详细见代码。 MzfHips主动防御 主要在...

    vc++ 开发实例源码包

    MyIE3.0浏览器源代码 如题。完整的代码,重载控件实现,非常适合初学者。 MyPhpServer(原创,有实现的主要代码) 如题。 microcai-ibus-t9-输入法源码 如题,主要源码就几个,详细见代码。 MzfHips主动防御 主要在...

Global site tag (gtag.js) - Google Analytics