蝈蝈俊.net

-- 用随笔来记录自己的技术感触
随笔 - 597, 评论 - 4064, 引用 - 276

导航

关于

这里是我的技术Blog,下一代CSDN社区Blog在 http://blog.csdn.net/ghj1976/

标签

每月存档

最新留言

  • re:学习笔记:7种结构型设计模式简单对比
    <p>最新在家创业系统 ----刚从国外引进,市场巨大。 ----在家可经营所有国家生意,事业规模宏大。 ----不需求人与说服;不用放厚脸皮去推销。 ----极小投资;零风险;成...
    by jackielongteng(注册) on 2009/6/14 13:43:56
  • re:作用域
    <p>☆                    &deg;∵☆       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...
    by jackielongteng(注册) on 2009/6/14 13:03:25
  • re:Html标签嵌套对展示性能的影响
    <p><strong>所有的浏览器都按照你提到的浏览器解析Html规则来解析嘛?</strong></p>
    by Cola(注册) on 2009/6/12 23:07:28
  • re:Html5
    <p>目前来说,HTML5还只是一个梦想,呵呵:)</p>
    by 开心就好(注册) on 2009/6/11 16:31:54
  • re:多线程与SqlConnection.Close
    <p>好服月租型IT服务台,与你共成长! 月租型ITSM软件,注册即可免费体验! 详情请登录官方网站:<a href="http://www.servicezon.co...
    by qzhibo(注册) on 2009/6/3 15:14:21
  • re:多线程Singleton单件模式
    <pre><span style="color: #0000ff;">//Another way public</span> <sp...
    by Yaojian(注册) on 2009/4/22 14:02:35
  • re:Thread.Sleep(0)
    <p>学习了~</p>
    by shuitong888(注册) on 2009/4/8 14:29:24
  • re:Html标签嵌套对展示性能的影响
    <p>DIV固然好 但IE6,7,8 firefox,safari ....做美工的人要累死.</p>
    by ryq1(注册) on 2009/4/3 14:16:25
  • re:用.net 编码实现朗读文本的方法
    <p>我第一次 按键时 能听到声音,但是第二次按键时,没反应。网页一直在 loading.&nbsp;是什么原因?</p>
    by tracytang949(注册) on 2009/3/27 7:01:09
  • re:information_schema.routines与sysobjects
    <p>用sys.procedures多好。</p>
    by luke(注册) on 2009/3/16 16:45:49
  • re:SQL Server 2005 配置发送邮件
    <p>&lt;A href="<a href="http://www.3rt.info">http://www.3rt.info</...
    by ives007(注册) on 2009/2/26 16:47:00
  • re:推荐 Gemini 这个bug管理工具
    <p>你好!首先非常感谢推荐使用Gemini,这段时间在使用Gemini,有些问题想请教以下。</p> <p>1.Create Issue 以后,设置了Visib...
    by CowboyRyan(注册) on 2009/2/20 15:45:08
  • re:推荐 Gemini 这个bug管理工具
    <p>你好!首先非常感谢推荐使用Gemini,这段时间在使用Gemini,有些问题想请教以下。</p> <p>1.Create Issue 以后,设置了Visib...
    by CowboyRyan(注册) on 2009/2/20 15:32:06
  • re:虚机搭配NLB负载平衡时碰到"没有接口可用于安装新的群集"的解决方案
    <p>google newsid</p>
    by iads(注册) on 2009/2/13 17:25:07
  • re:try catch 与线程
    <p>确实是这样的。因为异常机制本质上是堆栈操作,而各线程的堆栈是独立的。</p>
    by st_szr(注册) on 2009/1/21 9:46:05
  • re:try catch 与线程
    <p>没啥啊,线程就是新启动了一个,当然异常不会影响到原有的线程了。</p> <p>你应该在线程里面合适的位置写上自己的捕获代码就行了。</p>
    by laozizhu(注册) on 2009/1/19 16:33:21
  • re:我的2008,征服天堂
    <p>蝈蝈,可惜我帮不了你啊!</p>
    by laozizhu(注册) on 2009/1/19 16:25:45
  • re:try catch 与线程
    <p>呃&hellip;&hellip;是这样的。可怎么处理呢?</p>
    by Anders Liu(注册) on 2009/1/19 11:58:05
  • re:我的2008,征服天堂
    <p>博主是不是去了师部 做了侦查营长呢?</p>
    by huobazi(注册) on 2009/1/9 14:15:33
  • re:我的2008,征服天堂
    <p>@ghj1976:看来真的危机了</p>
    by 开心就好(注册) on 2009/1/9 10:17:37
  • re: 网络带宽的单位
    不过传输的时候,往往还有压缩。
    by luke(匿名) on 2008/12/15 11:00:21
  • re: 网络带宽的单位
    除10不仅仅是为了方便,在传输中,往往加上控制位,所以一个字节往往需要10Bit.
    by 关门放狗(匿名) on 2008/12/13 16:01:30
  • re: 多缓存并存
    对跨进程甚至跨服务器缓存的性能比较怀疑,进程通信和跨服务器通信代价不菲。即使有已有进程外数据可用,如果考虑在进程做份缓存,定期再进程间同步是否更佳?
    by jinglecat(匿名) on 2008/12/12 18:00:05
  • re: 网络带宽的单位
    好像还有一个为了方便换算,厂家使用的是 除10的处理方式的说法:于是100Mb/sec = 100M / 10 = 10M Byte/sec 所以我通常都是用除10而不是除8来做运算的。
    by kentliu(匿名) on 2008/12/11 11:38:55
  • re: 网络带宽的单位
    又不是大S小s
    by luke(匿名) on 2008/12/10 12:04:50

