惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hacker News: Ask HN
Hacker News: Ask HN
IT之家
IT之家
S
SegmentFault 最新的问题
T
Tailwind CSS Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
J
Java Code Geeks
博客园 - 聂微东
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
The Cloudflare Blog
博客园_首页
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 【当耐特】
腾讯CDC
Apple Machine Learning Research
Apple Machine Learning Research
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
宝玉的分享
宝玉的分享
小众软件
小众软件
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
月光博客
月光博客
NISL@THU
NISL@THU
T
The Exploit Database - CXSecurity.com
C
CXSECURITY Database RSS Feed - CXSecurity.com
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
Blog — PlanetScale
Blog — PlanetScale
aimingoo的专栏
aimingoo的专栏
L
LINUX DO - 热门话题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
F
Fortinet All Blogs
博客园 - Franky
L
Lohrmann on Cybersecurity
S
Secure Thoughts
量子位
V
Vulnerabilities – Threatpost
Last Week in AI
Last Week in AI
博客园 - 叶小钗
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
LINUX DO - 最新话题
I
InfoQ
C
CERT Recently Published Vulnerability Notes
Security Archives - TechRepublic
Security Archives - TechRepublic
P
Proofpoint News Feed
G
GRAHAM CLULEY
Cisco Talos Blog
Cisco Talos Blog

博客园 - 西门潇洒

MSSQL批量写入数据方案 关于SQL连接 加条件查询的LINQ表达式写法 关于LINQ中实现随机查询数据库中记录 Array中数据强制数据类型转换 the Project type is not supported by installation 项目类型不能正确加载 ASP.NET三层架构中数据绑定的问题 ASP.NET 2.0中XML数据的处理 小牛生产小牛的问题解决集粹 <转>自毁前程的七种行为 <转>在 ASP.NET 中执行 URL 重写 正则式中的实用命名组替换 去除socket编程当中接收到的多余符\0 - 西门潇洒 - 博客园 将一段符合XML格式规范字符串插入已有XML文档当中 <转>如何C#中实现在TreeView查找某一节点 javascript正则表达式中使用变量关键字 <转>JavaScript 参考教程之对象化编程 <转>JavaScript 参考教程之JavaScript 简介 <转>JavaScript 参考教程之事件处理 <转>JavaScript 参考教程资料之文档对象
.NET新特性--扩展方法
西门潇洒 · 2008-07-28 · via 博客园 - 西门潇洒

最近新采用vs2008进行开发,其中大致了解了一下.net3.5中的新特性。

今天就新特性之扩展方法,其功能类似于老版本当中的继承。

扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。

扩展方法的行为和静态方法非常的类似,你只能在静态类中声明它们。为声明一个扩展方法,你需要给该方法的第一个参数指定this关键字,而且你的第一个参数必定是你所扩展的类型实例。

最常见的扩展方法是 LINQ 标准查询运算符,不过因为刚刚接触,所以在这里就不提具体的LINQ应用,用一个简单的实例来进行说明。

首先,我们我们定义一个类型Door,编译为dll

public class Door
{
    private bool state;
    //定义门的开闭状态属性
    public bool DoorState
    {
        get { return state; }
        set { state = value; }
    }
    //开启门
    public void Open()
    {
        state = true;
    }
}
因为需要,我们需要考虑再为其类型增加一个关闭功能

但类型已经封装,按照传统的方法我们可以声明一个扩展类ExDoor来添加我们需要的功能,但通过基类型实例是无法访问到我们扩展的方法的,只能通过扩展类型实例去访问。

而在.net 3.5当中,这一切通过扩展方法就变得相当容易处理,而且无需改过其访问方式,直接通过原类型实例即可访问扩展方法。

下面我们来为Door定义一个扩展

static class DoorExpand
{
    //关闭门
    public static void Close(this Door door)
    {
        door.DoorState = false;
    }
}

最后我们测试一下

Door door = new Door();
door.Open();
Response.Write(door.DoorState.ToString());

Response.Write("<br \>");
door.Close();
Response.Write(door.DoorState.ToString());

输出结果为:True

                 False

很明显我们的扩展已经起作用,然而我们的访问不需要做任何的改变。这一点来说还是比较好用哈