C#知识点总结系列:3、C#中Delegate和Event

一、Delegate委托可以理解为一个方法签名。

    可以将方法作为另外一个方法的参数带入其中进行运算。在C#中我们有三种方式去创建委托,分别如下:

复制代码
        public delegate void Print(string str);static void delegatemethod(string str){Console.WriteLine(str);}public static void Main(){#region 委托//1.普通委托var print1 = new Print(delegatemethod);print1("这是普通方式创建的委托");//2.匿名委托Print print2 = delegate(string str) {Console.WriteLine(str);};print2("这是匿名方式创建的委托");//3.lambda委托Print print3 = (string str) => {Console.WriteLine(str);};
}
复制代码

  二、Event事件,是一种封装过的委托。

    它拥有以下三要素:

    1.事件发行者-达到某些条件时激发事件的对象

    2.事件订阅者-订阅事件并对事件发生时进行处理的对象

    3.定义发行者和订阅者关系,一个发行者可能会有多个订阅者。

  三、事件和委托的区别

    1.委托允许直接通过委托去访问相应的处理函数,而事件只能通过公布的回调函数去调用

    2.事件只能通过“+=”,“-=”方式注册和取消订户处理函数,而委托除此之外还可以使用“=”直接赋值处理函数。

  最后我们可以看看整个自定义事件的处理办法以及事件和委托的区别如下代码:

复制代码
    //事件参数public class My_EventArgs : EventArgs{private string _args = string.Empty;public My_EventArgs(string args){_args = args;}public string Args{get { return _args; }}}//事件发行者public class SourceClass{public double Width { get; set; }public double Height { get; set; }My_EventArgs Evargs;public SourceClass(string args){Evargs = new My_EventArgs(args);}//定义委托public delegate void EventHandler(object sender, My_EventArgs args);#region 使用委托方式声明public EventHandler Clicked;public void ClickedAsync(){if (Clicked != null){Clicked(this, Evargs);}}#endregion#region 使用事件方式声明public event EventHandler Click;public void ClickAsync(){if (Click != null){Click(this, Evargs);}}#endregion}//事件订阅者public class Del{public delegate void Print(string str);static void delegatemethod(string str){Console.WriteLine(str);}public static void Main(){#region 委托//1.普通委托var print1 = new Print(delegatemethod);print1("这是普通方式创建的委托");//2.匿名方法
Print print2 = delegate(string str) {Console.WriteLine(str);};print2("这是匿名方法创建的委托");//3.lambda委托Print print3 = (string str) => {Console.WriteLine(str);};print3("这是lambda方式创建的委托");#endregion#region 事件SourceClass source = new SourceClass("我的事件被触发");source.Width = 5.0;source.Height = 3.0;//一、委托方式允许source.Clicked(source, new My_EventArgs("我使用委托方式调用的Args"));调用source.Clicked = new SourceClass.EventHandler(source_RightClick);source.Clicked += new SourceClass.EventHandler(source_LeftClick);source.ClickedAsync();source.Clicked(source, new My_EventArgs("我使用委托方式调用的Args"));//二、很明显用户希望通过使用source.ClickedAsync();去调用函数,而非直接使用上行代码去调用,所以在这里需要使用Event关键字进行申明//注1.事件方式不允许source.Clicked(source, new My_EventArgs("我使用委托方式调用的Args"));直接调用//注2.事件不允许 source.Click = new SourceClass.EventHandler(source_LeftClick);直接赋值source.Click += new SourceClass.EventHandler(source_LeftClick);source.ClickAsync();//注销事件和注册事件source.Click -= new SourceClass.EventHandler(source_LeftClick);source.Click += new SourceClass.EventHandler(source_RightClick);source.ClickAsync();Console.ReadLine();#endregion}//事件处理方法1static void source_LeftClick(object sender, My_EventArgs args){SourceClass source = sender as SourceClass;Console.WriteLine("目标宽度:" + source.Width + ",目标高度:" + source.Height);Console.WriteLine("目标对象参数:"+args.Args);}//事件处理方法2static void source_RightClick(object sender, My_EventArgs args){SourceClass source = sender as SourceClass;Console.WriteLine("目标面积:" + source.Width *source.Height);}}
复制代码

   运行的效果图如下:

 

