对于委托和事件,看了不少博文,当时好像都理解了,过了一段时间,又忘记的差不多了。每每如此,感觉自己很笨,记性差,其实是没有深入理解透切,没有按照自己的语言表达出来,当然容易忘记。今天又花了一些时间,好好理解,总结别人的文章,用自己文字概况出来。

总结如下:

委托可以定义任何地方,应该说是委托声明

事件类可以单独放一个地方,包含一些属性

事件一定定义在发布者里面,应该说是事件声明,并在这里做判断注册事件,给事件类属性赋值

订阅者,也就是事件的受理者,它里面有些方法并后续操作。

客户端把发布者与订阅者关联起来。
发布者.事件+=订阅者.方法
或者
发布者.事件+=new 委托声明类.委托(订阅者.方法)
发布者.方法--调用事件的方法

代码实例

发布者

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace dazilianxi.deleteevent
{
//商家,发布商品肯定包含一些属性,就是给商品赋值实例化
public class Provider
{
public delegate void DaZheEventHandler(object sender, ProductEventArgs e);//声明委托
public event DaZheEventHandler DaZhe;//声明事件 protected virtual void FaBuChanPin(ProductEventArgs e)
{
if (DaZhe != null)
{
this.DaZhe(this, e);//注册事件
}
}
private decimal price = 18000M;
public void ShangJia(int discout) {//事件赋值
this.FaBuChanPin(new ProductEventArgs { Price = discout*price/, ProAddress = "中国广东", ProName = "红日电器", Discount = discout });
}
}
}

事件类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace dazilianxi.deleteevent
{
//事件类,包含商品一些属性
public class ProductEventArgs : EventArgs
{
public decimal Price { get; set; }
public string ProName { get; set; }
public string ProAddress { get; set; }
public int Discount { get; set; }
}
}

订阅者

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace dazilianxi.deleteevent
{//就是我们,我们有购买行为(方法)
public class Custome
{
public void OnGouMai(object sender,ProductEventArgs e)
{
if (e.Price < 15000M)
{
Console.WriteLine("大家快了买,产于" + e.ProAddress + "的" + e.ProName + "打" + e.Discount + "折了。目前价格是" + e.ProName + "很划算了");
}
else {
OnGuanKan();
}
} public void OnGuanKan()
{
Console.WriteLine("再等等看!");
}
}
}

客户端

