新Orcas语言特性:扩展方法

作者:Scott Guthrie 来源:Scott Guthrie博客中文版 时间:2007-09-23 12:49:00 

【原文地址】New "Orcas" Language Feature: Extension Methods
【原文发表日期】 Tuesday, March 13, 2007 2:27 AM

上个星期,我发表了我准备写的讨论一些新的VB和C#语言特性的系列博客贴子的第一篇,这些新语言特性是将于今年晚些时候发布的Visual Studio和.NET框架Orcas版的一部分。

我的上一个博客贴子讨论了自动属性,对象初始化器和集合初始化器等新特性。如果你还没有读过这个帖子的话,请在这里阅读。今天的贴子讨论一个VB和C#中都具有的,重要得多的新特性:扩展方法 (Extension Methods)

什么是扩展方法 (Extension Methods)?

扩展方法允许开发人员往一个现有的CLR类型的公开契约(contract)中添加新的方法,而不用生成子类或者重新编译原来的类型。扩展方法有助于把今天动态语言中流行的对duck typing的支持之灵活性,与强类型语言之性能和编译时验证融合起来。

扩展方法促成了好多有用的使用场景,并使在作为Orcas一部分发布的.NET版本中引进的非常强大的LINQ查询框架成为可能。

简单的扩展方法例子:

有没有想过要检查一个字符串变量是否是个合法的电子邮件地址? 在今天,你大概需要通过调用一个单独的类(或许通过一个静态方法)来实现检查该字符串变量是否合法。譬如,象这样:


string email = Request.QueryString["email"];
if ( EmailValidator.IsValid(email) ) {
   



而使用C#和VB中的新“扩展方法”语言特性的话,我则可以添加一个有用的“IsValidEmailAddress()”方法到string类本身中去,该方法返回当前字符串实例是否是个合法的字符串。然后我可以把我的代码重写一下,使之更加干净,而且更具描述性,象这样:


string email = Request.QueryString["email"];
if ( email.IsValidEmailAddress() ) {
   



我们是怎么把这个新的IsValidEmailAddress()方法添加到现有的string类里去的呢?我们是通过定义一个静态的类型,带有我们的“IsValidEmailAddress”这个静态的方法来实现的,象下面这样:


public static class ScottGuExtensions
{
    public static bool IsValidEmailAddress(this string s)
    {
        Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
        return regex.IsMatch(s);
    }



注意,上面的静态方法在第一个类型是string的参数变量前有个“this”关键词,这告诉编译器,这个特定的扩展方法应该添加到类型为“string”的对象中去。然后在IsValidEmailAddress()方法实现里,我可以访问调用该方法的实际string实例的所有公开属性/方法/事件,取决于它是否是合法电子邮件地址来返回true/false。

在我的代码里把这个特定的扩展方法的实现添加到string实例,我只要使用标准的“using”语句来引入含有该扩展方法的实现的命名空间:


using ScottGuExtensions; 



然后编译器就会在任何string上正确地定位IsValidEmailAddress()方法。在公开发行的Orcas三月份的CTP中的C#和VB在Visual Studio代码编辑器里对扩展方法提供了完整的intellisense支持。所以,当我在一个字符串变量上点击“.”关键词时,我的扩展方法现在就会出现在intellisense的下拉框里:

VB和C#编译器也会很自然地给与你对所有扩展方法用法的编译时的检查,这意味着你会得到一个编译时错误,假如你键错或者错用一个扩展方法的话。

[感谢David Hayden是他在去年的一个老帖子 里第一个示范了我在上面使用的这个IsValidEmailAddress使用场景。]

标签:Orcas,扩展
0
投稿

猜你喜欢

  • 使用 Python 写一个简易的抽奖程序

    2023-07-28 00:46:54
  • Access保留字和变量名列表

    2007-10-15 12:43:00
  • 解决Mac node版本升级失败的问题

    2024-05-13 09:34:52
  • Python @property及getter setter原理详解

    2022-04-25 18:15:09
  • Python3爬虫带上cookie的实例代码

    2021-11-10 18:06:58
  • Python numpy下几种fft函数的使用方式

    2022-06-21 07:19:55
  • 详解python 一维、二维列表的初始化问题

    2023-01-21 06:57:31
  • js的flv视频播放器插件使用方法

    2024-04-27 15:18:17
  • 对python多线程与global变量详解

    2021-03-05 20:34:48
  • 解决Python 进程池Pool中一些坑

    2023-12-21 00:24:31
  • 对Django 转发和重定向的实例详解

    2023-06-19 04:17:53
  • 常用的10个Python实用小技巧

    2023-03-21 13:59:23
  • python爬虫爬取笔趣网小说网站过程图解

    2022-10-06 10:56:50
  • asp 判断是否为搜索引擎蜘蛛的代码

    2011-03-10 11:03:00
  • asp网上考试设计思路是怎样的?

    2010-07-14 21:09:00
  • asp如何定义参数?

    2010-05-16 15:20:00
  • Mysql安装注意事项、安装失败的五个原因分析

    2024-01-22 14:16:48
  • Django中处理出错页面的方法

    2023-08-28 14:41:41
  • SQL Server和Oracle并行处理方法对比

    2009-01-20 15:48:00
  • MySL实现如等级成色等特殊顺序的排序详解

    2024-01-17 15:11:07
  • asp之家 网络编程 m.aspxhome.com