转 https://www.cnblogs.com/chengxingliang/archive/2013/05/21/3051912.html

转载于:https://www.cnblogs.com/asdyzh/p/9885666.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python的2种字符串格式化输出

字符串格式化代码(typecode) 法一: %格式使用下面的格式 %[(name)] [flags] [width][.precision] typecode (name)输出字典的value使用,这里的name是字典的key(实际指定时,必须有外面的圆括号) …

Python中字典合并的四种方法

字典是Python语言中唯一的映射类型。映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表。字典对象是可变的,它是一个容器类型&#xf…

从零开始的全栈工程师——js篇2.12(面向对象)

面向对象 Js一开始就是写网页特效,面向过程的,作者发现这样写不好,代码重复利用率太高,计算机内存消耗太大,网页性能很差。 所以作者就收到java和c的影响,往面向对象靠齐。Js天生有一个Object,但…

20172332 2017-2018-2 《程序设计与数据结构》第七周学习总结

20172332 2017-2018-2 《程序设计与数据结构》第七周学习总结 教材学习内容总结 第十一章 二叉查找树 1.二叉查找树&#xff1a;一种带有附加属性的二叉树。即每个结点其左孩子都要小于其父结点&#xff0c;而父结点又小于或等于其右孩子。&#xff08;左孩子<父结点<右孩…

weblogic的输出打印日志设置

设置路径&#xff1a; 1、服务器——》控制&#xff0c;进入服务器设置 2、服务器启动——>设置参数 3、参数配置&#xff1a; -Xms2048m -Xmx4096m -XX:PermSize256m -XX:MaxPermSize512m -XX:UseConcMarkSweepGC -XX:CMSClassUnloadingEnabled -XX:DisableExplicitGC -…

支持向量机——Large Margin Classifier

