博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#.Net 扩展方法
阅读量:6232 次
发布时间:2019-06-21

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

一看懂学会这个方法, 就让我大吃一惊, 不禁击案而起,还能这么干, 现在我们能直接扩展string类,object类,乃至第三方你拿不到源代码的类了,这简直是把刚入职的新人一步抬上董事长的位置上去, 把刚入论坛的新手直接提升为管理员, 什么都能干了, 太岁头上也能动土了, 老虎屁股也能摸了, 而且还是编译时的语法糖, 性能高不用担心效率问题,不得不说,ms的牛人虽然推技术快如刮风,不过,他们确实还回回想到别人心坎上去,没办法,还是原创国独领计算机领域风骚啊!别国只能跟风学习膜拜了。

 

坛子里已经有好多牛人的详细介绍了,下面标记几篇:

鹤冲天的c# 扩展方法奇思妙用

浅析C#扩展方法

.NET3.0之扩展方法

 

下面援引".NET3.0之扩展方法"一文, 我就拿来主义懒得截图了:

MSDN对扩展方法的定义: 扩展方法使你能够向现有类型“添加”方法(包括你自定义的类),而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但是可以像扩展类型上的实例方法一样进行调用。对于用C#编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。

LINQ标准查询运算符就是采用的扩展方法方式,见下图

    (当我们看到下“小标箭头”的方法就是扩展方法了,这里我们看到OrderBy亦是扩展方法)

 

看到这里也就是说,扩展方法是为Linq铺路的,是因为要推出Linq才得以享受到扩展方法。

好归好,一定要慎用,不然,一不小心就会污染大面积类的。

 

别光说不练,自己也写一段,看看里面是啥玩艺:

using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication6

{
    class Program
    {
        static void Main(string[] args)
        {
            string abc = "lzd";
            abc.ShowLzdInfo();
            Console.ReadKey();           
        }       
    }

    public static class LzdTools

    {
        public static void ShowLzdInfo(this object s)
        {
            Console.WriteLine(s);
        }
    }
}

 

然后反编译,查查老底:

 

.method public hidebysig static void  ShowLzdInfo(string s) cil managed

{
  .custom instance void [System.Core]System.Runtime.CompilerServices.ExtensionAttribute::.ctor() = ( 01 00 00 00 )
  // Code size       9 (0x9)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_0007:  nop
  IL_0008:  ret
} // end of method LzdTools::ShowLzdInfo

 

.method private hidebysig static void  Main(string[] args) cil managed

{
  .entrypoint
  // Code size       21 (0x15)
  .maxstack  1
  .locals init ([0] string abc)
  IL_0000:  nop
  IL_0001:  ldstr      "lzd"
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  call       void ConsoleApplication6.LzdTools::ShowLzdInfo(string)
  IL_000d:  nop
  IL_000e:  call       valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
  IL_0013:  pop
  IL_0014:  ret
} // end of method Program::Main

 

原来是给这个方法加了ExtensionAttribute的属性,编译时会根据这个属性来查找扩展方法,然后对号入座。

等到执行时,再替换回原方法ConsoleApplication6.LzdTools::ShowLzdInfo(string)。

干得真是漂亮,给程序员尊严,还不破坏语言的原则。

转载于:https://www.cnblogs.com/liuzhendong/archive/2011/12/02/2271828.html

你可能感兴趣的文章
大数据的寒冬已至,谁将倒下,谁成巨人?
查看>>
美日德将加强物联网领域合作,欲主宰该市场
查看>>
全球能源专家:2050年前全部使用可再生能源是可行的
查看>>
大数据规划布局“未来生产要素”
查看>>
使用云计算灾难恢复计划制定勒索软件恢复策略
查看>>
运营商NFV MANO梦想照进现实
查看>>
2015中国APT研究报告:中国是APT攻击的主要受害国
查看>>
Chatsworth公司推出了一款高科技数据中心柜锁
查看>>
微软豪购Linkedin 补移动社交船票?
查看>>
苹果iMessage上线Business Chat功能
查看>>
戴尔EMC、日立数据系统和NetApp现已出货博科第六代光纤通道方案
查看>>
南航率先加入综合交通出行大数据开放云平台
查看>>
英特尔应当收购联发科原因:成功进入移动芯片市场
查看>>
宗宁:企业微博品牌榜的新时代意义
查看>>
实例:某大型企业遭受勒索蠕虫袭击纪实
查看>>
OA选型之技术与性价比
查看>>
《Clojure数据分析秘笈》——1.8节从网页表中抓取数据
查看>>
《交互式程序设计 第2版》一3.6 导入外部库
查看>>
“云计算”让城市智慧起来
查看>>
Google计划收购数据科学社区Kaggle
查看>>