class Program
{
static void Main(string[] args)
{
//客户端二者关联
Provider shangjia = new Provider();
shangjia.DaZhe += new Provider.DaZheEventHandler(new Custome().OnGouMai);//第一种方式
shangjia.ShangJia(); Provider shangjia2 = new Provider();
shangjia2.DaZhe += new Custome().OnGouMai;//第二种方式
shangjia2.ShangJia();

结果图

补充

封装就是将某个属性放到某个类里面,然后通过类去调用,好比黑盒测试一样
注意这里,第一次用的“=”,是赋值的语法;第二次,用的是“+=”,是绑定的语法。如果第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。
最后,第一个方法注册用“=”,是赋值语法,因为要进行实例化,第二个方法注册则用的是“+=”。但是,不管是赋值还是注册,都是将方法绑定到委托上,除了调用时先后顺序不同,再没有任何的分别,这样不是让人觉得很别扭么?
1什么是委托和事件
委托就是将方法作为方法的参数,委托是一种特殊的类

声明委托
public delegate void foo (string param);

委托绑定方法
使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时,可以依次条用所有绑定的方法。

2什么是事件
于是,Event 出场了,它封装了委托类型的变量,使得:在类的内部,不管你声明它是public还是protected,它总是private 的。在类的外部,注册“+=”和注销“-=”的访问限定符与你在声明事件时使用的访问符相同。

声明事件
声明一个事件不过类似于声明一个进行了封装的委托类型变量而已。事件可以约束客户端的能力。
使用事件不仅能获得比委托更好的封装性以外,还能限制含有事件的类型的能力。这是什么意思呢?它的意思是说:事件应该由事件发布者触发,而不应该由事件的客户端(客户程序)来触发。
这里还有一个约定俗称的规定,就是订阅事件的方法的命名,通常为“On 事件名”,比如这里的OnNumberChanged。http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html

参考:

http://www.cnblogs.com/wudiwushen/archive/2010/04/23/1717829.html

http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html

C#委托,事件最初浅的和最易看懂的学习笔记的更多相关文章

  1. 浅谈FFT(快速博立叶变换)&学习笔记

    0XFF---FFT是啥? FFT是一种DFT的高效算法,称为快速傅立叶变换(fast Fourier transform),它根据离散傅氏变换的奇.偶.虚.实等 特性,对离散傅立叶变换的算法进行改进 ...

  2. C# ~ 从 委托事件 到 观察者模式 - Observer

    委托和事件的部分基础知识可参见 C#/.NET 基础学习 之 [委托-事件] 部分: 参考 [1]. 初识事件 到 自定义事件: [2]. 从类型不安全的委托 到 类型安全的事件: [3]. 函数指针 ...

  3. C#委托,事件理解入门 (译稿)

    原文地址:http://www.codeproject.com/Articles/4773/Events-and-Delegates-Simplified 引用翻译地址:http://www.cnbl ...

  4. 关于ios使用jquery的on,委托事件失效

    $('.parents').on("click",'.child',function(){}); 类似上面这种,在ios上点击"child"元素不会起作用,解决 ...

  5. Observer设计模式中-委托事件-应用在消息在窗体上显示

    Observer设计模式:监视者模式.在类中的方法中处理的结果或者消息通过事件委托 的方式发送给主窗体. 因为在其它类中直接访问主窗体类,显示内容是不能直接调用控件赋值的,当然也有别的类似查阅控件名, ...

  6. Asp.net用户控件和委托事件

    在Asp.net系统制作过程中,门户类型的网站,我们可以用DIV+CSS+JS+Ajax全部搞定,但是一旦遇到界面元素比较复杂的时候,还是UserControl比较方便一些,各种封装,各种处理,然后拖 ...

  7. 《C#高级编程》学习笔记------C#中的事件和委托

    本文转载自张子阳 目录 委托的作用 将方法绑定到委托 事件的来由 Observer设计模式 .Net Framework中的委托与事件   引言 委托 和 事件在 .Net Framework中的应用 ...

  8. jQuery里面的普通绑定事件和on委托事件

    以click事件为例: 普通绑定事件:$('.btn1').click(function(){}绑定 on绑定事件:$(document).on('click','.btn2',function(){ ...

  9. c#基础学习笔记-----------委托事件

    这里有一个比较简单的委托实例应用(跨窗体操作控件) http://blog.csdn.net/bdstjk/article/details/7004035 还有一个比较详细的介绍并深入理解委托事件的讲 ...

随机推荐

  1. error CS0016: 未能写入输出文件

    win7 下解决办法: 1.打开C:\Windows ,找到 TEMP 文件夹 2. 进行权限设置,点击编辑,找到 IIS-User,勾选所有权限

  2. 科技来电:不容错过的win10轻度美化攻略

    作为微软不择手段采用弹框.限时.警告等方式强推win10的结果, win10市场占有率大增,微软高兴了,可用户苦了,吹洗剪+杀马特般的metro&传统混血开始菜单.鼻青脸肿般的任务栏.单一颜色 ...

  3. SRM 588 DIV1

    250 题意:有n首不同的曲子,你唱每首曲子需要花费a的时间以及一个调整的时间b,调整的时间为此首歌的曲调减去上一首歌的曲调的绝对值. 思路:我们用dp[i][k]表示前i首歌只唱k首用的最小时间花费 ...

  4. IOS第14天(2, Modal控制)

    ******控制器modal - (void)btnClick { // 创建控制器对象 HMJumpViewController *jump = [[HMJumpViewController all ...

  5. EmguCV 轮廓

    一.相关函数 public static void cvDrawContours( IntPtr img, IntPtr contour, MCvScalar externalColor, MCvSc ...

  6. C# Array

    一.声明数组时,方括号[]必须跟在类型后面,而不是标识符后面 int[] table;  //而不是 int table[]; 二.数组的大小不是其类型的一部分 int[] numbers; numb ...

  7. JS控制打印指定div

    <html><head><script language="javascript">function printdiv(printpage){v ...

  8. java变量和方法的覆盖和隐藏(翻译自Java Tutorials)

    隐藏变量 在一个类里,如果一个变量的名字和父类的变量的名字一样,即使他们的类型不一样,那么在子类中,父类的同名变量无法直接通过变量名访问.但是,父类的同名变量可以通过super访问.一般来说,不推荐隐 ...

  9. 关于int,long,long long

    偶然的,我同学给我发了一个面试题:long 占多少字节 对于这个问题我也不好多说,有时候可能会想的比较多,这个题也需要多想一下 <1>在16位机器上,int 2字节, long 4字节, ...

  10. LINUX VI 常用命令

    vi 打开或新建 vi filename 打开或新建文件 并将光标置于第一行首 光标 )  光标移至句尾 (  光标移至句首 屏幕翻滚类命令 Ctrl+u 向文件首翻半屏 Ctrl+d 向文件尾翻半屏 ...