(搬运自我在SegmentFault的博客)

一、扩展方法

扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。

注意事项:

  • 扩展方法需要是静态方法。
  • 第一个参数指明作用的类型,并且用this关键字修饰。
  • 其他参数跟在第一个参数的后面。
  • 需要使用using指令将扩展方法所在的命名空间导入到源代码中。
  • 该类型以实例方法的形式调用该方法。
  • 编译器生成的中间语言 (IL) 会将代码转换为对静态方法的调用。
  • 扩展方法无法访问它们所扩展的类型中的私有变量。

注意到C#中的StringBuilder类没有实现Java中的Reverse()方法,可以通过扩展方法实现:

namespace ExtensionMethod
{
public static class StringBuilderExtension
{
public static StringBuilder Reverse(this StringBuilder builder)
{
StringBuilder result = new StringBuilder();
for(int i=builder.Length-1;i>=0;i--)
{
result.Append(builder[i]);
}
return result;
}
}
}

新建一个测试类进行测试:

using ExtensionMethod;
static class TestStringBuilderExtension
{
static void Main()
{
StringBuilder builder = new StringBuilder("ABC");
StringBuilder newBuilder = builder.Reverse();
Console.WriteLine(newBuilder);
Console.Read();
}
}

成功为StringBuilder添加了翻转的方法。

事件

C#中使用委托来实现事件。使用了观察者模式,即有一个事件的发布者Publisher,和事件的订阅者Subscriber。

委托需要有两个参数,第一个参数为object类型,表示事件的发送者,第二个参数为EventArgs类型或继承自它。

但通常建议使用.Net Framework定义的事件模式,使用EventHandler类。EventHandler又分为使用泛型和不使用泛型两种情况。

  1. 使用自定义的委托类型:

     public delegate void CustomEventHandler(object sender, CustomEventArgs a);
  2. 非泛型的EventHandler:

     public event EventHandler RaiseCustomEvent;
  3. 泛型的EventHandler:

     public event EventHandler<CustomEventArgs> RaiseCustomEvent;

处理事件的方法应该是声明的委托的类型。

void HandleCustomEvent(object sender, CustomEventArgs a){ /* do something here */ }

订阅事件使用+=,取消订阅使用-=

publisher.RaiseCustomEvent += HandleCustomEvent;

以使用泛型的情况为例,假设事件发生调用OnRaiseCustomEvent方法。

class Publisher
{
public event EventHandler<CustomEventArgs> RaiseCustomEvent;
public void DoSomething()
{
OnRaiseCustomEvent(new CustomEventArgs("Did something"));
}
protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
{
if (RaiseCustomEvent != null)
{
RaiseCustomEvent(this, e);
}
}
}

订阅者在其构造函数添加订阅:

class Subscriber
{
public Subscriber(Publisher pub)
{
pub.RaiseCustomEvent += HandleCustomEvent;
}
void HandleCustomEvent(object sender, CustomEventArgs e){ /* some implementation */ }
}

参考资料

[1] http://technet.microsoft.com/zh-cn/bb383977

[2] http://msdn.microsoft.com/zh-cn/library/8627sbea.aspx

[3] http://msdn.microsoft.com/zh-cn/library/ms366768.aspx

[4] http://msdn.microsoft.com/zh-cn/library/w369ty8x.aspx

[5] http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx

