如鹏网 net高级技术 第二章 委托和事件(复习)

委托

  委托是一种数据类型,可以声明委托类型变量。

  委托是一种可以指向方法的数据类型。

  声明委托的方式:delegate返回值类型 委托类型名(参数)    比如  delegate void MyDel(int n)

  注意这里的除了前面的delegate,剩下部分和声明一个函数一样,但是Mydel不是函数名,而是委托类型名

  如何创建委托类型的对象:

    MyDel sp = new Mydel (SayHello) //SayHello需要和MyDel的参数返回值一样;

      sp这个委托变量就指向SayHello这个方法。

      注意不要写成new Mydel (SayHello())因为加上()就是调用方法了

  简化的方法:MyDel sp = SayHello;//编译器会给搞成new Mydel (SayHello),反编译看看。

        注意不要写成MyDel sp = SayHello();

  委托的使用:委托变量之间可以互相赋值,就是一个传递指向方法的过程;sp()就是调用指向的方法,如果有参数就传递参数。

  委托:是一种指向方法的数据类型。 声明的语法:delegate int MyDel2(int i,string s); MyDel2是一个数据类型;

       可以声明一个变量指向和他类型相容的方法

               public delegate void MyDel(int n);

              static void M1(int a) { Console.WriteLine("M1"+a); }

               MyDel d1 = new MyDel(M1);//声明MyDel类型的变量,指向一个指向M1方法的对象 //上面的代码也可以简化成MyDel d1 = M1;

     不要把: MyDel d1 = new MyDel(M1); MyDel d1 = M1;

    声明成: MyDel d1 = new MyDel(M1()); MyDel d1 = M1();

    因为加上括号就代表调用方法了! 拿到一个委托变量的时候MyDel d1 = M1;

     加上括号就代表“执行指向的方法”,参数该怎么传递怎么传递 委托是引用类型,

    可以为null,如果委托变量是null,那么如果调用的话,就会抛出NullReferenceException;

Func、Action

  .Net中内置两个泛型委托Func、Action(在“对象浏览器”的mscorlib的System下),

  日常开发中基本不用自定义委托类型了。

   Func是有返回值的委托;

  Action是没有返回值的委托

  试验一下用Func、 Action代替之前的委托

匿名方法

  使用Delegate的时候很多时候没必要使用一个普通的方法,因为这个方法只有这个Delegate会用,并且只用一次,这时候使用匿名方法最合适。

   匿名方法就是没有名字的方法。 MyDelegate p = delegate(int s){s=10;};

   用匿名方法改造MyMax的例子。

lambda表达式

  函数式编程,在Entity framework编程中用的很多

  1、Action<int> a1 = delegate(int i) { Console.WriteLine(i); }; 可以简化成(=>读作goes to):

  2、Action<int> a2 = (int i) => { Console.WriteLine(i); }; 还可以省略参数类型(编译器会自动根据委托类型推断):

  3、Action<int> a3 = (i) => { Console.WriteLine(i); }; 如果只有一个参数还可以省略参数的小括号(多个参数不行) Action<int> a4 = i => { Console.WriteLine(i); };

  4、如果委托有返回值,并且方法体只有一行代码,这一行代码还是返回值,那么就可以连方法的大括号和return都省略:

    Func<int, int, string> f1 = delegate(int i, int j) { return "结果是" + (i + j); }; Func<int,int,string> f2= (i,j)=>"结果是"+(i+j);

  5、普通匿名类型也是一样用lambda表达式

委托深入

  集合常用扩展方法:

    Where(支持委托)、Select(支持委托)、Max、Min、OrderBy

     First(获取第一个,如果一个都没有则异常)

     FirstOrDefault(获取第一个,如果一个都没有则返回默认值)

     Single (获取唯一一个,如果没有或者有多个则异常)

    SingleOrDefault (获取唯一一个,如果没有则返回默认值,如果有多个则异常)

     关于orderby、关于where的深入分析 ToList、ToArray

