c#3.0系列:Extension Method

我们说在C#3.0中,引入了一些列新的特性,但是个人认为Extension Method 这个特性是最爽的,最有创新的。

它真正的解决了:在保持现有Type原封不动的情况下对其进行扩展,你可以 在对Type的定义不做任何变动的情况下,为之添加所需的方法成员。下面我就来 讲讲。

C#3.X出来之前

大家都知道javascript有个特新Prototype,它就如同C#3.X中的Extension Method。这里不多将了。

我们主要看看.NET的实现。在C#3.X出来之前我们可以做到对Type进行扩展。

interface的情况:

1public interface IEmployee
2{
3    string Name { get; set; }
4    int Age{get; set;}
5    int add(int n);
6}

对这个Interface进行扩展,为之添加一个Add方法执行相关的运算。我们唯 一的解决方案就是直接在这个Interface中添加一个Add成员。如上。实现了这个 Interface的Type必须实现该Interface的所有方法。所以,我们添加了Add这个 方法,将导致所有实现它的Type的重新定义和编译,在很多情况下,我们根本不 需要这样。

Class的情况:

如果我们将一个class作为基类,在基类中添加一个Add Method,所有的 Child Class都不会受到影响。但是在很多情况下,对于我们需要扩展的 Interface或者是class,我们是完全不能做任何改动。比如,我们要对datagrid 控件进行扩展。我们常用的方法就自定义一个Class去继承这个datagrid,将需 要添加的成员定义在我们自己定义的Class中,这就是我们常说的自定义控件, 如果对于一个Sealed Class又该如何呢?我们要求的是对这个不能变动的Type进 行扩展,也就是使这个不能变动的Type的Instance具有我们添加的对象。

如果听到这样的要求:我们要对一个Type或者Interface进行扩展,却不允许 我们修改它。这个要求确实有点苛刻。但是c#3.x 中我们可以选择Extension Method。Extension Method本质上是在被扩展的对象实例上可以调用的静态函数 ,不是继承,所以不同于普通的成员函数,扩展函数不能直接访问被扩展对象的 成员。只能通过该对象的实例来访问。

C#3.X出来之后

简单地说Extension Method是一个定义在Static Class的一个特殊的Static  Method。之所以说这个Static Method特别,是因为Extension Method不但能 按照Static Method的语法进行调用,还能按照Instance Method的语法进行调用 。

我们还是先来看例子:

public static class MyExtensionMethods
   {
     // this代表扩展方法应用于string类型上
     public static int ToInt32(this string s)
     {
       int i;
       Int32.TryParse(s, out i);
       return i;
     }
   }
public static void fnExtensionMethod()
     {
       string s = "27";
       // 使用string的ToInt32()扩展方法
       int i = s.ToInt32();
     }

我们可以看看上面的例子,我们知道net framework 里string是个Sealed 类 型,我们只能使用Extension Method来对其进行扩展。我们可以看看它的定义方 式。ToInt32是一个Static方法。和一般的Static方法不同的是:在第一个参数 前添加了一个this 关键字。这是在C# 3.0中定义Extension Method而引入的关 键字。添加了这样一个关键字就意味着在调用该方法的时候这个标记有this的参 数可以前置,从而允许我们向调用一般Instance Method的方式来调用这个 Static Method。注意:需要在(只需要在)第一个参数前面使用this修饰。

时间: 2024-10-29 14:33:24

c#3.0系列:Extension Method的相关文章

Entity Framework 5.0系列之Code First数据库迁移

我们知道无论是"Database First"还是"Model First"当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Code First如何更新已有的模型呢?今天我们简单介绍一下Entity Framework的数据迁移功能. Entity Framework配置 在开始今天的话题之前先来看一下Entity Framework的配置,因为有很多朋友因为配置文件的问题造成"Migrations"命令执行失败.

深入理解C# 3.x的新特性(2):Extension Method[上篇]

