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

总结如下:

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

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

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

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

客户端把发布者与订阅者关联起来。
发布者.事件+=订阅者.方法
或者
发布者.事件+=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. [LintCode] Add Binary 二进制数相加

    Given two binary strings, return their sum (also a binary string). Have you met this question in a r ...

  2. [LintCode] Valid Number 验证数字

    Validate if a given string is numeric. Have you met this question in a real interview? Yes Example & ...

  3. [LintCode] Restore IP Address 复原IP地址

    Given a string containing only digits, restore it by returning all possible valid IP address combina ...

  4. 转 状态压缩DP

    引入 首先来说说“状态压缩动态规划”这个名称,顾名思义,状态压缩动态规划这个算法包括两个特点,第一是“状态压缩”,第二是“动态规划”. 状态压缩: 从状态压缩的特点来看,这个算法适用的题目符合以下的条 ...

  5. 手机横屏竖屏css

    @media是css3中新定义的,功能非常强大,顾名思义PC是无法匹配横竖屏的,所以orientation只对移动设备起效. 1.头部声明 复制代码 代码如下: <meta name=" ...

  6. linux笔记一

    1.桌面环境:gnome,kde等 2.虚拟机网络模式: a.VMnet0:用于虚拟桥接网络下的虚拟交换机 b.VMnet1:用于虚拟HOST-Only网络下的虚拟交换机 c.VMnet8:用于虚拟N ...

  7. 关于export 和 require(import)的一些技巧和常用方法

    多重export 这样做的好处是可以在引入页面按需加载,也非常的清晰加载了哪一些东西 //exportexport const setError = ({dispatch}, error) => ...

  8. 交流从选择coding.net开始

    之前提到我们需要coding.net(一个可以帮助你在线存放管理代码的地方,便于项目合作)来进行学习交流,它可以帮我们记录我们入门的点点滴滴,现在就简单介绍一下coding.net的注册及使用. 1. ...

  9. 相识从C语言开始

    大家好,我是你们这学期C语言的助教吴科桥(女O(∩_∩)O),非常开心能在你们美好的大学这站与你们相遇,希望可以为你们学习C语言略尽绵薄之力. 开学第一周: 1. 希望每个同学都可以有自己的博客,我会 ...

  10. java小知识点

    1 判断是否为win系统 int version=System.getProperty("os.name").toLowerCase().indexOf("windows ...