C#学习笔记(补充)——扩展方法、事件的更多相关文章

  1. 深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)

    深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam) 深度学习笔记(一):logistic分类 深度学习笔记(二):简单神经网络,后向传播算法及实现 ...

  2. STM32 FSMC学习笔记+补充(LCD的FSMC配置)

    STM32 FSMC学习笔记+补充(LCD的FSMC配置) STM32 FSMC学习笔记 STM32 FSMC的用法--LCD

  3. swift学习笔记4——扩展、协议

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  4. pygame学习笔记(3)——时间、事件、文字

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 1.运动速率    上节中,实现了一辆汽车在马路上由下到上行驶,并使用了pygame.time.delay(200 ...

  5. java学习笔记5--类的方法

    接着前面的学习: java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址 ...

  6. Java设计模式学习笔记(三) 工厂方法模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...

  7. Object C学习笔记10-静态方法和静态属性

    在.NET中我们静态使用的关键字static有着举足轻重的作用,static 方法可以不用实例化类实例就可以直接调用,static 属性也是如此.在Object C中也存在static关键字,今天的学 ...

  8. Swift 学习笔记(扩展和泛型)

    在开始介绍Swift中的扩展之前,我们先来回忆一下OC中的扩展. 在OC中如果我们想对一个类进行功能的扩充,我们会怎么做呢. 对于面向对象编程的话,首先会想到继承,但是继承有两个问题. 第一个问题:继 ...

  9. [读书笔记]C#学习笔记二: 委托和事件的用法及不同.

    前言:  C#委托是什么 c#中的委托可以理解为函数的一个包装, 它使得C#中的函数可以作为参数来被传递, 这在作用上相当于C++中的函数指针. C++用函数指针获取函数的入口地址, 然后通过这个指针 ...

  10. jQuery来源学习笔记:扩展的实用功能

    // 扩展的实用功能 jQuery.extend({ // http://www.w3school.com.cn/jquery/core_noconflict.asp // 释放$的 jQuery 控 ...

随机推荐

  1. 剑指Offer:面试题11——数值的整数次方(java实现)

    题目描述: 实现函数double Power(double base, int exponent),求base的exponent次方,不得使用库函数,同时不需要考虑大数问题 思路:本题的重点考察内容是 ...

  2. MySQL常用命令(待更新)

    1.登录到mysql:mysql -hlocalhost -uroot -p2.创建数据库:create database:3.使用数据库:use database:4.创建表:人员:qacreate ...

  3. POJ2376_Cleaning Shifts_C++

    题目:http://poj.org/problem?id=2376 英文题强行看不懂,只看的懂输入输出,输入n,m,下接n行每行一个区间两个数左端点 l,有端点 r 给出n个闭区间,求选择最少的区间能 ...

  4. Refs to Components

    一.ref是通过ReactDOM.render返回的 定义在组件上的render方法返回的是一个虚拟的DOM节点,jsx返回的是一个ReactElement,ReactDOM.render返回的是一个 ...

  5. 大陆地区OpenStack项目Core现状(截至2016年1月28日,转载自陈沙克日志)

    陈沙克 经常有朋友问,大陆地区大概有多少位OpenStack项目的Core.这个问题,现在其实不太好回答,如果需要准确统计的话.下面仅仅是一个大概估计,有遗漏的,希望朋友指出,我来补全. 文档修改历史 ...

  6. 慕课网-安卓工程师初养成-4-7 Java循环语句之 while

    来源: http://www.imooc.com/code/1420 生活中,有些时候为了完成任务,需要重复的进行某些动作.如参加 10000 米长跑,需要绕 400 米的赛道反复的跑 25 圈.在 ...

  7. memcached学习(4). memcached的分布式算法

    memcached的分布式 正如第1次中介绍的那样, memcached虽然称为"分布式"缓存服务器,但服务器端并没有"分布式"功能. 服务器端仅包括 第2次. ...

  8. MSP430F149学习之路——LED

    #include <msp430x14x.h> void int_clk(); void delay(int i); void main() { WDTCTL = WDTPW + WDTH ...

  9. SQL 实现,如果存在就更新,如果不存在就添加

    alter proc proc_DataSummary as begin begin try begin tran --PV --统计的信息存入临时表 ), CreateDate, ) ), Crea ...

  10. php json中文处理方法,请json更懂中文

    1.php5.3版本及以下.的处理方式 /** *php5.3版本以前,json中文问题的解决解决方案 */ function encode_json($str) { return urldecode ...