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

下面我们来看一个代码示例:

    class Program
    {
        static void Main(string[] args)
        {
            string s = "hello ";
            s.SayTo("world");
            Extensions.SayTo(s, "world");
            
        }
    }

    public static class Extensions
    {
        public static void SayTo(this string s,string name)
        {
            Console.WriteLine(s + name);
            
        }
    }

我们在Extensions类中定义了string类型的一个扩展方法SayTo(),从中我们可以看到扩展方法定义的几个特点:

1.       扩展方法的第一个参数有一个this关键字,就是这个this关键字才标识了这是个扩展方法。

2.       扩展方法的第一个参数是要扩展的类型,示例中扩展的是string类型。

3.       扩展方法只能在静态类中定义,而静态类中只能声明静态方法,因而扩展方法也都是静态的。

我们在Program类中使用了这个扩展方法,我们可以注意到我们用调用实例方法的方式调用了一个静态方法。在扩展方法的使用中我们应该注意到以下几个方面:

1.用类型的实例方法调用扩展方法时第一个参数不需要输入,输入了反而会报错。编译器在编译代码的时候实际上把s.SayTo("world")转化为了Extensions.SayTo(s, "world"),扩展方法的本质是将实例方法调用在编译期改为静态类中静态方法的调用。

2.扩展方法也可以用静态的方式调用,用Extensions.SayTo(s, "world")来取代s.SayTo("world"),效果是一样的。我们可以看一下IL代码

L_0008: ldstr "world"

L_000d: call void Extensions.Extensions::SayTo(string, string)

两个语句的调用都会产生这样相同的IL代码。

3.扩展方法有他的优先级,现有实例的方法的优先级最高,其次为最近的namespace下的扩展方法,最后为较远namespace下的扩展方法。

4.在进行类的设计的时候不要认为反正以后可以扩展,就不太认真的对待设计,这是不可取的。扩展方法一般用于扩展即有的,不易于修改的代码.

转载于:https://www.cnblogs.com/whzh/archive/2008/08/06/1262171.html

C# 3.0 —— 扩展方法相关推荐

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

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

  2. 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. keras 的 example 文件 cifar10_resnet.py 解析
  2. Pandas选择一列或者多列数据
  3. 《麻省理工科技评论》发布“21世纪迄今十大最糟科技”
  4. 如何将自己的代码放到github上
  5. 微软亚洲研究院的“人立方”搜索
  6. BeetleX.FastHttpApi之Vuejs扩展
  7. MySQL关于时间设置的注意事项
  8. WiFi(网络)调试Android手机
  9. PHP中的PDO详解
  10. 使用python可以实现科学计算吗_使用Python进行科学计算:NumPy入门
  11. html转pdf分页问题
  12. 卡尔曼滤波原理学习笔记
  13. crispr基因编辑技术的应用进展
  14. 计算机毕设 SSM+Vue健身管理系统 健身教练预约管理系统 健身知识平台 健身房管理系统Java Vue MySQL数据库 远程调试 代码讲解
  15. 程序员的“三十而已”
  16. 从零开始,带你掌握空状态设计的正确方法
  17. iOS release版本
  18. 我们真的需要一部《数据安全法》
  19. 网站管理后台被破解原理分析及实例演示
  20. 基于springboot+vue+Java线上教学平台( 源码+文档)

热门文章

  1. Java项目:网上商城系统(java+jsp+servlert+mysql+ajax)
  2. 架构设计复杂度的6个来源
  3. Netty - ByteBuf
  4. ORA-08002: sequence MySeq.currval is not yet defined in this session
  5. backup restore On Ubuntu
  6. EmEditor Professional(文本编辑) 下载地址
  7. Maximum Subarray
  8. JAVA目录树(全功能),Java+ajax实现
  9. Windows XP鲜为人知的70招
  10. SpringBoot-JPA入门