委托的组合

  委托对象可以“+相加”,调用组合后的新委托对象会依次调用被组合起来的委托:MyDel m5 = m1+m2+m3;

  组合的委托必须是同一个委托类型

  (*)委托的“-”则是从组合委托中把委托移除;

   (*)委托如果有返回值,则有一些特殊。

  委托的组合一般是给事件用的,用普通的委托的时候很少用

事件

  案例:定一个Person类,定一个监听年龄变化的事件,当本命年的时候祝贺一下。

  触发事件的地方要判断一下是不是事件null

  事件语法:event Mydelegate mdl;

  加了event关键字实现事件机制的好处:

    用了event事件,不可以修改事件已经注册的值;不可以冒充进行事件通知了。只能+=、-=!

委托与事件总结

  委托的作用:

    占位,在不知道将来要执行的方法的具体代码时,可以先用一个委托变量来代替方法调用(委托的返回值,参数列表要确定)。在实际调用之前,需要为委托赋值,否则为null。

  事件的作用:

     事件的作用与委托变量一样,只是功能上比委托变量有更多的限制。

    (比如:1.只能通过+=或-=来绑定方法(事件处理程序)2.只能在类内部调用(触发)事件。)

  (面试题)事件和委托的关系:事件由一个私有的委托变量和add_***和remove_***方法组成;

     事件的非简化写法:声明一个私有的委托变量和add、remove方法。

委托和事件的区别和关系

  错误的说法“事件是一种特殊的委托”

   委托用的比较多,事件只有开发WinForm、WPF的时候用的才比较多,而WinForm、WPF则不是学习重点。掌握“事件和语法”、“委托和事件的关系和区别(面试题)”即可。

  事件监听的代码的快速生成;WinForm中的事件简单分析(谁调用的Onclick方法)

   事件、索引器、属性本质上都是方法。(面试题)接口中可以定义什么?接口中只可以定义方法。接口中也可以定义“事件、索引器、属性”,因为他们本质上也都是方法。

转载于:https://www.cnblogs.com/wjs5943283/p/9401046.html

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

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

相关文章

黄文俊:Serverless小程序后端技术分享

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 黄文俊&#xff0c;现任腾讯云SCF无服务器云函数高级产品经理&#xff0c;多年企业级系统开发和架构工作经验&#xff0c;对企业级存储、容器平台、微服务架构、无服务器计算等领域均有涉猎。今天讲的是怎么…

最少编码原则

本文作者是一位资深软件工程师&#xff0c;他根据多年的编程经验&#xff0c;把自己的观点组织整理成本文&#xff0c;希望能给大家一点启发。 “最少编码原则”并不是说写的代码少到令意思表达不清楚。其实在很多情况下&#xff0c;可以只写几行代码就能执行相同的逻辑&#x…

什么是标记接口

标识接口的作用 标识接口是没有任何方法和属性的接口。标识接口不对实现它的类有任何语义上的要求&#xff0c;它仅仅表明实现它的类属于一个特定的类型。 标接口在Java语言中有一些很著名的应用&#xff0c;比如java.io.Serializable和java.rmi.Remote等接口便是标识接口。标识…

18--两数之和 II - 输入有序数组

文章目录1.问题描述2.解题代码1.问题描述 给定一个已按照升序排列 的有序数组&#xff0c;找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2&#xff0c;其中 index1 必须小于 index2。 说明: 返回的下标值&#xff08;index1 和 index2&a…

阿里巴巴 连接池 druid 的使用、maven依赖

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. Druid是一个JDBC组件&#xff0c;它包括三部分&#xff1a; DruidDriver 代理Driver&#xff0c;能够提供基于Filter&#xff0d;…

Oracle数据库(二)—— 基本的SQL SELECT语句

&#xff08;一&#xff09;SQL语句分为一下三种类型 DML:Date Manipulation Language 数据操纵语言DDL&#xff1a;Data Definition Language 数据定义语言DCL&#xff1a;Data Control Language 数据控制语言DML&#xff1a;用于查询与修改数据记录 包括如下SQL语句&#xff…

简单 3 步实现高效编程

本文的内容可能部分开发者已经了解&#xff0c;并且已经按照这些方法实施了。但本文还是想强调这些方法&#xff0c;因为这些简单的方法可以让你的工作更加高效。要想实现高效编程&#xff0c;最主要的是集中注意力&#xff0c;但这往往也是比较难以实现的&#xff0c;因为你在…

