新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使用场景。]
猜你喜欢
- PHP chr() 函数实例从不同 ASCII 值返回字符:<?php echo chr(52) . "<br>
- PYTHON Pandas批量读取csv文件到DATAFRAME首先使用glob.glob获得文件路径。然后定义一个列表,读取文件后再使用c
- Python 的datetime模块 其实就是date和time 模块的结合,常见的属性方法都比较常用 比如: datetime.day,d
- 此文刊登在《程序员》三月期,有删改提到安全问题,首先想到应付这些问题的应该是系统管理员以及后台开发工程师们,而前端开发工程师似乎离这些问题很
- 本文实例讲述了Python redis操作。分享给大家供大家参考,具体如下:一、redisredis是一个key-value存储系统。和Me
- 这篇文章主要讲一下如何串行执行一组异步任务,例如有下面几个任务,在这里我们用setTimeout模拟一个异步任务:let taskA = (
- 目录1安装loguru|2loguru简单使用|3loguru保留日志文件|4loguru字符串输出|5loguru封装类,可以直接拿去用!
- 前面我们用python实现了贪吃蛇、坦克大战、飞船大战、五子棋等游戏今天我们用python来实现一下扫雷游戏本游戏代码量和源文件较多可以从我
- cooper谈到用户的视觉路径一般是:从上到下,从左到右。好的视觉设计路径应该是顺应这样的用户习惯,糟糕的设计会让用户无所适从,焦点到处都是
- 本文的主要内容是向大家分享几个Python面试中的T题目,同时给出了答案并对其进行分析,具体如下。本文的原文是5 Great Python
- 最近刚好有朋友遇到个global相关的问题,这里简单学习一下global关键字的用法。想要更好的了解global关键字,首先要熟悉pytho
- 通过go语言实现http请求http.Postimport (?? ?"net/http"?? ?"net/u
- 【摘要】 性能 首先,FCKEDITOR的性能是非常好的,用户只需很少的时间就可以载入FCKEDITOR所需文件.对于其他在线编辑器来说,这
- 如下所示:群里一朋友发了一个如上图的问题,解决方法如下data = {'a':[1,1,1,1,1,1,1,1,2,2,2,
- 序言:刚结束公司的三个月试用期,意味着我即将正式步入社会成为广大从事IT行业的一员。作为一个编程小白,无论从技术层面还是知识层面都是比较薄弱
- 实现效果:input未输入值,按钮禁用jquery操作代码:html<input type="text" name
- 简单的LSTM问题,能够预测一句话的下一个字词是什么固定长度的句子,一个句子有3个词。使用one-hot编码各种引用import keras
- 1 配置信息:创建 excel 工作簿之前的路径2 创建工作簿创建工作簿之后的路径工作簿内容3 创建工作表工作簿信息来源:https://w
- 本文实例讲述了Python实现比较两个文件夹中代码变化的方法。分享给大家供大家参考。具体如下:这里将修改代码后的目录与原始目录做对比,罗列出
- 方法1:自定义异常# -*- coding:utf-8 -*-"""功能:python跳出循环"&q