如何使用 C# 扩展方法
译文链接:https://www.infoworld.com/article/3130492/how-to-work-with-extension-methods-in-c.html
C# 在 3.0 版本中提供了对 扩展方法
的支持,扩展方法常用于给一个已存在的类添加新的方法从而扩展该类的功能,最关键的是:你不需要在现存类中派生一个子类,你也不需要破坏性的修改类的现有代码骨架,更谈不上重新编译了,扩展方法能够提供代码可读性的同时又可以扩展类的功能。
.NET 框架中最常见的扩展方法包括 Linq 标准的查询操作,这类扩展方法极大的扩展了System.Collections.IEnumerable 和 System.Collections.Generic.IEnumerable<T>
的查询能力,如下图:
现在你明白了扩展方法,你可以用这项技术去给已存在的 class 或者 interface 添加更多实用方法而不应该从子类中新增额外的方法,MSDN上说:扩展方法允许你给现有的类 添加
方法,而不需要你生成子类,重新编译,或者任何其他形式的修改原有类,扩展方法是一种特殊的静态方法,当你调用它的时候就好像它就是你扩展类的原生方法。
本质上来说,扩展方法也算是一种特殊的静态方法,它允许你给已存在的类添加新的方法即使你没有权限访问这个扩展类的源代码,扩展方法除了签名中的第一个参数是 this
之外就和静态方法是一模一样,你可以给任何一个类添加任意多的扩展方法,更????????的是:这个扩展方法特性还可以作用到值类型之上。
当你使用扩展方法的时候,请记住下面的几个点:
扩展方法必须是一个静态方法
扩展方法必须在 static class 内,类的名字无所谓
扩展方法的第一个参数一定是 this,后面跟上你需要扩展的类型
有一点要特别注意,如果扩展方法的名字和你要扩展类中的某一个方法重名了,那么你的扩展方法将会失效,永远也不会被调用。
使用 C# 扩展方法
这一节中我们一起探讨下如何使用 C# 来实现一个扩展方法,下面的代码清单展示了 C# 中的扩展方法到底长成什么样?
public static class StringExtensions{public static bool IsNumeric(this string str){double output;return double.TryParse(str, out output);}}
请注意扩展方法中的第一个参数,正如之前讨论过的,任何扩展方法都必须是静态的,而且在参数之前还要申明一下 this 关键词,比如像上面这个例子一样,相当于告诉了编译器你已经在 string 类上扩展了一个 IsNumeric 方法。
接下来一起看一下如何在 string 类中使用 IsNumeric 方法。
static void Main(string[] args){string str = "100";if (str.IsNumeric()) Console.WriteLine("The string object named str contains numeric value.");Console.Read();}
当你执行完上面这段程序,会在控制台输出:The string object named str contains numeric value
。
你可以使用扩展方法这门技术通过向类添加方法的形式增强类的功能,而不需要修改,派生或者重新编译原来的类型,正如之前我提到的,扩展方法也可以应用于值类型之上,接下来我通过一个例子来验证下这是如何实现的。
下面我定义了一个 IntegerExtensions 类,里面有一个 IsEven 扩展方法,当输入的参数是偶数的话,这个方法会返回 true,否则返回 false。
public static class IntegerExtensions{public static bool IsEven(this int i){return ((i % 2) == 0);}}
接下来的代码将会展示如何在 integer 类型上调用这个扩展方法。
static void Main(string[] args){int n = 2;if (n.IsEven()) Console.WriteLine("The value of the integer is even.");}
如何使用 C# 扩展方法相关推荐
- C# 3.0 —— 扩展方法
扩展方法是C# 3.0新加入的特性,允许我们在不改变源代码的情况下扩展(即填加)现有类型中的实例方法,也给我们提供了另外一种扩展类型行为的方法(其它的方法为继承.组合.反射). 下面我们来看一个代码示 ...
- 技术图文:C# 语言中的扩展方法
背景 前段时间,在知识星球立了一个Flag,在总结 Leetcode 刷题的第五篇图文时遇到了扩展方法 这个知识点,于是先总结一下. 1.扩展方法概述 扩展方法能够向现有类型"添加" ...
- 使用扩展方法和静态门面类实现伪领域对象
背景介绍 领域对象,在此特指充血的领域对象模型,在解决什么是伪领域对象之前,需要事先解释何为充血的领域对象.在此后的介绍中,假设我们存在对象模型Employee-Department. 在面向对象的实 ...
- Kotlin 简化Fragment使用的扩展方法
为了更方便的使用Frgment,使用扩展方法对其进行扩展,来简化其使用方式 添加扩展函数 inline fun FragmentManager.inTransaction(func: Fragment ...
- 为JS和C#类加一个扩展方法吧:P
JS扩展方法:通过原型prototype为JS的function扩展一个新的function <script> function Rectangle(width, height) { th ...
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 五 --- 为ListMongoDBRef增加扩展方法...
本次改动主要内容:为List<MongoDBRef>增加扩展方法 在MongoDB.Repository的使用过程中,发现在一个类中只定义一个List<MongoDBRef>是 ...
- java params 参数_将params作为参数传递给类扩展方法的函数
我正在尝试将函数作为参数传递给类扩展方法 . 做的时候 fun Router.handleJsonGet(path: String, method: () -> Any) { this.get( ...
- C#拾遗系列(9):继承、接口、扩展方法、分部类、类操作、Ref and Out、可空类型...
本文内容: 继承 Equal示例 结构和类 属性 Ref and Out 类操作 扩展方法 接口 可空类型 分部类 1. 继承 using System; using System.Collectio ...
- python中矩阵拼接_numpy实现合并多维矩阵、list的扩展方法
一.合并多个numpy矩阵 1.首先创建两个多维矩阵 矩阵a的大小为(2,3,2) 矩阵b的大小为(3,2,3) 采用concatentate这个函数就可以合并两个多维矩阵 合并之后应为(5,3,2) ...
- 您最喜欢的C#扩展方法是什么? (codeplex.com/extensionoverflow)
让我们列出一个答案列表,在其中发布优秀和最喜欢的扩展方法 . 要求是必须张贴完整的代码,并提供示例和使用说明. 基于对该主题的高度兴趣,我在Codeplex上建立了一个名为extensionoverf ...
最新文章
- 独家 | 用随机森林预测“美版拼多多”商品销量
- 【NLP】Transformer自注意机制代码实现
- go 中使用socket范例
- asp.net C# 计算运算耗时时间
- Lesson Plan 教学计划 翻译
- APP价格标签页面设计灵感!明码标价!
- js之面向对象编程,封装 继承 多态(详细篇)
- oracle服务器cpu 100,Oracle数据库服务器CPU一直100%怎么处理-sql优化方面
- 软件易用性文章分享 ● 第一篇
- tcpudp测试工具的使用,串口转wifi模块udp测试
- R语言 openair 做后向轨迹
- 【彩票】彩票预测算法(一):离散型马尔可夫链模型C#实现
- 精密测量专题2--光栅基片预处理
- Resource leak解决办法
- 【ES】原生es的复杂查询
- mysqlclient安装失败解决方案
- 注册个人工作室费用、手续、材料、时间及流程
- python处理excel代码_[代码全屏查看]-python处理Excel文件
- 在月球上你会看到这些神奇景象:不可思议
- HTML+CSS常用代码
热门文章
- 11月16日站立会议
- Hadoop3.0 WordCount测试一直Accept 状态,Nodes of the cluster 页面node列表个数为0
- iOS runtime实战应用:关联对象
- 20142335郝昊第三周学习总结
- Cnblogs自定义皮肤css样式-星空观测者
- hibernate中的id特殊属性hilo剖解(多用于继承关系)
- [转载]锦上添花Sybase数据库题目大网罗-4
- 一个不错的游戏 - flash webgame
- 全量更新和增量更新_增量BIOS更新或直接更新到最新版本哪个更好?
- Cocos Creator Ui系统