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

总结如下:

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

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

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

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

客户端把发布者与订阅者关联起来。
发布者.事件+=订阅者.方法
或者
发布者.事件+=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. 用Maven生成Eclipse中的Web项目

    转自:http://my.oschina.net/u/939893/blog/170185 进入workspace, 输入以下命令 mvn archetype:generate -DgroupId=  ...

  2. 1047. Student List for Course (25)

    Zhejiang University has 40000 students and provides 2500 courses. Now given the registered course li ...

  3. HTML5 Input 类型

    浏览器支持 Input type IE Firefox Opera Chrome Safari email No 4.0 9.0 10.0 No url No 4.0 9.0 10.0 No numb ...

  4. FZU1894 单调队列

    S - 1019 Time Limit:1500MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  5. NVelocity+Bootstrap tab控件 异常之

    异常信息:Encountered "tings" at line 54, column 55.Was expecting one of:   "(" ...   ...

  6. 火狐插件 Http请求利器 Httprequester

    搜索并且下载Httprequester

  7. 解决PHP下导出csv乱码小记

    我们之前都是使用PHPexcel导出我们的一些数据的,由于Phpexcel对导出超出1万条数据会导至超时和内存暴涨,后来我们就改用数据导出成csv格式的. 相信很多朋友们在用PHP导出csv文件时都遇 ...

  8. Git subtree和Git submodule

    git submodule允许其他的仓库指定以一个commit嵌入仓库的子目录. git subtree替代git submodule命令,合并子仓库到项目中的子目录.不用像submodule那样每次 ...

  9. Java虚拟机内存管理机制

    自动内存管理机制 Java虚拟机(JVM)在执行Java程序过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区 ...

  10. Construct Binary Tree from Inorder and Postorder Traversal || LeetCode

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * s ...