最新IBM水货笔记本价格,详细点击进入

查看完整版本: .NET 3.x新特性体验之扩展方法

风舞残阳 2008-4-2 13:44

.NET 3.x新特性体验之扩展方法

 今天我们接着看一下.NET3.x的新特性:扩展方法。这里需要说明的是我所说的.NET3.x的新特性,其实是C#3.0的一些新特性,考虑到LinQ等我就把这些特性叫做.NET3.x新特性。可能这样叫会有些歧义,但是我还是觉的这样还好,闲话不多说让我们进入正题。我觉得在C#3.0中引入自动化属性等就已经减少了我们不少负担,而扩展方法是我最喜欢的,它提供的可视化提示中显得更为巧妙。但是我也会觉得有点烦琐,当一个[wiki]类[/wiki]的扩展方法太多时,就像有LinQ存在的情况下,会出现一大批的提示方法......  什么是扩展方法?他的语法又是怎么样的?让我们来看看。扩展方法必须定义在静态函数中,扩展的方法也必须是静态函数。这对于一些方法类的扩展提供了良好的支持,特别是对接口的补充更是极品啊,通常我们在用DataReader取[wiki]对象[/wiki]时都需要一个转换,而通过dr(DataReader实例)的一些方法如:GetString(int),GetInt32(ing)...其中的参数都是列的索引,通常我们都需要填写列的名称,这样我们就可以对IDataReader接口进行扩展:
1  publicstaticclas*tensions
2  {
3    publicstaticstringGetString(thisIDataReaderdr,stringname)
4    {
5      returndr.GetString(dr.GetOrdinal(name));
6    }
7
8    publicstaticintGetInt32(thisIDataReaderdr,stringname)
9    {
10      returndr.GetInt32(dr.GetOrdinal(name));
11    }
12  }  从上面我们也可以知道他的语法,首先要有一个静态类Extensions,对IDataReader接口的扩展,需要加入thisIDataReader,而参数就是列名name。下面我们来看看他在VS中是怎么智能提示的呢?
  
[img]http://img.ddvip.com/2007_09/1189432657_ddvip_2419.jpg[/img]

  在上面我们可以看到在dr对象中出现了上面扩展的提示(extension),原来IDataReader自带的只有一个GetString(int)方法,现在看到了有了个重载GetString(string)这样是不是感觉上好一点?注意:如果你要用此扩展必须引入所在的命名[wiki]空间[/wiki]。
  在扩展方法中有一种继承作用,如果你在当扩展方法类(如上面的IDataReader)扩展,则他的子类也同样具有此扩展。如果我们想在所有类中都有的方法我们就可以对Object进行扩展,那样在所有类中都会具有此扩展的方法,只要你引用了他所做的空间。例如:我们如果要判断当前实例是否为集合或列表中的一个项,我们就可以对Object进行扩展,代码如下:
1    publicstaticboolIsEmailAddress(thisstringtext)
2    {
3      Regexregex=newRegex(@"^[w-.]+@([w-]+.)+[w-]{2,4}$");
4      returnregex.IsMatch(text);
5    }
6
7    publicstaticboolIsIn(thisobjecto,IEnumerablecollection)
8    {
9      foreach(objectitemincollection)
10      {
11        if(item.Equals(o))
12          returntrue;
13      }
14      returnfalse;
15    }  我们可以在所有的对象中得到此扩展,可以参考下图:
  
[img]http://img.ddvip.com/2007_09/1189432730_ddvip_7820.jpg[/img]

  我们知道其实整个LinQ都是方法的扩展,这个我们把它留到以后研究他时再说,因为LinQ有三大部分,一个是相对于类的,一个是To[wiki]SQL[/wiki]的,还有一个是To[wiki]XML[/wiki]的。当年都把他们叫做LinQ,DLinQ,XLinQ现在好像没有这么个教法,我们就顺从[wiki]微软[/wiki]的意愿吧。
页: [1]
查看完整版本: .NET 3.x新特性体验之扩展方法