c#扩展方法的理解(一:初识)
扩展方法是静态方法,是类的一部分,但是实际上没有放在类的源代码中。
扩展方法所在的类也必须被声明为static
C#只支持扩展方法,不支持扩展属性、扩展事件等。
扩展方法的第一个参数是要扩展的类型,放在this关键字的后面,告诉编译期这个方法是Money类型的一部分。
在扩展方法中,可以访问扩展类型的所有公共方法和属性。
“扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。”
这是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; } } }
|
第二个案例:——————————————————————————————————————
class Program
{
static void Main(string[] args)
{
Money cash = new Money();
cash.Amount = 40M;
cash.AddToAmount(10M);
Console.WriteLine("cash.ToString() returns: " + cash.ToString());
Console.ReadLine();
}
}
public class Money
{
private decimal amount;
public decimal Amount
{
get
{
return amount;
}
set
{
amount = value;
}
}
public override string ToString()
{
return "$" + Amount.ToString();
}
}
public static class MoneyExtension
{
public static void AddToAmount(this Money money, decimal amountToAdd)
{
money.Amount += amountToAdd;
}
}
c#扩展方法的理解(一:初识)的更多相关文章
- c# 扩展方法初见理解
个人理解扩展方法是对某些类在不改变源码的基础上添加其他的方法.扩展方法必须是在非泛型的静态类里定义,且第一个参数是要使用this 指定需要扩展的类型. class Program { static v ...
- 关于.NET中迭代器的实现以及集合扩展方法的理解
在C#中所有的数据结构类型都实现IEnumerable或IEnumerable<T>接口(实现迭代器模式),可以实现对集合遍历(集合元素顺序访问).换句话可以这么说,只要实现上面这两个接口 ...
- c#扩展方法的理解(二:接口)
namespace ExtensionInterfaceMethod { class Program { static void Main(string[] args) { //使用接口变量来调用扩展 ...
- C#扩展方法的理解
“扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.” 这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些 ...
- C#扩展方法的理解 (转)
“扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.” 这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些 ...
- C# 五、谈扩展方法的理解
http://www.cnblogs.com/zhaopei/p/5678842.html
- C#中的反射和扩展方法的运用
前段时间做了一个练手的小项目,采用的是三层架构,也就是Models,IDAL,DAL,BLL 和 Web , 在DAL层中各个类中有一个方法比较常用,那就是 RowToClass ,顾名思义,也就是将 ...
- C#扩展方法学习
扩展方法的本质是什么,详细见此文 C#扩展方法,爱你在心口难开 重点如下:扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法 ...
- 初识C#扩展方法
1)扩展方法是什么? 扩展方法可以在不修改原有类的代码前提下,给类“增加”一个方法.扩展方法虽然属于静态方法,但调用的语法却和对象调用类似.直接用一个例子来演示扩展方法. 1.准备实体类 public ...
随机推荐
- android 应用架构随笔五(ActionBar与侧滑菜单DrawerLayout)
ActionBar(V7)的添加非常简单,只需要在AndroidManifest.xml中指定Application或Activity的theme是Theme.Holo或其子类就可以了,在Androi ...
- android 学习随笔十九(对话框、样式、主题、国际化 )
1.对话框 package com.itheima.dialog; import android.os.Bundle; import android.app.Activity; import andr ...
- n阶乘 尾数0的个数
class Solution {public: int trailingZeroes(int n) { if(n<=0) return 0; int i=0; ...
- 给NIOS II CPU添加一颗澎湃的心——sysclk的使用
给NIOS II CPU添加一颗澎湃的心——系统时钟的使用 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchd ...
- iOS完整App资源收集
前言 iOS开发学习者都希望得到实战训练,但是很多资料都是只有一小部分代码,并不能形成完成的App,笔者在此处收集了很多开源的完整的App,都有源代码哦! 本篇文章持续更新中,请持续关注.本篇所收集的 ...
- linux进程调度方法(SCHED_OTHER,SCHED_FIFO,SCHED_RR)
转于:http://blog.csdn.net/maray/article/details/2900689 Linux内核的三种调度方法: 1,SCHED_OTHER 分时调度策略, 2,SCHED_ ...
- mha的搭建步骤(一主一从架构)
所需脚本文件到这里下载:http://note.youdao.com/share/web/file.html?id=ae8b11a61f7a8aa7b52aac3fcf0c4b83&type= ...
- ubuntu12.04下安卓编译环境搭建总结
前言: 因为工作需要,经常要编译安卓下的动态库,公司有已经搭建好环境的服务器,但是第一自己想自己搭建一下了解一个整个过程,另外,公司的服务器也经常出现问 题,导致编译不了,所以就想自己搭建环 ...
- android 比较靠谱的图片压缩
第一:我们先看下质量压缩方法: private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteAr ...
- 从hadoop框架与MapReduce模式中谈海量数据处理
http://blog.csdn.net/wind19/article/details/7716326 前言 几周前,当我最初听到,以致后来初次接触Hadoop与MapReduce这两个东西,我便稍显 ...