扩展方法解决问题:以往对已存在的类库进行扩展,可行的方式直接对源代码进行修改或者直接派生。

扩展方法注意事项:

  1. 扩展方法必须被定义在一个静态类中,扩展方法自身必须是一个静态方法;
  2. 扩展方法中的首个参数必须是this,最后紧跟要扩展的类的名称;
  3. 扩展方法可以被对象实例调用,也可以使用静态类名进行静态调用。

扩展方法的使用范围:

实例调用:

namespace ExtensionMethodObjects
{//1,定义一个静态类public static class ExtensionMethods{//2,定义一个静态方法,该方法扩展object对象。/** 扩展方法的的参数部分:第一个参数必须为THIS* 然后跟随要扩展的类型名称和标识值*/public static void SayHello(this object obj){Console.WriteLine("扩展方法!");}}
}

namespace ExtensionMethodObjects
{class Program{static void Main(string[] args){//实例化一个object类型的对象object o = new object();o.SayHello();}}
}

扩展方法后,不用对原来的程序集进行任何改动。

静态调用:

namespace InvokeExtensionMethods
{//注意类的可见性级别,必须要在整个应用程序范围可见。public static  class ExtensionMethods{//扩展int类型,为其添加一个反转整数的能力。public static int ReverseDigits(this int i){char[] digits = i.ToString().ToCharArray();Array.Reverse(digits);string newDigits = new string(digits);return int.Parse(newDigits);}//扩展Car类,为其添加一个SpeedDown方法public static int SpeedDown(this Car car){//这样写将会产生一个编译时错误//return --Speed;//正确的方法应该是car.Speed;return --car.Speed;}}
}

namespace InvokeExtensionMethods
{class Program{static void Main(string[] args){int i = 123456;//实例方法调用,直接用扩展的类的对象实例来进行调用Console.WriteLine("实例方法调用,反转后的值为:{0}", i.ReverseDigits());//静态方法调用,通过调用扩展方法的静态类名再加扩展方法进行调用Console.WriteLine("静态方法调用,反转后的值为:{0}", ExtensionMethods.ReverseDigits(i));}}//定义一个简单的汽车类public class Car{public int Speed;public int SpeedUp(){return ++Speed;}}
}

推荐采用实例方法调用,编译器实际上将实例调用编译成静态方法的调用。

扩展方法的地雷区:

  • 扩展方法的名称不能与被扩展的类相同,否者扩展方法不能被调用。

因为编译时,扩展方法的优先级总是比类型本身中定义的实例方法级别低,其实意思就是类中有一个具有相同签名的扩展方法,编译器总是绑定到该实例方法,当编译器需要调用方法时,首先在该类型的实例方法中寻找匹配的方法。如果未找到任何匹配方法 ,编译器将搜索为该类型定义的任何扩展方法,并且绑定到它找到得第一个扩展方法。

  • 不能在扩展方法中直接访问扩展方法扩展的类的成员变量,由于扩展方法是静态方法,并不属于类成员中的标准方法,因此不能直接进行访问。可参见上面例子中的静态调用。
  • 如果扩展方法与被扩展的方法具有不同的命名空间,需要在调用扩展方法时引用定义扩展方法的命名空间。

转载于:https://www.cnblogs.com/falla/archive/2010/02/23/1671990.html

C# 3.0 扩展方法相关推荐

  1. C#3.0扩展方法[转]

    C#3.0扩展方法是给现有类型添加一个方法.现在类型既可是基本数据类型(如int,String等),也可以是自己定义的类. //Demo--1 //扩展基本类型 namespace TestExten ...

  2. C# 3.0 —— 扩展方法

    扩展方法是C# 3.0新加入的特性,允许我们在不改变源代码的情况下扩展(即填加)现有类型中的实例方法,也给我们提供了另外一种扩展类型行为的方法(其它的方法为继承.组合.反射). 下面我们来看一个代码示 ...

  3. C# 3.0新特性之扩展方法

    C#3.0扩展方法是给现有类型添加一个方法.现在类型既可是基本数据类型(如int,String等),也可以是自己定义的类. //Demo--1 //扩展基本类型 namespace TestExten ...

  4. c#扩展方法奇思妙用性能篇一:扩展方法性能初测

    最近写了几篇<c#扩展方法奇思妙用>的文章,一直只是讨论如何扩展.如何使用的问题,几乎没有涉及效率方面. 而大家的回复好多都在问效率如何.性能怎样,也引起了我对效率的关注,今天将初步测试的 ...

  5. .Net 2.0中使用扩展方法

    大家都知道扩展方法是不能直接在2.0中使用的 需要引用一个‍System.Core的dll 不过现在有更加简单的方法了 只要在工程项目中加入以下代码就OK啦 ‍namespace System.Run ...

  6. C#学习笔记四: C#3.0自动属性匿名属性及扩展方法

    前言 这一章算是看这本书最大的收获了, Lambda表达式让人用着屡试不爽, C#3.0可谓颠覆了我们的代码编写风格. 因为Lambda所需篇幅挺大, 所以先总结C#3.0智能编译器给我们带来的诸多好 ...

  7. 在.net 2.0/3.0程序中使用扩展方法

    .NET Framework 从2.0升级至3.0/3.5中,增加了不少编译器级别的语法糖,如var关键字.自动属性.Lambda表达式.扩展方法等等. 如果使用vs2008发布.net2.0程序时, ...

  8. [易学C#]C#3.0语言新特性之扩展方法

    当我们需要对已有类的功能进行扩展时,我们通常会想到继承,继承已有类,然后为其加入新的行为.而C# 3.0中加入的扩展方法(Extension Methods)特性,则提供了另一种实现功能扩展的方式. ...

  9. C#3.0新特性 扩展方法

    扩展方法可以使我们为现有的添加方法,现有的类可是是CLB的也可以是自己定义的. 注意事项:   通过this修饰方法第一个参数  方法声明在静态类中  方法通过对象调用 重要注意事项:   扩展方法和 ...

最新文章

  1. 逼格高又实用的 Linux 命令,运维同仁一定要懂
  2. 无缓冲channel
  3. c/c++实现一个密集型server/socket多路复用select
  4. 查看swintransformer的网络结构.children()
  5. matlab中的terminator模块,2.2 Ground 及 Terminator模块
  6. 【ffmpeg裁剪视频faster rcnn自动检测 via】全自动实现ffmpeg将视频切割为图片帧,再使用faster rcnn将图片中的人检测出来,最后将检测结果转化为via可识别的csv格式
  7. to_date , to_char
  8. java blob字段_java 存取blob字段
  9. 学习笔记:杨辉三角形上莫队(组合数莫队)(LULU胡策)
  10. 纹理坐标不在[0,1]内时的纹理效果
  11. 27. JavaScript Cookies
  12. thinkphp5 模板使用php,模板 · ThinkPHP5.1完全开发手册 · 看云
  13. CSS面试须知--关于图片
  14. ps意外崩溃_最新—Mac软件意外退出/移到废纸篓的解决方案,亲测有效
  15. HEALER: Relation Learning Guided Kernel Fuzzing学习笔记
  16. 《西游记》中真假美猴王的分析
  17. java 之JNLP
  18. 上皮细胞膜纳米囊泡|MCF10A正常乳腺上皮细胞膜硅颗粒|MCF-7乳腺癌细胞膜包覆纳米载体平均粒径150nm
  19. VSCode安装教程(图文详解,简单搞定)
  20. 希腊字母大小写及其读音、英文

热门文章

  1. grunt之filerev、usemin
  2. Ubuntu18.04提示wifi无法连接
  3. java.lang.IllegalStateException: ContainerBase.addChild: start
  4. 老男孩Linux学习 -- 关于添加第二块磁盘的那些事
  5. 安装win7和centos6.7双系统 引导加载安装位置问题
  6. linux的用户管理与权限学习总结
  7. 解决Entity Framework中DateTime类型字段异常
  8. 软件设计期末考试重点内容
  9. link time code generation
  10. Mac OS X连载-1。启动模式小技巧