相信初学者对委托的印象肯定很深刻吧,当初我理解这个概念花了好长时间呢。竟然把方法作为参数,这一点,如果没有点儿C\C++的基础,还真是会觉得有点儿不可思议。
但是,微软给我们的不可思议简直太多了,.Net Framework在短短的时间内升级到2.0、3.0再到3.5,而委托则变得越来越玄了。
想一下1.0的时候,那个时候,委托是多么的单纯,首先声明一个委托类型,再定义一个相同签名的方法,就可以用了。

 
class Test
 {
     delegate double Calc(double x);
 
     static void Main(string[] args)
    {
        double[] a = { 0.0, 0.5, 1.0 };
        double[] results = Apply(a, new Calc(Square));
        foreach (double d in results)
        {
            Console.WriteLine(d);
        }

       Console.ReadLine();
    }

    public static double Square(double x)
    {
        return x * x;
    }

   static double[] Apply(double[] a, Calc f)
    {
        double[] result = new double[a.Length];
        for (int i = 0; i < a.Length; i++) result[i] = f(a[i]);
        return result;
    }
}

 

整个代码虽然比较繁琐,但确很明了。
自从2.0推出了匿名方法之后,上面的写法就不够紧跟时代潮流了,应该这么写了:

 class Test
 {
     delegate double Calc(double x);
 
     static void Main(string[] args)
     {
         double[] a = { 0.0, 0.5, 1.0 };
        double[] results = Apply(a, delegate(double x) { return x * x; });
         foreach (double d in results)
        {
            Console.WriteLine(d);
        }

        Console.ReadLine();
   }

    static double[] Apply(double[] a, Calc f)
    {
        double[] result = new double[a.Length];
        for (int i = 0; i < a.Length; i++) result[i] = f(a[i]);
        return result;
    }
}

 

代码是变少了,但是说实话,有的时候看这样的代码怎么好像就突然看不明白了呢?
即使这样,微软还是不放过像我这样脑袋不太好使的同志,它竟然推出了Lambda表达式,也就是说,上面的代码也不够先进了,应该这样了:

 
class Test
 {
    delegate double Calc(double x);
 
     static void Main(string[] args)
     {
         double[] a = { 0.0, 0.5, 1.0 };
         double[] results = Apply(a, x => x * x);
       foreach (double d in results)
        {
           Console.WriteLine(d);
        }

       Console.ReadLine();
    }

    static double[] Apply(double[] a, Calc f)
    {
       double[] result = new double[a.Length];
        for (int i = 0; i < a.Length; i++) result[i] = f(a[i]);
        return result;
    }
}

那一行代码彻底让我抓狂了,代码可以简洁到这种地步,语法竟然变化这么快,微软简直太牛了!
但是,你如果看一下这三段代码的IL时,你就会发现它们几乎是一模一样的,不一样的仅仅是后面两段代码在编译的时候,编译器自动为我们生成了一个方法。

这里仅仅是初步介绍了一下怎样把一个委托从最初的形式转化为Lambda表达式的形式,相信对新手理解起来会有一定的帮助,深入地介绍限于本人水平有限,也不能多做介绍了,还是看看MSDN吧。

posted on 2012-08-30 22:31  裴银祥的博客园  阅读(196)  评论(0编辑  收藏  举报