C#中的扩展方法之我见

今天看了下《C#高级编程第六版》中的扩展方法部分,可惜介绍的太笼统了,仅有一页的篇幅,有点迷糊,于是自己尝试写个扩展方法,不幸的是居然被我写出来了!废话少说赶紧记下来,以备不时之需(俺记性不好)。
我写了两个扩展方法,一个是为自定义类扩展方法,另一个就是为FrameWork中的类扩展方法,下面分别说下:
  一、为自定义类扩展方法
  自定义类Peoplo 
  
1public class Peoplo
2{
3    public Peoplo(bool sex)
4    {
5        Sex = sex;
6    }

7    public bool Sex getset; }
8}
 
  Peoplo类定义了一个Bool类型的属性Sex,Sex=true表示男,Sex=false表示女。
  下面是用于为Peoplo类扩展方法的一个静态类ExtendPeoplo,代码如下:
  
 1public static class ExtendPeoplo
 2{
 3    public static string GetSex(this Peoplo pl)
 4    {
 5        if (pl.Sex)
 6        {
 7            return "";
 8        }

 9        else
10        {
11            return "";
12        }

13    }

14}
  注意这个类是个静态类,其中的扩展方法GetSex()也是静态方法,它只有一个参数Peoplo pl,这里得详细说一下,他在关键字this的后面,this的作用就是告诉编译器这个方法是Peoplo类的一部分,且这个方法的第一个参数必须是关键字this,然后紧跟着要扩展的类,在这个类中Getsex要扩展的就是Peoplo类,换句话说,要为那个类扩展方法,那么这个扩展方法的第一个参数必须是以this开头后面紧跟着要扩展的类(this Peoplo pl这种形式),并且在调用该扩展方法时第一个参数并不显示,他只是告诉编译器我这个扩展方法属于这个类。
  下面来说一下如何使用这个扩展方法。
  下面是我创建的一个Default.aspx.cs,调用代码如下:
 protected void Page_Load(object sender, EventArgs e)
    {
        Peoplo pl 
= new Peoplo(true);
        Response.Write(pl.GetSex());
        
    }
  首先我们创建一个Peoplo的实例pl,并且初始化pl的Sex属性为true(表示男),这时候pl就已经有一个扩展方法GetSex()了(上面说了扩展方法的第一个参数并不显示,所以扩展方法的就变成一个没有参数的方法GetSex()),这是我们输入pl.vs2008的代码提示功能就会显示我们刚才的这个扩展方法,如下图:


  扩展方法很好识别,他的方法名前面有一个蓝色向下的箭头,这个标志就表示该方法是扩展方法,使用Response.Write(pl.GetSex)向叶面输出结果,运行结果为:男。
  这是一个非常简单的例子,一时间没有想出更好的例子,所以只能先用这个了,呵呵!
  说下自己的感受,感觉为自定义类扩展方法没有什么必要性,我们完全可以在自定义类中来实现这个效果啊,我知道我想的对不对,望路过的大牛们指点下,呵呵。
  二、FrameWork中的类扩展方法
  下面以为String类扩展一个GetString()方法为例,这个扩展方法所在的类为ExtendString.cs,代码如下:
 1public static class ExtendString
 2{
 3    public static string Getstring(this String str1, int n, string str2)
 4    {
 5        int strcount = str1.Length;
 6        if (strcount > n)
 7        {
 8            return str1.Substring(0, n) + str2 + str1.Substring(n);
 9        }

10        else
11        {
12            return "出错了!";
13        }

14    }

15}

  这个方法的功能是在str1的第N个索引位置插入一个str字符串,然后返回这个新字符串,如果n>str1的长度则返回字符串“出错了”,代码很简单。
  下面是如何调用这个扩展方法,代码如下:
 protected void Page_Load(object sender, EventArgs e)
    {
        
string str = "我是字符串";
        Response.Write(str.Getstring(
2""));
        
    }

  首先定义一个字符串变量str="我是字符串",那么str就有了一个扩展方法Getstring(int n,string str2),运行结果如下:我是,字符串 。
  我觉得还是为 framework中的类扩展方法比较实用,原因很简单,framework内置的类不允许修改,如果不用扩展方法的话要实现上述的功能,我们只能自定一个类来实现这个功能,然后在实例化这个类,再调用其中的方法来实现,开发起来不是很效率,有了这个扩展方法就不一样了。
  哈哈,这些就是我的收获,由于能力十分有限,文中可能存在很多错误,希望走过、路过的大牛们,多多批评指正,本人脸皮厚,有问题尽管指出,谢谢 !



  
  
posted on 2009-10-16 22:45  卜俊生  阅读(440)  评论(1编辑  收藏  举报