委托事件学习笔记

本文是学习委托和事件的笔记,水平有限,如有错漏之处,还望大神不吝赐教。

  1. 什么是委托?从字面意思来解释,就是把一个动作交给别人去执行。在实际开发中最常用的就是使一个方法可以当做一个参数传递,以便在方法中可以根据实际情况实现不同的功能。
  2. 什么是事件?事件就是发生的事情,例如点击了一下鼠标,对应鼠标单击事件,双击速表对应鼠标双击事件……进行Winform开发的时候就能了解到很多的事件,可以说只有想不到的事件,没有微软不能提供的事件。实际上事件是一种特殊的委托,定义一个事件的时候也需要指定事件所依赖的委托。

如何声明一个委托呢?

声明委托需要使用关键字delegate其他与声明一个方法相同,需要指定委托使用的参数和返回值,但是委托的声明是没有具体实现的,委托的实现是在初始化的时候指定委托的方法。

//声明一个委托,返回值为空,需要两个参数

//委托的声明与方法类似,所以内部的方法也必须是与委托声明包含相同的传入参数和返回值

public delegate void CustomDelegate(object sender, CustomArgs args);

实现自定义的参数类,Winform开发里面可以经常看到EventArgs这个类,他是与触发的事件相关的参数

//此对象继承自EventArgs用于传递给委托的参数

//不是强制要求如此声明,只是根据默认约定,实际项目中可根据需要进行声明

public class CustomArgs : EventArgs

{

public string Name { get; set; }

}

下面的类是委托和事件使用的公共类

//用于委托学习的公共类

public class CustomCommon

{

//声明一个事件

//事件是一种特殊的委托,除了不用指定一个初始的方法之外,使用方法与委托相似

//事件只能通过+=和-=的方式添加需要执行的方法

//委托只能在声明它的类内部触发

public event CustomDelegate CustomHandler;

public void ShowName(object sender, CustomArgs args)

{

Console.WriteLine($"Your name is :{args.Name}");

}

public void ShowOther(object sender, CustomArgs args)

{

Console.WriteLine("此方法是ShowOther");

}

//定义此方法用于触发事件

public void OnHandler(object sender,CustomArgs args)

{

if (CustomHandler != null)//判断事件是否为空

{

CustomHandler(sender, args);

}

}

委托的初始化即调用

//委托初始化的时候需要传入一个方法

//委托就是把方法交给别人去执行,所以一定需要在添加了方法之后委托才能执行.所以,必须在初始化的时候添加第一个方法

CustomCommon common = new CustomCommon();

CustomArgs cargs = new CustomArgs() { Name = "此坑已满" };

CustomDelegate handler = new CustomDelegate(common.ShowName);//此处传入的是方法的声明,而不是方法执行的结果

//handler(null,cargs);//委托的调用与方法的调用相同

委托内部可以同时添加多个相同声明的方法,称为委托链

//委托链调用

//委托可以通过+=和-=添加和移除方法

//相同对象的同一个方法只能添加一次

//委托链的执行时按照添加方法的顺序进行执行,如果委托返回值不是void那么委托链的返回值就是最后一个方法执行后的返回值,其他方法的返回值全部都会被舍弃

handler += common.ShowOther;

//调用此委托链

//委托链调用传入的参数,会传递给内部的所有方法,且每个方法获取到的参数一模一样

//handler(null, cargs);

事件的使用

//测试事件

//事件在Winform程序中使用的非常多,例如按钮的Click事件,Winform的窗体类都是分部类

//查看Designer类就可以看到CLick+=为事件添加一个处理方法

common.CustomHandler += ShowMethod;

//common.OnHandler(null, null);

//匿名方法

//匿名方法,即不指定方法的名称,使用delegate关键字代替即可,使用匿名方法可以不用为实现委托而专门去定义一个方法,只需要实现方法即可

Action<int> action = new Action<int>(delegate (int value) { Console.WriteLine($"This Value is {value}"); });

//action(10);

//Lambda表达式

//Lambda更加简化了委托的编程只需要=>即可实现方法

//Lambda使用格式,(x,y)=>{dosomthing}

//如果只有一个参数那么可以写为 x=>{dosomthidng}

//如果只有一句代码,那么可以写为x=>dosomthing

//如果没有参数,那么就不能省略()必须写为()=>{dosomthing}

//x,y是参数的表示符,C#编译器会自动推测其类型,而其值即为调用委托时传入的值

//如下t的类型为int其值为10

Action<int> actionL = (t) => { Console.WriteLine($"This is a Method for Test Lambda value is {t}"); };

actionL(10);

Console.ReadKey();

//下面是事件使用的方法

public static void ShowMethod(object sender, CustomArgs args)

{

Console.WriteLine("This is a Method for Test Event");

}

将方法当做一个参数传递

/// <summary>

/// 测试委托作为参数传递的方法

/// </summary>

/// <param name="list"></param>

/// <param name="func"></param>

public int ParaDeleTest(List<int> list, Func<List<int>, int> func)

{

if (list != null && list.Count > 0)//判断数组必须包含值,仅为了测试代码简单而实现,实际项目请根据需要进行设置

{

return func(list);//对数据进行操作

}

else

{

return -1;

}

}

List<int> list = new List<int>{ 1, 4, 23, 124, 54 };

//将委托作为参数传入,可以实现在不同的需求情况下,实现不同的功能

int ave = common.ParaDeleTest(list, (x) => { return (int)x.Average(); });//计算List的平均值

int max = common.ParaDeleTest(list, x => x.Max());//计算List中的最大值

Console.WriteLine($"This List Average is {ave},Max is {max}");

C#委托与事件学习笔记的更多相关文章