广告

 

今天早上在MSDN站点看到这样一篇文章: C# 3.0 LINQ 的演变及其对 C# 设计的影响 。 从这篇文章我们就可以明显的看到,C# 3.0 所新增的这些特性,可以认为都是为了LINQ 的发展,为了LINQ更易用,所创建的一些新特性,当然这些新特性也可以被非LINQ相关功能所使用。LINQ的发展,带动了C#3.0 这一系列新特性的产生。

 

回来说我们的话题,扩展方法,首先看一个最简单的代码例子:

 

扩展方法的定义,需要注意三个部分: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中是完全一样的。

 

一些参考资料:

新Orcas语言特性:扩展方法

C# 3.0 LINQ 的演变及其对 C# 设计的影响

C# 3.0 - Extension Methods

Using the New Extension Methods Feature in C# 3.0

C# 3.0 feature 2--Extension methods

打印 | 张贴于 2007-06-06 11:27:00 | Tag:.net 编程心得  .net 3.5

留言反馈

#[转] LINQ的经典例子-Where,Select、SelectMany、SkipWhile子句中使用数组索引。 编辑
Where子句的用法 我们除了可以如下方式书写带Where子句的LINQ外: frompinproducts
2008-02-13 15:54:00 | [匿名用户:菩提树下的杨过]
#WPF中展开一个TreeView控件的所有树节点 编辑
在 Windows Form 应用中,我们碰到需要展开一个TreeView 控件的所有树节点的时候很简单,微软已经替我们提供了ExpandAll 方法,我们只要简单的一行代码tv_QTree.ExpandAll
2008-01-19 02:10:00 | [匿名用户:ASP.NET Chinese Blogs]
#Orcas Beta1 对多个同名扩展方法的处理逻辑 编辑
扩展方法是一个双刃剑,你如果要用扩展方法,就一定得准备碰到别人也用扩展方法,并且万一出现你们都对同一个类进行扩展函数名,参数一样的扩展时候,会出的各种问题.
2008-01-07 17:03:00 | [匿名用户:幸福]
#[导入]WPF中展开一个TreeView控件的所有树节点 编辑
2008-01-04 22:33:00 | [匿名用户:HappyQQ]
# C#3.0 中使用扩展方法来扩展接口 编辑
有关扩展方法的一些知识点请参看我的前篇博客:C#3.0中的扩展方法(ExtensionMethods)前篇博客中我重点介绍了两个特殊场景:1、扩展方法跟原来类的方法重名时候的处理逻辑2、扩展方法...
2007-12-17 12:26:00 | [匿名用户:csdnexpert]
# LINQ的经典例子-Where,Select、SelectMany、SkipWhile子句中使用数组索引 编辑
2007-12-17 12:25:00 | [匿名用户:csdnexpert]
# Orcas Beta1 对多个同名扩展方法的处理逻辑 编辑
扩展方法是一个双刃剑,你如果要用扩展方法,就一定得准备碰到别人也用扩展方法,并且万一出现你们都对同一个类进行扩展函数名,参数一样的扩展时候,会出的各种问题.
2007-12-17 12:25:00 | [匿名用户:csdnexpert]
# WPF中展开一个TreeView控件的所有树节点 编辑
2007-12-17 12:24:00 | [匿名用户:csdnexpert]
#WPF中展开一个TreeView控件的所有树节点 编辑
在 Windows Form 应用中,我们碰到需要展开一个TreeView 控件的所有树节点的时候很简单,微软已经替我们提供了ExpandAll 方法,我们只要简单的一行代码tv_QTree.ExpandAll
2007-09-05 17:29:00 | [匿名用户:Joycode@Ab110.com]
#LINQ的经典例子-Where,Select、SelectMany、SkipWhile子句中使用数组索引 编辑
LINQ的经典例子-Where,Select、SelectMany、SkipWhile子句中使用数组索引
2007-07-26 09:00:00 | [匿名用户:TonyWang]
#水晶报表找不到命名空间 编辑
水晶报表找不到命名空间水晶报表找不到命名空间水晶报表找不到命名空间水晶报表找不到命名空间
2007-07-23 16:53:00 | [匿名用户:zsdz]
#LINQ的经典例子-Where,Select、SelectMany、SkipWhile子句中使用数组索引。 编辑
Where 子句的用法

