C#中的超级方法

很久前就开始关注Linq( Language Integrated Query)技术了, 文章读了不少,都是纸上谈兵,从来没有用过一下,我现在一直都用vs.net2005做项目,在2005中有一个CTP版本的Linq,这个只能装在英文版上,我的是中文版的,想装也装不上。现在vs.net2008已经出beat2了,beat2推出说明年末或明年初正式版可能就会出来,正好这段时间比较空闲,就下载一个装上了。

Vs.net2008中提供了很多令开发人员激动不已的新功能,这其中最突出的亮点之一就是所谓的集成语言查询Linq。Linq在此前的一些版本中不同功能是由不同团队开发的,所以有很多称呼,比如Linq to Object,Linq to XML,Linq to SQL等,我们统称为Linq好了,它们分别提供对象的集成查询,xml集成查询,数据库与对象OR/M及其集成查询,以前在项目中OR/M大都采用从Java移植过来的NHibernate,虽然这也是一个非常优秀并广泛使用的OR/M框架,但使用和配置都没有Linq to SQL简便,语言集成化程度就更没有可比性了。在Linq中为所有对象(一般对象,实体数据对象,XML数据对象等)提供了统一的集成查询技术,在对象查询中所积累的经验和技巧,完全可用于数据库的查询,这就意味着对于一般C#程序员来说,甚至不需要专门学习数据库或XML方面的知识,这个功能就太牛比了。

Linq何以有此超强的能力?关键在于.NET3.0以后所提供的“扩展方法”,为其打开了任督二脉。扩展方法(Extension Methods),就是往一个类里面增加新方法,不需要编写子类,也不会破坏类的封装,也不需要重编译这个类。按理说这似乎没什么特别之处,不会这么神奇吧,下面看一个简便的例子。

为了判断一个对象是否存在于一个集合中,编写了如下扩展方法如下:

namespace MyExtensionMethods{

  public static class MyMethods{

    public static bool IsIn(this object o,IEnumerable arr){

         foreach(object e in arr){

             if(e.Equals(o)){

             return true;

            }

        }

        return false;

    }

}

}

注意上面声明这个扩展方法时用的是this object o,这表示这个方法可以加入到System.Object这个类,这个加入的工作是由编译器去完成的,要使用这个扩展方法只需要引入所在的名称空间就行了。就好象甲A外援,打完球走人,不用担心从根本上改写了System.Object.

现在开始使用:

using MyExtensionMethods; //引入包含此扩展方法的名称空间

public class Test{

  public static void Test1(){     //用于字符串数组

       string[] names={“张三”,”李四”,”王五”};

       string checkName=”李四”;

       bool ok=checkName.IsIn(names)

  }

  public static void Test2(){      //用于整数数组

    int[] ints={1,2,3,5,7,9,0,18};

      int checkInt=100;

      bool ok=checkInt.IsIn(ints);

}

 public static void Test3(){     //用于对象数组

  DataTable table1=new DataTable();

     DataTable table2=new DataTable();

     DataTable table3=new DataTable();

     DataTable[] tables={table1,table2,table3};

     bool ok=table2.IsIn(tables);

 }

……

}

因为Object类在.net中是所有类型的基类,所以就可以在所有类上使用这个扩展方法了。上面虽然是一个非常简单的实例,但说明了扩展方法可以在申明类型的所有对象中,以同一种方式使用,这就是扩展方法的威力。Linq能够在几乎所有对象之间纵横驰骋,正是这个貌似简单原理的深入应用。

有这样一个语句xxx.students.where(p=>p.Name.StartsWith(‘王’)),在Linq中可用于查找姓“王“的所有学生。设想一下,如果把学生数据放在内存中,或者数据库中,或者XML中,不管是哪种形式存放,都可以用上面的语句进行查询,这是多么让人兴奋的事情啊。

非常不幸,Linq正是这样的,Linq在扩展方法的外壳下,包装融合了多项最新技术,为我们带来了崭新的开发技术和新思维。

在我们使用Linq的强大功能构建应用程序项目的时候,请不要忘记了那个幕后英雄, “超级的”扩展方法。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值