C#扩展方法的理解 (转)
“扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。”
这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些类型的基础上增加一个或多个方法,使用时不需要去修改或编译类型本身的代码。
先做个例子吧,以String为例,需要在字符串类型中加一个从字符串转为数值的功能。
以往我们可能是这样做的,会专门写一个方法做过转换
public static int StrToInt( string s)
{
int id;
int .TryParse(s, out id); //这里当转换失败时返回的id为0
return id;
}
|
调用就使用
string s = "abc" ;
int i = StrToInt(s);
|
若是String类型有一个名为ToInt()(从字符串转为数值)的方法,就可以这样调用了
string s = "abc" ;
int i = s.ToInt();
|
这样看起来是不是更好,下面来看看具体怎么实现吧
第一步:
我先创建一个解决方案,一个web应用程序(webtest)及一个类库(W.Common)
在webtest项目添加引用W.Common项目
第二步:在类库中新建一个名为EString.cs类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace W.Common
{
public static class EString
{
/// <summary>
/// 将字符串转换为Int
/// </summary>
/// <param name="t"></param>
/// <returns>当转换失败时返回0</returns>
public static int ToInt( this string t)
{
int id;
int .TryParse(t, out id); //这里当转换失败时返回的id为0
return id;
}
}
}
|
看了上面的代码了吧,扩展方法规定类必须是一个静态类,EString是一个静态类,里面包含的所有方法都必须是静态方法。
msdn是这样规定扩展方法的:“扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。”
EString里有一个ToInt的静态方法,他接收一个自身参数this,类型为string,this string必须在方法参数的第一个位置。
这句话什么意思,即你需要对string扩展一个ToInt方法,this是string实例化后的对象,这可能说的不太清楚,我的表述能力能弱,不要见怪呀。。。通俗的说就是,扩展方法跟静态类的名称无关,只需要在一个静态类里面定义一个静态方法,第一个参数必须this string开头。
如果需要你要对DateTime类型扩展方法名为IsRange(判断是否在此时间范围内),代码如下:
/// <summary>
/// 此时间是否在此范围内 -1:小于开始时间 0:在开始与结束时间范围内 1:已超出结束时间
/// </summary>
/// <param name="t"></param>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <returns></returns>
public static int IsRange( this DateTime t, DateTime startTime, DateTime endTime)
{
if (((startTime - t).TotalSeconds > 0))
{
return -1;
}
if (((endTime - t).TotalSeconds < 0))
{
return 1;
}
return 0;
}
|
这里的扩展方法是用this DateTime打头,那么就可以这样调用
time.IsRange(t1,t2); //判断时间time是否在t1到t2的范围内
|
当前代码在使用扩展方法前需要先引用命名空间
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using W.Common; //这里引用扩展方法所在的命名空间
namespace webtest
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load( object sender, EventArgs e)
{
use1();
Response.Write( "<br />" );
use2();
}
/// <summary>
/// 没有用扩展方法
/// </summary>
private void use1()
{
string s = "abc" ;
int i = StrToInt(s);
Response.Write( "没有用扩展方法:" + i);
}
/// <summary>
/// 使用扩展方法
/// </summary>
private void use2()
{
string s = "2012" ;
int i = s.ToInt();
Response.Write( "使用扩展方法:" + i);
}
public static int StrToInt( string s)
{
int id;
int .TryParse(s, out id); //这里当转换失败时返回的id为0
return id;
}
}
}
|
转载于:https://www.cnblogs.com/leicao/p/5268648.html
C#扩展方法的理解 (转)相关推荐
- 【转】五、谈扩展方法的理解
[转]五.谈扩展方法的理解 为什么要用扩展方法 在说什么是扩展方法之前我们先来说说为什么要用扩展方法. 首先我们定义一个 Person 类: public class Person {/// < ...
- c#扩展方法的理解(二:接口)
namespace ExtensionInterfaceMethod {class Program{static void Main(string[] args){//使用接口变量来调用扩展方法IBa ...
- [C# 基础知识系列]专题十五:全面解析扩展方法
引言: C# 3中所有特性的提出都是更好地为Linq服务的, 充分理解这些基础特性后.对于更深层次地去理解Linq的架构方面会更加简单,从而就可以自己去实现一个简单的ORM框架的,对于Linq的学习 ...
- JQuery添加扩展方法(理解$.extend(),与$.fn.extend()方法区别)
为什么80%的码农都做不了架构师?>>> 理解$.extend(),与$.fn.extend()方法区别 1.$.extend()方法 $.extend()方法在JQuery中 ...
- C#拾遗系列(9):继承、接口、扩展方法、分部类、类操作、Ref and Out、可空类型...
本文内容: 继承 Equal示例 结构和类 属性 Ref and Out 类操作 扩展方法 接口 可空类型 分部类 1. 继承 using System; using System.Collectio ...
- Jquery_如何扩展方法
jQuery 别名 $ 一. 类级别扩展方法(比如$.ajax(...)) 1> 单个全局方法 $.testExtend = function (){console.log("单个全 ...
- Linq 下的扩展方法太少了,您期待的 MoreLinq 来啦
一:背景 1. 讲故事 前几天看同事在用 linq 给内存中的两个 model 做左连接,用过的朋友都知道,你一定少不了一个叫做 DefaultIfEmpty 函数,这玩意吧,本来很流畅的 from. ...
- .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类
0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除了直接用ApplicationBuilder的Use()方法注册中间件外,还可以使用ApplicationB ...
- dotnetCore增加MiddleWare的Run,Use Map MapThen四个扩展方法
什么是中间件 中间件是在管道中处理Request请求与Responses响应的一种组件,每种组件可以选择是否让Request进入到下一个组件去处理. 译得不好,大家可以自己看原文Middleware ...
- java虚拟内存扩展_Java 8虚拟扩展方法
java虚拟内存扩展 我一直关注Java 8 Lambda表达式项目的发展已经有一段时间了,我对其当前的进展状态感到非常兴奋. 我发现的最新"易于理解"的演示文稿是这样的: htt ...
最新文章
- Java统计1到300_java程序员的从0到1:统计某字符串在某文件中出现的次数(面试题)...
- 致敬YOLO!华科提出YOLOS:基于视觉Transformer的目标检测
- fgo日服服务器维护,【FGO日服】活动维护通知(1/10)
- 软件测试2019:第七次作业—— 用户体验测试
- go gorm 密码隐藏_掀开华为云的Go语言编程底座!有深度、有点难、需细品(上)...
- python观察日志(part21)--ord,chr,unichr方法的联系与区别
- MYSQL jdbc autoReconnect
- python中主要内建函数
- 可持续字典树 Perfect Security
- 为什么要使用getter/setter
- 易语言修改虚拟机硬盘id_易语言本地虚拟机源码
- 14.docker volumn
- DeepFake技术--Deepfakes教程及各个换脸软件下载
- CodeGym—Java自学神器
- 华成英-模拟电子技术P8 放大电路的分析方法 讨论题目
- Windows常用运行库(VC++、DirectX、.NET)
- linux aria2 使用教程,Aria2使用详细教程
- 2022-2028年中国尘螨脱敏治疗药物行业市场运行态势及发展战略研究报告
- 基于Echarts实现可视化数据大屏分析大屏监控系统
- tcpdump wireshark安装及 tcpdump 的试用
热门文章
- 字符集_一文搞清楚unicode字符集的三种实现方式
- ugp和千幻魔镜买哪个好_美的空调和格力空调哪个好?这两个牌子您会买哪个?...
- 遗传算法python与matlab_遗传算法简单介绍与MATLAB实现
- EM算法在二维高斯混合模型参数估计中的应用
- Vue2.0七——生命周期
- iOS 容器 addChildViewController
- xpath提取目录下所有标签内的内容,递归 //text()
- 数据绑定以及Container.DataItem几种方式与使用方法分析
- 经典中的博弈:第一章 C++的Hello,World!
- 【技术专题研究】OSPF的LSA类型