C#委托,事件最初浅的和最易看懂的学习笔记

时间:2023-02-21 12:22:33

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

总结如下:

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

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

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

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

客户端把发布者与订阅者关联起来。
发布者.事件+=订阅者.方法
或者
发布者.事件+=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();

结果图

C#委托,事件最初浅的和最易看懂的学习笔记

补充

封装就是将某个属性放到某个类里面,然后通过类去调用,好比黑盒测试一样
注意这里,第一次用的“=”,是赋值的语法;第二次,用的是“+=”,是绑定的语法。如果第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。
最后,第一个方法注册用“=”,是赋值语法,因为要进行实例化,第二个方法注册则用的是“+=”。但是,不管是赋值还是注册,都是将方法绑定到委托上,除了调用时先后顺序不同,再没有任何的分别,这样不是让人觉得很别扭么?
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&lpar;快速博立叶变换&rpar;&amp&semi;学习笔记

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

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

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

  3. C&num;委托&comma;事件理解入门 &lpar;译稿&rpar;

    原文地址: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&period;net用户控件和委托事件

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

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

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

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

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

  9. c&num;基础学习笔记-----------委托事件

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

随机推荐

  1. Numeral&period;js – 格式化和操作数字的 JavaScript 库

    Numeral.js 是一个用于格式化和操作数字的 JavaScript 库.数字可以格式化为货币,百分比,时间,甚至是小数,千位,和缩写格式,功能十分强大.支持包括中文在内的17种语言. 您可能感兴 ...

  2. iOS后台播放

    ### 音乐后台播放 * .当程序进入后台的时候,开启后台任务 ``` - (void)applicationDidEnterBackground:(UIApplication *) { // 开启后 ...

  3. java &colon;hello world

    练习java的基本语法. output hellow world. 需求:打包自身项目的bin目录文件为一个临时可运行的jar文件,执行完后删除. 使用process执行jar文件,返回输入流和错误流 ...

  4. hadoop&lpar;五&rpar;&colon; shell命令

    hdfs dfs -cat URI : 查看文件内容 hdfs dfs -cat hdfs dfs -cat hdfs://mycluster/user/root/rcc1 hdfs dfs -cat ...

  5. C&num;程序实现动态调用DLL的研究

    摘 要:在<csdn开发高手>2004年第03期中的<化功大法——将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资 ...

  6. Java基础知识强化29:String类之String类构造方法

    1. 常用String构造方法使用: package cn.itcast_01; /* * 字符串:就是由多个字符组成的一串数据.也可以看成是一个字符数组. * 通过查看API,我们可以知道 * A: ...

  7. display&colon;inline和display&colon;inline-block的区别

    先来一张图: 测试代码: <!DOCTYPE html> <html> <head> <style> #bb { overflow: hidden; b ...

  8. linux 下 openssl 编译和交叉编译

    此随便记录一下编译openssl时遇到的各种问题以及解决办法. 点击此处下载 OpenSSL(version-1.0.1e) linux 64位系统编译32位版本: setarch i386 ./Co ...

  9. TCP连接建立系列 — 客户端的端口选取和重用

    主要内容:connect()时的端口选取和端口重用. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 端口选取 connect()时本地端口是如何选取的呢 ...

  10. iOS指纹识别Touch ID的安全性探讨

    苹果公司在 iPhone 5s 的发布会上公布了全新的指纹识别安全技术,也就是 Touch ID,开创了生物安全识别技术在便携设备上使用的新篇章.此后,苹果还将此技术带到了 iPad 上.此前没有任何 ...