bootstrap table footerFormatter用法 统计列求和 sum、average等

其实上一篇blog里已经贴了代码&#xff0c;简单解释一下吧&#xff1a; 1、showFooter: true,很重要&#xff0c;设置footer显示&#xff1a; $(cur_table).bootstrapTable({url: /etestpaper/getPaperQType,method: get,queryParams: {strParentID: parentid},ajaxOptions: {s…

19--两数之和

文章目录1.题目要求2.代码详情1.题目要求 2.代码详情 java:暴力求解法hashmap法 class Solution {// 方法一&#xff1a;暴力求解法// public int[] twoSum(int[] nums, int target) {// int n nums.length;// for (int i0; i<n; i){// for (int ji1; j…

单利设计模式

单利设计模式 A&#xff1a;保证对象在内存中只有一个。 B&#xff1a;如何保证&#xff1f; **不能让其他类来创建对象。 **本类中要创建一个本类对象。 **对外提供公共的访问。 C&#xff1a;步骤 我们的类是Student **private Student(){} **Student s new Student(); **p…

MVC表示层框架——Velocity技术

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Velocity&#xff0c;名称字面翻译为&#xff1a;速度、速率、迅速&#xff0c;用在Web开发里&#xff0c;用过的人可能不多&#xff0c…

redis的配置文件

redis的配置文件 之前在实习的时候才开始接触redis&#xff0c;随着对redis的理解加深&#xff0c;才慢慢明白它的强大&#xff0c;也逐渐对他的配置有了一定的了解。下面就分享给大家&#xff0c;以便日后查看。 位置 redis的配置文件名为redis.conf在它的安装目录下。 参数说…

你的代码(软件)安全吗?【信息图】

2011年安全事件层出不穷&#xff0c;几乎可以称为“黑客年”。以前黑客通常是利用程序漏洞来造成破坏&#xff0c;令网站陷入尴尬的境地&#xff0c;但如今他们却是为了窃取数据、IP地址&#xff0c;或者通过在网站中植入木马将恶意软件安装到访客的电脑里&#xff0c;更有甚者…

20--两个数组的交集

文章目录1.问题描述2.代码详情1.问题描述 给定两个数组&#xff0c;编写一个函数来计算它们的交集。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2] 示例 2&#xff1a; 输入&#xff1a;nums1 [4,9,5], nums2 [9,4,9,8,4] 输…

MD5密码加密

using System; using System.Security.Cryptography; using System.Text; namespace DimoNetwork.Common.DEncrypt { public enum MD5ResultMode : byte { Strong 0, Weak 1 } /// /// 在应用程序中定义用于单向加密文本的方法 /// public class TextEncrypt { private TextE…

跳出IT运维怪圈 看南方报业如何主动出击

虽说世界上没有一劳永逸的事情&#xff0c;不过借助某些方案&#xff0c;IT运维倒可做到事半功倍。近日&#xff0c;南方报业传媒集团采用新华三智动远程运维服务解决方案&#xff0c;利用7*24级别安仔的桌面服务&#xff0c;实现IT运维智能化、自动化管理&#xff0c;有效保障…

ORA-01841: (完整) 年份值必须介于 -4713 和 +9999 之间, 且不为 0情况解决

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 报错&#xff1a;ORA-01841: (完整) 年份值必须介于 -4713 和 9999 之间, 且不为 0 2. 我的sql是&#xff1a; <!-- 查询 推荐下载…

网络传输与加密

谈到网络&#xff0c;就必然会涉及网络安全。但“安全”这个事情&#xff0c; 一下子就会让人联想到黑客&#xff0c;进而把“安全”这个事情无限放大为各种高大上、神秘莫测、不可知。这不是一个engineer应有的态度&#xff08;《一次艰难debug的反思》&#xff09;。 要讨论网…

21--最小栈

文章目录1.问题描述2. 代码详情1.问题描述 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 push(x) —— 将元素 x 推入栈中。 pop() —— 删除栈顶的元素。 top() —— 获取栈顶元素。 getMin() —— 检索栈中的…