  1. C#事件和委托(C#学习笔记03)

    委托 1. C# 中的委托类似于 C 或 C++ 中指向函数的指针.委托表示引用某个方法的引用类型变量,运行时可以更改引用对象. 2. 特别地,委托可以用于处理事件或回调函数.并且,所有的委托类都是从 ...

  2. 《JS高程》事件学习笔记

    事件:文档或浏览器窗口中发生的一些特定的交互瞬间,也即用户或浏览器自身执行的某种动作. -------------------------------------------------------- ...

  3. C#委托与事件--简单笔记

    委托 简单记录点东西 适合似懂非懂的朋友看看 委托类型用来定义和响应应用程序中的回调. 借此可以设计各种有面向对象特性的代码模式.下面要说的事件在我看来就是委托的一种实现,再深一步讲,利用委托加事件, ...

  4. [转载]C#委托与事件--简单笔记

    原文地址:https://www.cnblogs.com/joeymary/p/8486358.html 委托 简单记录点东西 适合似懂非懂的朋友看看委托类型用来定义和响应应用程序中的回调.借此可以设 ...

  5. javascript事件学习笔记

    事件冒泡 并不是所有的事件都支持事件冒泡,比如submit ,focus,blur不支持事件冒泡,mouseover,mouseout虽然支持冒泡,但是一般不用,因为需要经常计算元素的位置,消耗比较大 ...

  6. js的事件学习笔记

    目录 0.参考 1.事件流 冒泡传播 事件捕获 2.事件绑定--onclick接口 onclick类的接口,只能注册一个同类事件 onclick类的接口,使用button.onclick = null ...

  7. jquery事件学习笔记(转载)

    一.页面载入1.ready(fn)当DOM载入就绪可以查询及操纵时绑定一个要执行的函数.这是事件模块中最重要的一个函数,因为它可以极大地提高web应用程序的响应速度. 简单地说,这个方法纯粹是对向wi ...

  8. 关于C#委托的一些学习笔记

    1.什么是委托就是把方法作为参数传给另一个方法.委托说指向的函数,必须和函数具有相同的签名(返回值和参数类型) Public delegate void DelSayHi(string name); ...

  9. jQuery选择器与事件学习笔记

    层次选择器:  $("div li")获取div下的所有li元素(后代.子.子的子......)  $("div>li")获取div下的直接li子元素.  ...

随机推荐

  1. 20175324王陈峤宇 《Java程序设计》第六周学习总结

    教材学习内容总结 第七章 一.内部类与外部类的关系 1.内部类可以使用外嵌类的成员变量和方法.2.类体中不可以声明类变量和类方法,外部类可以用内部类声明对象.3.内部类仅供外嵌类使用.4.类声明可以使 ...

  2. 3-1.Hadoop单机模式安装

    Hadoop单机模式安装 一.实验介绍 1.1 实验内容 hadoop三种安装模式介绍 hadoop单机模式安装 测试安装 1.2 实验知识点 下载解压/环境变量配置 Linux/shell 测试Wo ...

  3. Ubuntu部署python3.7的开发和运行环境

    Ubuntu部署python3.7的开发和运行环境 1 概述 由于最近项目全部由python2.x转向 python3.x(使用 python3.7.1) ,之前的云主机的的默认python版本都面临 ...

  4. 1.9 From Native to HTML5

    The mobile technology has become more and more mature, and it has evolved from a ridiculous situatio ...

  5. 【RL-TCPnet网络教程】第23章 RL-TCPnet之地址解析协议ARP

    第23章      RL-TCPnet之地址解析协议ARP 本章节为大家讲解ARP(Address Resolution Protocol,地址解析协议),通过前面章节对TCP和UDP的学习,需要大家 ...

  6. 全面解密QQ红包技术方案:架构、技术实现、移动端优化、创新玩法等

    本文来自腾讯QQ技术团队工程师许灵锋.周海发的技术分享. 一.引言 自 2015 年春节以来,QQ 春节红包经历了企业红包(2015 年).刷一刷红包(2016 年)和 AR 红包(2017 年)几个 ...

  7. Android端IM应用中的@人功能实现:仿微博、QQ、微信,零入侵、高可扩展

    本文由“猫爸iYao”原创分享,感谢作者. 1.引言 最近有个需求:评论@人(没错,就是IM聊天或者微博APP里的@人功能),就像下图这样:   ▲ 微信群聊界面里的@人功能    ▲ QQ群聊界面里 ...

  8. TensorFlow.org教程笔记(二) DataSets 快速入门

    本文翻译自www.tensorflow.org的英文教程. tf.data 模块包含一组类,可以让你轻松加载数据,操作数据并将其输入到模型中.本文通过两个简单的例子来介绍这个API 从内存中的nump ...

  9. C++ Opencv remap()重映射函数详解及使用示例

    一.重映射及remap()函数介绍 重映射,就是把一幅图像中某位置的像素放置到另一图像指定位置的过程.即: 在重映射过程中,图像的大小也可以同时发生改变.此时像素与像素之间的关系就不是一一对应关系,因 ...

  10. RabbitQM(消息duilie)

    前言:RabbitMQ 是实现 AMQP(Advanced Message Queuing Protocol 高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息, ...