什么是扩展方法?

扩展方法顾名思义,就是允许向现有的“类型”添加方法,而无需创建派生类、重新编译或以其他方式修改原来类型。

扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。

扩展方法和实例方法有何区别?

通常只有在不得已(例如:不能修改原来的类型)的情况下才实现扩展方法,如果扩展方法和类型中定义的实例方法相同,则扩展方法不会被调用,因为实例方法的优先级高于扩展方法的优先级。。

已用到的扩展方法:

最常见的扩展方法是LINQ标准查询运算符,它将查询功能添加到现有的System.Collections.IEnumerable和System.Collection.Generic.IEnumerable<T>类型。若要使用标准查询运算符,请先使用using System.Linq指令将它们置于范围内。然后,任何实现了IEnumerable<T>的类型看起来都具有GroupBy<TSource,TKey>,Order<TSource,TKey>等实例方法。

  1. class ExtensionMethods2
  2. {
  3.  
  4. static void Main()
  5. {
  6. int[] ints = { , , , , , };
  7. var result = ints.OrderBy(g => g);
  8. foreach (var i in result)
  9. {
  10. System.Console.Write(i + " ");
  11. }
  12. }
  13. }
  14. //Output: 10 15 21 26 39 45

如何增加一个扩展方法? 

  一、定义一个测试类型,其中包含一个实例方法,如下:  

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Demo_ExtensionMethod2
  8. {
  9. public class Test
  10. {
  11. public void InstanceMethod()
  12. {
  13. Console.WriteLine("I am a Instance Method!");
  14. }
  15. }
  16. }

  二、定义一个扩展类型,其中包含一个扩展方法,以后如需新增扩展方法,在该类中新增方法放即可,主要要定义为static类型,如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Demo_ExtensionMethod2.ExtensionMethods
  8. {
  9. public static class MyExtensions
  10. {
  11. public static void ExtensionMethod(this Test test)
  12. {
  13. Console.WriteLine("I am a Extension Method!");
  14. }
  15. }
  16. }

  三、使用时,切记要添加对扩展方法的引用,否则编译不过,如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Demo_ExtensionMethod2.ExtensionMethods;
  7.  
  8. namespace Demo_ExtensionMethod2
  9. {
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. Test test = new Test();
  15. test.InstanceMethod(); //调用实例方法
  16. test.ExtensionMethod(); //调用扩展方法
  17.  
  18. Console.Read();
  19. }
  20. }
  21. }

参考:https://msdn.microsoft.com/zh-cn/library/bb383977.aspx

C#中扩展方法的更多相关文章

  1. C#中扩展方法的使用

    MSDN中这样定义扩展方法:扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. ...

  2. 关于C#中”扩展方法必须在非泛型静态类中定义“问题的解决

    问题描述: 在某个窗口下的编码中使用了以下扩展方法FindControl,以求根据字符串的值去操作控件(本文中的控件为Label控件)的属性. public static Control FindCo ...

  3. .NET: 谈谈C#中的扩展方法

    扩展方法(Extension Methods)是C#3.0时引入的新特性,相信很多人都听过并且也都用过,最常见的是在LINQ中的使用. 不仅如此,在开发中,我们也可以创建自己扩展方法,使用它来优化类的 ...

  4. ASP.NET MVC之持久化TempData及扩展方法(十三)

    前言 之前在开始该系列之前我们就讲述了在MVC中从控制器到视图传递数据的四种方式,但是还是存在一点问题,本节就这个问题进行讲述同时进行一些练习来看看MVC中的扩展方法. 话题 废话不必多说,我们直接进 ...

  5. .NET 扩展方法 (二)

    上一篇随笔 .NET 扩展方法 (一) 已经对 扩展方法有了大致的介绍,这篇算是一个补充,让我们来看一下扩展方法的几个细节: 一.扩展方法具有继承性 当使用扩展方法扩展一个类型的时候,其也扩展了派生类 ...

  6. MVC 扩展方法特点

    .NET MVC 3中扩展方法特点: (1)扩展类的名称以Extensions结尾: (2)扩展类的类型是static: (3)扩展方法至少有一个参数,第一个参数必须指定该方法作用于哪个类型,并且该参 ...

  7. 用扩展方法实现DevExpress-GridControl级联效果

    首先,让我们先回顾下.Net中扩展方法的特征: 1.  必须在一个非嵌套.非泛型的静态类中: 2.  至少有一个参数(this 作前缀的参数): 3.  第一个参数必须附加this做前缀: 4.  第 ...

  8. C#中的扩展方法

    扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 以上是msdn官网对扩展方 ...

  9. .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法

    开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...

随机推荐

  1. 递推DP URAL 1586 Threeprime Numbers

    题目传送门 /* 题意:n位数字,任意连续的三位数字组成的数字是素数,这样的n位数有多少个 最优子结构:考虑3位数的数字,可以枚举出来,第4位是和第3位,第2位组成的数字判断是否是素数 所以,dp[i ...

  2. POJ3252 Round Numbers(不重复全排列)

    题目问区间有多少个数字的二进制0的个数大于等于1的个数. 用数学方法求出0到n区间的合法个数,然后用类似数位DP的统计思想. 我大概是这么求的,确定前缀的0和1,然后后面就是若干个0和若干个1的不重复 ...

  3. CodeForces Round 200 Div2

    这次比赛出的题真是前所未有的水!只用了一小时零十分钟就过了前4道题,不过E题还是没有在比赛时做出来,今天上午我又把E题做了一遍,发现其实也很水.昨天晚上人品爆发,居然排到Rank 55,运气好的话没准 ...

  4. Git补丁

    引子: 上班有问题没有解决,在家里搞定了,于是把改动打成一个补丁,明天应用到公司的工作电脑上.(以下内容转自别处) 1.创建补丁,比如把最新的两次提交纪录转化为补丁文件,可以用如下命令: git fo ...

  5. Useful Qt Examples

    Canvas API Basic Layouts Camera Example Video Widget Example Image Viewer Example Part 6 - Loading a ...

  6. C# - DataValid数据验证类

    从EasyCode 摘取下来的数据验证类 using System; using System.Collections.Generic; using System.Text; namespace Le ...

  7. 内存调试工具Electric Fence

    源码下载地址 注:官方地址下载不了,可能不再维护了,此是一个老项目 efence中相关环境变量控制: 302 /* 303 * See if the user wants to allow mallo ...

  8. [IT学习]一些有用的工具

    1.synctoy: http://www.microsoft.com/en-us/download/details.aspx?id=15155 2.fsutil https://technet.mi ...

  9. Nginx 笔记与总结(5)访问日志管理:计划任务 + 日志切割

    要在第二天的凌晨把前一天的访问日志切割备份,并以时间作为文件名,例如:access.20150728.log,这就需要在 Linux 中格式化时间,例如: [root@localhost ~]# da ...

  10. Windows下编译objective-C

    Windows下编译objective-C 2011-08-31 14:32 630人阅读 评论(0) 收藏 举报 windowscocoa工具objective clibraryxcode   目录 ...