电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 网络编程 -> C#/CSHARP教程
c#3.0 中的扩展方法 (extension methods)_c#应用
作者:网友供稿 点击:0
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 

扩展方法的定义,需要注意三个部分:1、静态类(私有公共都可以);2、静态方法(私有公共都可以);3、第一个函数参数前带 this(必须是第一参数前)

namespace Hongjun.Guo
{
    static class MyExtensionMethods
    {
        internal static void Print(this object s)
        {
            Console.WriteLine(s);
        }
    }
}

扩展方法的使用,需要注意点: using 你定义所在的命名空间。

using Hongjun.Guo;

static void Main(string[] args)
{
    object o = "dsdgs";
    o.Print();
}

这样一个简简单单的代码后,我们就可以很方便的对一些不开源的第三方控件增加很多我们自己额外需要的功能。

 

扩展方法的使用,有时候并不是这么简简单单,我们来看一些特殊情况,通过这些特殊情况的分析,我们可以更深入的了解扩展方法:

 

情况一 : 扩展方法跟原来类的方法重名时候的处理逻辑。

场景:我们是对一个第三方的没有开放源代码组件的一个类扩展了一个方法,比如方法: Print 。过了一段时间后,这个第三方的组件发布了新版本,该类的增加了 Print 方法。这时候会出何种效果??

问题演示代码:

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://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·c#程序模拟鼠标操作 [simulate mouse movement and click programmatically] _c#应用
·用c#写的asp+域名查询程序_c#应用
·c#.net网络程序开发-socket篇 _c#应用
·c# socket编程_c#应用
·c#和vb.net语法对比图_c#教程
·c#的四个基本技巧 _c#教程
·c#基础—关于类 _c#教程
·漫谈c#编程中的多态与new关键字_c#教程
·c# namespace_c#教程
·c# 正确读取存储中文,以及如何获取字节流编码_c#应用

最新文章
·利用c#远程存取access数据库_c#应用
·c# 3.0新特性系列:隐含类型var_c#教程
·c#动态生成树型结构的web程序设计_c#应用
·论c#变得越来越臃肿是不可避免的_c#应用
·用c#监控并显示cpu状态信息_c#应用
·c#中实现vb中的createobject方法_c#应用
·photoshop给花瓶打造彩绘效果_photoshop教程
·使用c#创建sql server的存储过程_c#应用
·c#数据库操作的3种典型用法_c#应用
·c#调用oracle存储过程返回结果集及函数_c#应用


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号