支持向量机的目标是 \[\underbrace {\min }_\theta \left\{ {C\left[ {\sum\limits_{i 1}^m {{y^{\left( i \right)}}{\mathop{\rm Cos}\nolimits} {t_1}\left( {{\theta ^T}{x^{\left( i \right)}}} \right) \left( {1 - {y^{\left( i \right)}}} \right){\mathop{\rm Cos}\…

2018-2019-1 20189210 《LInux内核原理与分析》第四周作业

第三章 这一章接触内核源代码&#xff0c;对内核源码进行编译和调试跟踪 一、预备知识&#xff1a; 内核&#xff1a;整个操作系统的最底层&#xff0c;它负责了整个硬件的驱动以及提供各种系统所需的内核功能。内核实质上是系统上面的一个文件而已&#xff0c;这个文件包含了驱…

linux测试网络是否连通ping、telnet命令

ping 可以测试到目标机器的连通性&#xff0c;ping域名还可以得出解析IP。 ping ip地址 例&#xff1a;ping 127.0.0.1图例&#xff1a; telent测试端口是否开放。 telent ip地址 端口号 例如&#xff1a;telent 127.0.0.1 8080

深入了解Kubernetes REST API的工作方式

关于Kubernetes REST API的工作方式&#xff1a; 在哪里以及如何定义从REST路径到处理REST调用的函数的映射&#xff1f; 与etcd的交互发生在哪里&#xff1f; 从客户端发出请求到保存在etcd中对象的端到端路径是怎样的&#xff1f; Kubernetes REST框架 Kubernetes REST实现可…

gitlab hook触发jenkins自动构建

意义&#xff0c;gitlab推送或合并代码后触发jenkin自动构建发布代码或者执行命令推送规则 1.安装gitlab和hook插件有时需要重启jenkins服务&#xff0c;可能兼容性问题&#xff0c;安装完之后构建中看不到hook插件 2.配置jenkins构建中的hook插件下图中圈出为必选&#xff0c;…

React 点击按钮显示div与隐藏div

<!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>React 点击按钮显示div与隐藏div</title><script src"https://unpkg.com/react16/umd/react.development.js"></script><script src"…

mac/linux 解决启动命令行出现declare问题

问题描述&#xff1a;启动命令行时出现以下现象&#xff0c;如图所示&#xff1a; 问题解决&#xff1a; 在配置环境变量时&#xff0c;在某一行直接单独写了一个export,要么在bashrc中&#xff0c;要么在bash_profile等配置文件中&#xff0c;系统加载环境变量时就出现了上述情…

MVC 模式和模型 2

MVC框架 一个实现 MVC 模式的应用包含模型、视图、控制器 3 个模块&#xff1a; 模型&#xff1a;封装了应用的数据和业务逻辑&#xff0c;负责管理系统业务数据 视图&#xff1a;负责应用的展示 控制器&#xff1a;负责与用户进行交互&#xff0c;接收用户输入、改变模型、调整…

Java中线程池,你真的会用吗?

在《深入源码分析Java线程池的实现原理》这篇文章中&#xff0c;我们介绍过了Java中线程池的常见用法以及基本原理。 在文中有这样一段描述&#xff1a; 可以通过Executors静态工厂构建线程池&#xff0c;但一般不建议这样使用。 关于这个问题&#xff0c;在那篇文章中并没有深…

深入了解java虚拟机(JVM) 第四章 对象的创建

一、对象的创建过程 对象的创建过程大致可以分为六步&#xff0c;其中对象的分配尤为重要&#xff1a; 二、对象分配内存 一般来说对象分配内存有两种方式&#xff1a; 第一种是指针碰撞&#xff0c;这是一种比较理想的方式&#xff1a;如果Java堆是绝对规整的&#xff1a;一边…

[UWP]使用Picker实现一个简单的ColorPicker弹窗

[UWP]使用Picker实现一个简单的ColorPicker弹窗 原文:[UWP]使用Picker实现一个简单的ColorPicker弹窗在上一篇博文《[UWP]使用Popup构建UWP Picker》中我们简单讲述了一下使用Popup构建适用于MVVM框架下的弹窗层组件Picker的过程。但是没有应用实例的话可能体现不出Picker相对于…

C# WebRequest.Create 锚点“#”字符问题

背景 在与后台API接口对接时&#xff0c;如将网页Url作为参数请求数据时&#xff0c;如果是锚点参数&#xff0c;则会丢失。 锚点参数 请求通过WebRequest.Create创建一个WebRequest&#xff1a; 1 var uri "https://id.test.xxx.com/api/v1/auth/sso/url?redirectUrlht…

免费的编程中文书籍索引(2018第三版)

之前我在 github 上整理了来一份&#xff1a;free-programming-books-zh_CN&#xff08;免费的计算机编程类中文书籍&#xff09;。 截至目前为止&#xff0c;已经在 GitHub 收获了 40000 多的 stars&#xff0c;有 90 多人发了 600 多个 Pull Requests 和 issues。 在收集的过…

分类与监督学习,朴素贝叶斯分类算法

1.理解分类与监督学习、聚类与无监督学习。 &#xff08;1&#xff09;简述分类与聚类的联系与区别。 分类就是按照某种标准给对象贴标签&#xff0c;再根据标签来区分归类。聚类是指事先没有“标签”而通过某种成团分析找出事物之间存在聚集性原因的过程。 区别是&#xff0c…

一张图搞定OAuth2.0

转发&#xff1a;https://www.cnblogs.com/flashsun/p/7424071.html 目录 1、引言2、OAuth2.0是什么3、OAuth2.0怎么写1、引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式&#xff1a;授权码模式 非常简单的一件事情&#xff0c;网上一堆神乎其神的讲解&#xff0c;让…