| 加入收藏| 设为首页| 联系我们
深入理解C# 3.0的新特性(2):Extension Method - Part I
http://www.domcn.org 文章来源:本站收藏 点击数:
在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原封不动的情况下对其进行扩展,你可以在对Type的定义不做任何变动的情况下,为之添加所需的方法成员。在继《深入理解C# 3.0的新特性(1): Anonymous Type 》之后,在这篇文章中,我将介绍我自己对Extension method这个新特性的理解。 一、Prototype in JavaScript 为了说明Extension method到底是为了解决怎样的问题,我首先给出一个类似的、大家都比较熟悉的应用:JavaScript 中的Prototype。 比如我们在JS通过function定义了一个Vector class,代表一个2维向量。 function Vector (x,y){ this.x = x; this.y = y;} 现在我们需要在不改变Vector定义的前提下,为之添加相关的进行向量运算的Method。比如我们现在需要添加一个进行两个向量相加运算的adds方法。在JS中,我们很容易通过Prototype实现这一功能: Vector.prototype.adds = function(v){ if(v instanceof Vector) { return new Vector(this.x+v.x, this.y + v.y); } else { alert(Invalid Vector object!); }} 那么,通过添加上面的一段代码,我们完全可以把adds方法作为Vector的一个方法成员。现在我们可以这样的方式来写代码: var v = new Vector (1,2);v= v.adds(v);alert(x = +v.x + , y = +v.y); Extension Method之于C# 3.0就如同Prototype之于JavaScript。 二、如何在C# 2.0中解决Type的扩展性 我们一个完全一样的问题从弱类型、解释型的编程语言JavaScript迁移到C#这种强类型、编译型的语言上来。我们先看看在不能借助Extension Method这一新特性的C# 2.0中,我们是如何解决这一问题。 我们先来看看如何对一个Interface进行扩张。假设我们有如下的一个IVector interface的定义: public interface IVector{ double X { get; set; } double Y { get; set; }} 我们希望的是如何对这个Interface进行扩展,为之添加一个Adds Method执行向量相加的运算。我们唯一的解决方案就是直接在这个Interface中添加一个Adds成员: public interface IVector{
一、Prototype in JavaScript
为了说明Extension method到底是为了解决怎样的问题,我首先给出一个类似的、大家都比较熟悉的应用:JavaScript 中的Prototype。
比如我们在JS通过function定义了一个Vector class,代表一个2维向量。
现在我们需要在不改变Vector定义的前提下,为之添加相关的进行向量运算的Method。比如我们现在需要添加一个进行两个向量相加运算的adds方法。在JS中,我们很容易通过Prototype实现这一功能:
那么,通过添加上面的一段代码,我们完全可以把adds方法作为Vector的一个方法成员。现在我们可以这样的方式来写代码:
Extension Method之于C# 3.0就如同Prototype之于JavaScript。
二、如何在C# 2.0中解决Type的扩展性
我们一个完全一样的问题从弱类型、解释型的编程语言JavaScript迁移到C#这种强类型、编译型的语言上来。我们先看看在不能借助Extension Method这一新特性的C# 2.0中,我们是如何解决这一问题。
我们先来看看如何对一个Interface进行扩张。假设我们有如下的一个IVector interface的定义:
我们希望的是如何对这个Interface进行扩展,为之添加一个Adds Method执行向量相加的运算。我们唯一的解决方案就是直接在这个Interface中添加一个Adds成员:
[1] [2] [3] [4] 下一页