我们除了可以如下方式书写带Where子句的LINQ外:
2007-07-03 12:29:00 | [匿名用户:勤勤同学]
#LINQ的经典例子-Where,Select、SelectMany、SkipWhile子句中使用数组索引 编辑
Where 子句的用法 我们除了可以如下方式书写带Where子句的LINQ外: from p in products where p.UnitsInStock &gt; 0 &amp;&amp; p.UnitPrice
2007-07-03 11:07:00 | [匿名用户:Joycode@Ab110.com]
#LINQ的经典例子-Where,Select、SelectMany、SkipWhile子句中使用数组索引 编辑
Where 子句的用法 我们除了可以如下方式书写带Where子句的LINQ外: from p in products
2007-07-03 10:55:00 | [匿名用户:ghj1976]
#Orcas Beta1 对多个同名扩展方法的处理逻辑 编辑
说明:以下测试是基于Orcas Beta1环境的测试,VS2008 正式版发布后,也许会发生变化。 如果你对扩展方法不是很熟悉,建议先看我之前的两篇博客: C#3.0 中的扩展方法 (Extension
2007-06-12 19:34:00 | [匿名用户:Joycode@Ab110.com]
#Orcas Beta1对多个同名扩展方法的处理逻辑 编辑
说明:以下测试是基于Orcas Beta1环境的测试,VS2008正式版发布后,也许会发生变化。
2007-06-12 18:39:00 | [匿名用户:ghj1976]
#C#3.0 中使用扩展方法来扩展接口 编辑
有关扩展方法的一些知识点请参看我的前篇博客:C#3.0 中的扩展方法 (Extension Methods) 前篇博客中我重点介绍了两个特殊场景: 1、扩展方法跟原来类的方法重名时候的处理逻辑 2、扩展方法的嵌套 现在我们来看扩展方法使用的第三个场景:使用扩展方法来扩展接口
2007-06-06 14:33:00 | [匿名用户:ghj1976]
#C#3.0 中的扩展方法Extension Methods-蝈蝈俊.net 编辑
又一篇介绍c# 3.0扩展方法的文章,有两种特殊方法情况的分析 <br />一:扩展方法跟原来类的方法重名时候的处理逻辑。 <br />二:扩展方法的嵌套
2007-06-06 12:00:00 | [匿名用户:http://www.microhelper.cn/pligg]
博客主人设置本博客不允许匿名用户发表言论,请登录后再试

Powered by: Joycode.MVC引擎 0.5.1.8