委托与事件(一)——C#版本

这篇具有很好参考价值的文章主要介绍了委托与事件(一)——C#版本。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是委托与事件

  委托是对函数的封装,可以当作给方法的特征指定一个名称。而事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程。
  委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为

为什么要用委托与事件

  用例子来说明为什么必须要用委托与事件。

V1_猫叫老鼠跑,依赖:

public class Client{
	public static void main(string[] args){
		Cat cat = new Cat("Tom");
		cat.Shout();
	}
}


public class Cat{
	private string name;
	public Cat(string name){
		this.name = name;
	}
	public void Shout(){
		Console.WriteLine("喵,我是{0}",name);
		Mouse mouse = new Mouse("Jerry");
		mouse.Run();
	}
}

public class Mouse{
	private string name;
	public Mouse(string name){
		this.name = name;
	}
	public void Run(){
		Console.WriteLine("猫来了,{0}快跑",name);
	}
}

以上代码对应类图:
委托与事件(一)——C#版本
  在V1中,由图可以明显的看出来,猫直接依赖了老鼠。但咱们结合现实生活来看,猫和老鼠是与生俱来的天敌,他们互不认识,但只要猫一出现,老鼠肯定会跑。所以前提是猫不认识老鼠,但老鼠听到猫叫会跑。那咱们的代码写的就有问题了,在猫类的猫叫方法中直接实例化了老鼠类,表示猫认识老鼠,猫叫是通知老鼠跑的意思,直接产生了猫叫老鼠跑关系。如何解开这种关系,此时就引入了委托与事件,让我们拭目以待!

V2_猫叫老鼠跑,事件与委托:

public class client{
	public static void main(string[] args){
		Cat cat = new Cat("Tom");
		Mouse mouse = new Mouse("Jerry");
		CatShout += new cat.CatShoutEventHandler(mouse.run);
		cat.Shout();
		Console.Read();
	} 
}

public class Cat{
	private string name;
	public Cat(string name){
		this.name=name;
	}
	public delegate void CatShoutEventHandler();
	public event CatShoutEventHandler CatShout;
	public void Shout(){
		Console.WriteLine("喵,我是{0}",name);
		if(CatShout != null){
			CatShout();
		}
	}
}

public class Mouse{
	private string name;
	public Mouse(string name){
		this.name=name;
	}
	public void Run(){
		Console.WriteLine("猫来了,{0}快跑",name);
	}
}

以上代码对应类图:
委托与事件(一)——C#版本
  在类图中,我们可以明显的看出猫和老鼠类没有关系了,实际上他们是通过委托与事件产生了联系。在主函数中CatShout += new cat.CatShoutEventHandler(mouse.run);表示将Mouse的Run方法通过实例化委托Cat.CatShoutEventHandler 登记到Cat的事件CatShout当中。其中“+=”表示“add CatShout”的意思。解决了我们第一版代码出现的问题,对猫和老鼠进行了解耦合操作。

事件与委托概念和V2_猫叫老鼠跑代码做映射:

  为了让大家能更清楚的认识到委托与事件,我做了一个概念对应代码的分析,供大家理解:
将此句对应上代码:委托是对函数的封装,可以当作给方法的特征指定一个名称。而事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程。

  1. 委托是对函数的封装:Cat.CatShoutEventHandler (mouse1.Run);——将老鼠跑的方法封装到了CatShoutEventHandler委托中。
  2. 可以当作给方法的特征指定一个名称:CatShoutEventHandler;——在声明委托CatShoutEventHandler时已经确定了,可以根据业务随意起名。
  3. 事件则是委托的一种特殊形式:public event CatShoutEventHandler CatShout;
  4. 当发生有意义的事情时:if(CatShout != null)——如果此事件里登记了委托,才会继续执行
  5. 事件对象处理通知过程:CatShout();——自我调用,此时去执行事件,触发老鼠跑。

将此句对应上代码:委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为

  1. 委托是一种引用方法的类型:public delegate void CatShoutEventHandler();
  2. 一旦为委托分配了方法,委托将与该方法具有完全相同的行为:Cat.CatShoutEventHandler (mouse1.Run)

  学无止境,我们不仅需要能写出符合业务的代码,还要写出和实际相符合的代码来,我们需要不断地练习实践才可能真正成为优秀的软件工程师!文章来源地址https://www.toymoban.com/news/detail-406497.html

