扩展方法基础补遗

 

我现在做的是.Net的开发,Asp.Net的一个项目。公司以前基本上都是用PowerBuilder在做开发,没有.Net的积累,需要用到的东西都得自己操刀。呵呵,有点一穷二白的意思。

我现在做的这个项目是基于.Net 3.5 SP1的,其中大量用了扩展方法的这个特性。扩展方法,是.Net向函数式编程作出的努力。下面我举个例子说明一下扩展方法吧。

// 假设这里是计算出来的值。

int source = -5;

 

// 这里是我向你们展示的部分。

int result = Math.Abs(source);


如果你想要使用Math类中的Abs方法,求一个数字的绝对值,你应该是这样做的:定义一个变量result,然后将将Abs的返回值赋给它。如果这里我们不使用扩展方法,将是下面这样的:

 

// 假设这里是计算出来的值。

int source = -5;

 

// 这里是我向你们展示的部分。

int result = source.Abs();


要完成这个功能,我们必须在我们的头脑中做如下思考:首先记下Math类的命名空间,并将其在文件头中引用;接下来还要记得Abs是属于Math类的,在调用Abs方法前显式输入作为调用的前缀;最后,我们才能调用Abs方法。可以看到,一个很小的功能要在我们的头脑中经过如此多的思考才能最终确定下来。既然这个过程是如此的繁琐,那我们是不是有解决方案简化呢?这里就轮到了扩展方法出场了。使用扩展方法后,代码将会修改如下:

 

变化在哪里呢?首先,我们还是需要记住命名空间,并在文件头中引用;接下来直接调用Abs方法,调用完成!很简单,不需要我们记住太多的内容,甚至不需要记住方法名。最关键的是,我们的思路不是那么凌乱了,想调用Abs方法的时候调用就可以了!我们只关注结果,其余不相干的部分不应该、也不会扰乱我们的思路。

public static class MathExtensions

{

    public static int Abs(this int source)

    {

        return Math.Abs(source);

    }

}


当然,微软提供了一些扩展方法。但这些方法并不能涵盖所有的应用,我们需要自己去积累需要的功能。比如例子中的Abs方法,我们只需要按照下面这样做,以后就能够像第二种方式那样调用了。

 

我这里只是将微软提供给我们的方法做了下包装,当然我们也可以按照我们自己的想法做一些。毕竟,自己最熟悉的才是最顺手的,不要总把希望寄托给别人。

public static int ToInt(this string source)

{

    if (string.IsNullOrEmpty(source))

        throw new InvalidCastException("null 或空字符串无法转换为 int 类型");

 

    int result = 0;

    if (int.TryParse(source, out result))

        return result;

   else

        throw new InvalidCastException("字符串转换 int 类型失败");

}


我想既然int类型的变量可以通过ToString方法转换为字符串,那么我可以做一个将字符串转换为int类型变量的方法。就像下面这样:

 

将上面这段代码添加到示例中的MathExtensions类型,编译成程序集,以后只要引用这个命名空间,在哪都可以用。

最后再补充一句:每个人都有自己的习惯,只有将自己的东西才会最顺手。今天想到了,记下来,明天就能用上。

posted @ 2011-01-10 18:28  Lenic  阅读(415)  评论(0编辑  收藏  举报