CSharp 扩展方法(extenstion method)

    在我们平时的软件开发工作中,很多时候会因为一些自身的业务需求而在项目中添加一些常用方法来满足自己的需要,下面这些代码就是一个例子,让我们来简单的看一下下面的逻辑:
 
1.我们首先在项目中添加了一个自己作为编写辅助代码的类型ProjectHelp,因为业务需求问题,我现在需要编写一个辅助的AppendToLeft方法,这个方法主体实现是将一串字符追加到源字符串 的左边,事实上就是这么简单。
public class ProjectHelp
 {        
        /// <summary>
        /// 向字符串追加字符
        /// </summary www.it165.net >
        /// <param name="obj">字符串</param>
        /// <param name="AppendStr">需要追加的字符串</param>
        /// <returns>追加完成的字符对象</returns>
        public string AppendToLeft(string obj,string AppendStr)
        {
            return AppendStr + obj;
        }
 }

 

2.然后我们在程序的Main方法中调用该方法,将字符串添加至源字符串的左边,这里的需求是将电话号码的区号追加到电话号码前面。
static void Main(string[] args)
{
       ProjectHelp help = new ProjectHelp();
       string Tel = "87763445";
       Console.WriteLine("Tel:"+help.AppendToLeft(Tel,"020-"));
}

 输出:020-87763445
    我们所要做的就是这些,这也能满足我们的需求,从目前的需求上说不会出现任何的错误,然而,我们有没有发现以上代码有一些不整洁呢?AppendToLeft这个方法原本应该直接在String类中实现,我们的调用模式也应该由以上Main方法主体直接变为Tel.AppendToLeft
("020-"),但是事实总是如此的不尽人意,由于FCL中String类并没有添加和实现AppendToLeft这个方法,所以我们只能自己定义,所以才会出现上面这样的解决方案。
    既然写这篇文章,那么就表示一定有一个更好的解决方案,您说是吗?否则需要说这么多干嘛呢?为了让开发人员的代码看上去更整洁一点,C#有一个好的解决方案,那就是文章标题提到的扩展方法,那么扩展方法怎么来使用呢?请看以下示例:
 
1.首先,我们需要在项目中添加自己的一个类型,此处为ProjectExt,其中的方法与之前定义的方法大致上无区别,只是在方法中第一个参数前面添加了this关键字,this关键字必须是在方法参数中第一个参数的前面,不可以移位。

public static class ProjectExt
 {
        /// <summary>
        /// 向字符串追加字符
        /// </summary www.it165.net >
        /// <param name="obj">字符串</param>
        /// <param name="AppendStr">需要追加的字符串</param>
        /// <returns>追加完成的字符对象</returns>
        public static string AppendToLeft(this string obj,string AppendStr)
        {
            return AppendStr + obj;
        }
  }

 2.像在调用FCL本身类库的方法一样调用AppendToLeft,我们的代码看起来更美丽整洁!

static void Main(string[] args)
{
       string Tel = "87763445";
       Console.WriteLine("Tel:"+ Tel.AppendToLeft("020-"));
}

 输出:020-87763445
 
我们可以浅而易懂的看到两者之间的区别,这就是扩展方法带来的便捷之处,让我们的代码更加的整洁,在使用扩展方法的时候必须注意一下几点:
1.第一个参数之前必须有this关键字,不可变动
2.在添加扩展方法的类型中,类型本身和类型所包含的方法必须是静态的。
3.由于这里是按类型识别,所以不应该将扩展方法的第一个参数类型设为object,这样会造成无论使用什么类型,都会扩展该方法。
4.必须考虑将来FCL可能会添加相同的方法,如果FCL在以后的版本中添加了该方法,那么C#会优先选择FCL所定义的方法。
 
最后的补充:
扩展方法为什么要添加一个this在前面呢?这引用类型的特性有关,this指向调用者本身,所以改变的也是调用者本身的实例,至于为什么在Visual Studio中能找到该方法,这是C#编辑器的功能,其中有一个搜索的过程,如果要使用不同命名空间下的扩展方法,请在代码顶端using该命名空间。另外,由于结构(struct)不能声明为静态,但是扩展方法必须声明在静态类型之中,所以不能在结构(struct)中声明扩展方法,这点必须要注意!

参考文档:http://www.it165.net/pro/html/201207/3114.html

posted @ 2012-07-09 11:47  无韵之歌  阅读(911)  评论(0编辑  收藏  举报