到了这里,关于委托与事件(一)——C#版本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#学习笔记8:接口、委托、事件

    今日继续我的C#学习之路,今日学习接口、委托、事件,文章从实践出发学习这三个设计理念,并提供完整源码 目录 1、接口(多重继承): 代码: 运行结果: 2、委托(方法的代理/函数指针): 创建控制台程序实现委托: 遇到的报错及解决: 修改后的代码: 运行结果: 3、

    2024年04月15日
    浏览(55)
  • C#学习,委托,事件,泛型,匿名方法

    目录 委托 声明委托 实例化委托 委托的多播 委托的用途 事件 通过事件使用委托 声明事件 泛型 泛型的特性 泛型方法 泛型的委托 匿名方法 编写匿名方法的语法 类似于指针,委托是存有对某个方法的引用的一种引用类型变量,引用可以在运行时被改变。特别用于实现事件和

    2024年02月12日
    浏览(46)
  • C# 中的委托和事件机制

    在C#中,委托和事件是非常重要的概念,用于实现程序中的回调和事件处理。在这里,我们将介绍C#中委托和事件机制的基础知识和用法。 委托是一种类似于C/C++函数指针的概念,它允许将方法作为参数传递到其他方法中,以实现回调函数的功能。委托是一种类型,它可以表示

    2023年04月21日
    浏览(36)
  • C# 事件和委托的区别并说明

    事件是基于委托的,为委托提供了一个发布/订阅机制。可以说事件是一种特殊的委托,他的调用和委托是一样的。 事件的声明 public event 委托类型 事件名称 通常事件的命名以事件名称+Event来命名。如public event delegate NotifyEvent; 事件和委托的区别如下: 事件只能在方法的外部

    2024年02月07日
    浏览(39)
  • C# 一个完整的委托、事件学习示例

    该示例符合委托、事件的定义规则,并且可以帮助大家更好地理解委托和事件的使用! 先定义了一个名为 MyEventArgs 的类,继承自 EventArgs ,它包含一个 Message 属性,用于存储传递的消息。 Publisher 类中添加了一个 protected virtual 的方法 OnMyEvent ,用于触发 MyEvent 事件,并传递

    2024年02月07日
    浏览(41)
  • 【C# Programming】委托和lambda表达式、事件

    目录 一、委托和lambda表达式 1.1 委托概述 1.2 委托类型的声明 1.3 委托的实例化 1.4 委托的内部机制  1.5 Lambda 表达式 1.6 语句lambda 1.7 表达式lambda 1.8 Lambda表达式 1.9 通用的委托 1.10 委托没有结构相等性 1.11 Lambda表达式和匿名方法的内部机制 1.12 外部变量 1.13 外部变量的

    2024年02月06日
    浏览(46)
  • Python 3.11 版本是对线程安全做了什么更改吗

    问题:这份代码在 3.11.3 中它居然输出 0 ,一度以为自己写错了,抱着不信邪的态度,又搞了个 Python 3.9.7 的环境试了下,果然还是符合自己预期,输出不为 0,想问下 3.11 版本中是做了什么修改吗? 答案: 首先在 Python 字节码执行的时候 ,GIL 并不是随时能在任意位置中断切

    2024年02月09日
    浏览(39)
  • C#中的委托(Delegate)和事件 (Event)详解与使用范例

    最近天气晴雨不定,你因为害怕打游戏时忘记在下雨时收衣服或者在天晴时把衣服挂出去,于是你委托好友小明在天气发生变化时打电话通知你,这就是一种委托. 下面是这种委托的实例代码 以上代码的输出为 值得一提的是,如下代码为创建一个继承自Delegate类的名为XiaoMing的子类

    2023年04月12日
    浏览(42)
  • C#学习笔记--数据结构、泛型、委托事件等进阶知识点

    ArrayList 元素类型以Object类型存储,支持增删查改的数组容器。 因而存在装箱拆箱操作,谨慎使用。 ArrayList和数组区别? ArrayList使用不用说明固定长度,数组则需要 数组存储的是指定类型的,ArrayList是Object ArrayList存在装箱拆箱,数组不存在 ArrayList数组长度用Count获取 而数组

    2024年02月08日
    浏览(50)
  • 面试常考:C# 委托(delegate、Action、Func、predicate)和事件

    刚开始工作的时候,觉得委托和事件有些神秘,而当你理解他们之后,也觉得好像没有想象中的那么难,这篇博文算是自己对委托和事件的一次梳理和总结。 C#中的委托,相当于C++中的指针函数,但委托是面向对象的,是安全的,是一个特殊的类,当然他也是引用类型,委托

    2024年02月16日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包