在C#3.0中,引入了一些列新的特性,比如: Implicitly typed local variable, Extension method,Lambda expression, Object initializer, Anonymous type, Implicitly typed array, Query expression, Expression tree. 个人觉得在这一系列新特性的,最具创新意义的还是Extension method,它从根本上解决了这样的问题:在保持现有Type

深入理解C# 3.x的新特性(2):Extension Method[下篇]

四.Extension Method的本质 通过上面一节的介绍,我们知道了在C#中如何去定义一个Extension Method:它是定义在一个Static class中的.第一个Parameter标记为this关键字的Static Method.在这一节中,我们来进一步认识Extension Method. 和C# 3.0的其他新特性相似,Extension Method仅仅是C#这种.NET Programming Language的新特性而已.我们知道,C#是一种典型的编译型的语言,我们编

[渣译文] SignalR 2.0 系列: SignalR 自托管主机

原文:[渣译文] SignalR 2.0 系列: SignalR 自托管主机 英文渣水平,大伙凑合着看吧-- 这是微软官方SignalR 2.0教程Getting Started with ASP.NET SignalR 2.0系列的翻译,这里是第六篇: SignalR 自托管主机 原文:SignalR Self-Host PS.前面的那篇在MVC5上使用SignalR跳过了--MVC5跟HTML的实现完全一样,只是将HTML的脚本放在View里面了,这里就跳过了.有兴趣的同学可以自己去看. 概

[渣译文] SignalR 2.0 系列: 开始使用SignalR 2.0

原文:[渣译文] SignalR 2.0 系列: 开始使用SignalR 2.0 英文渣水平,大伙凑合着看吧-- 这是微软官方SignalR 2.0教程Getting Started with ASP.NET SignalR 2.0系列的翻译,这里是第四篇:开始使用SignalR 2.0 原文:Getting Started with SignalR 2.0 PS.前面的那篇从SignalR1.0升级为2.0跳过了--只有几步,有兴趣的同学可以自己去看. 概述 本教程展示了如何使用SignalR

LXD 2.0 系列(十二):调试,及给LXD做贡献

介绍 终于要结束了!这个大约一年前开始的这系列文章的最后一篇博文. LXD 入门 安装与配置 你的第一个 LXD 容器 资源控制 镜像管理 远程主机及容器迁移 LXD 中的 Docker LXD 中的 LXD 实时迁移 LXD 和 Juju LXD 和 OpenStack 调试,及给 LXD 做贡献 如果你从一开始就关注了这个系列,你应该已经使用了 LXD 相当长的时间了,并且非常熟悉它的日常操作和功能. 但如果出现问题怎么办?你可以做什么来自己跟踪问题?如果你不能,你应该记录什么信息,以便上游

黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级)

原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级) 企业库验证应用程序模块之配置文件模式:   1.       新建一个控制台应用程序,并创建一个Customer类,其代码如下所示: 代码 using System;using System.Collections.Generic;using System.Linq;using System.Text; using Microsoft.

黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block

原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block 企业库日志应用程序模块工作原理图:        从上图我们可以看清楚企业库日志应用程序模块的工作原理,其中LogFilter,Trace Source,Trace Listener,Log Formatter的信息都可以在Category配置文件中反映出来,通过配置文件,调用LogWriter类的Writer方法,就可以将包含日志信息的LogEntr

ActionScript 3.0系列教程(4):爽快使用XML

xml|教程 ActionScript 3.0系列教程(3):Document Class特色为我们带来了什么? ActionScript 3.0系列教程(4):爽快使用XML 为什么放弃AS2.0选择AS3.0?如果只允许我说三个理由.那么AS3.0对XML的近乎完美的支持绝对是其中一个. 简单说说AS3.0中对于XML支持的不同吧: .AS2.0对XML的支持勉勉强强,将就着可以用.而AS3.0中对XML的支持是全方位的,极其强大和灵活的. AS2.0对XML的支持不是内建的(build-i