C# 扩展方法的使用
作者:一线码农 发布时间:2022-04-05 14:46:24
译文链接:https://www.infoworld.com/art...
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.");
}
更多高质量干货:参见我的 GitHub: dotnetfly
来源:https://segmentfault.com/a/1190000038565875
猜你喜欢
- 小伙伴们在使用ICP提供的各种能力进行集成开发时常常会遇到一些技术上的困扰,例如ICP中很多接口是通过OCX控件的方式提供的,如何调用这些接
- spring WEB MVC框架提供了一个MVC(model-view-controller)模型-视图-控制器的结构和组件,利用它可以开发
- 控制器Controller控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现。控制器负责解析用户的请求并将其转换为一个
- 前言在使用Java开发接口请求中,我们需要对请求进行进行统一返回值,这时候我们自己封装一个统一的Result返回类,下面就介绍下我用的这种的
- 本文实例为大家分享了Java实现FTP上传与下载的具体代码,供大家参考,具体内容如下JAVA操作FTP服务器,只需要创建一个FTPClien
- 前言最近在做一个公共相关的内容,公告里边的内容,打算做成配置化的。但是考虑到存储到数据库,需要建立数据库表;存储到配置组件中,担心配置组件存
- 在Web应用系统开发中,文件上传和下载功能是非常常用的
- 亲爱的读者,在这篇文章中,我提供了一些c#编程的最佳实践。你是否在用户输入验证中使用异常处理机制?如果是,那么你就是那个把你的项目执行速度降
- 自己的一个小项目使用redis在一个类里可以注入成功,而在另一个类以却不能注入成功不多bb直接上代码package com.common.u
- AtomicInteger 类底层存储一个int值,并提供方法对该int值进行原子操作。AtomicInteger 作为java.util.
- 最大数给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个
- 1、return语句的作用:a、返回一个值,这个值可以是任意类型。b、使程序返回到操作系统(即终止程序)2、java中对于一个函数,不论有没
- 1. 老版本的代码 namespace csharp6 { internal class Person { &nb
- 一、滑动验证码生成思路1、随机选择一张图片2、生成滑块起点位置(x, y)3、生成滑块轮廓4、抠出滑块5、将滑块部位去除颜色二、主要方法这里
- 一、首先看图二、lock()跟踪源码这里对公平锁和非公平锁做了不同实现,由构造方法参数决定是否公平。public ReentrantLock
- Random类介绍Random类一个用于产生 伪随机 数字的类。这里的伪随机表示有随机性但是可以基于算法模拟出随机规律。Random类的构造
- MyBatis全局配置文件MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(propertie
- 本文实例为大家分享了Unity实现俄罗斯方块第2部分,供大家参考,具体内容如下代码部分1. 实现物体自由降落(在有关于物体的脚本中编写)1)
- 最近在研究断点下载(下载续传)的功能,此功能需要服务端和客户端进行对接编写,本篇也是记录一下关于贴上关于实现服务端(Spring Boot)
- Sentinel是阿里巴巴开源的限流器熔断器,并且带有可视化操作界面。在日常开发中,限流功能时常被使用,用于对某些接口进行限流熔断,譬如限制