委托

简单记录点东西 适合似懂非懂的朋友看看

委托类型用来定义和响应应用程序中的回调。

借此可以设计各种有面向对象特性的代码模式。下面要说的事件在我看来就是委托的一种实现,再深一步讲,利用委托加事件,是不是可以构建各种所谓的管道框架。

ASP.NET WebAPI的管道模型,整个消息处理管道是通过一组有序的HttpMessagHandler “首尾相连”而成,具体实现“串联”的是通过DelegatingHandler这个类型来完成的。即是一组委托链

最精华的内容您已看完

委托定义 public delegate int DeleName(int x);

名称

参数

返回值

1、委托简单示例

 DeleName del = M1;
public int M1(int i)
{
...
}

入门理解1:委托是方法的类型,即委托=class,方法=new class()

上面的方法名称M1只起到传递作用时,可以用匿名委托代替:

 DeleName del = delegate (int i)
{
...
};

除了用匿名委托,还可以用lamda表达式进行代替:

 DeleName del =  (int i)=>
{
...
};

在这里也能看出lamda本质就是委托

2、泛型委托

 public delegate void MyGenericDelegate1<T>(T arg);
public delegate int MyGenericDelegate2<T,M>(T arg,M name); MyGenericDelegate1<int> intTarget = new MyGenericDelegate<int>(IntTarget);
static void IntTarget(int arg) => Console.WriteLine($"IntTarget--> {++arg}"); MyGenericDelegate2<int,string> intTarget1 = (int arg,string name) =>
{
return 1;
};

好处:封装为了复用

看下上面两个委托的命名:MyGenericDelegate1 MyGenericDelegate2 纯粹为了取名而取名,此时我们可以不自己取名。

怎么做呢,C#本身提供了两个泛型委托可以给我们使用,且可满足大多数场景。

3、泛型Action<> 和 Func<> 委托

(可指向至多传递16个参数的方法)

Action<>:无返回值: 定义 public delegate void Action<...>

        public static void Show()
{
// 使用Action<>委托来指向 DisplayMessage()
Action<string, ConsoleColor, int> actionTarget = new Action<string, ConsoleColor, int>(DisplayMessage);
actionTarget("actionTarget", ConsoleColor.Red, 5);
} // Action<> 委托的一个目标
private static void DisplayMessage(string msg, ConsoleColor txtColor, int printCount)
{
...
}

Func<>:有返回值 public delegate TResult Func<..., out TResult> TResult:返回值类型

 Func<int, int, int> funcTarget = new Func<int, int, int>(Add);

 funcTarget(1, 2);

 static int Add(int x, int y) => x + y;

如果你觉得一个具有自定义名称的委托更有助于捕获问题范畴,那么构建自定义委托不过就是一行代码的事儿。

注:Linq中就大量的用到了 Action<> 和 Func<>。

4、事件

最简单的说法是:可以把事件看成是委托的一个实例。委托比作类:它定义了函数的签名(接受什么类型的参数 返回什么类型的值)事件比作委托new出来的一个实例,是具有该委托签名的具体函数。当然事件和实例也是有区别的:

1、事件这个东西 能容纳很多个具体的函数(通过+= -= 增加删除)。

2、事件有event关键字起到了保护作用不允许改变事件的引用。即在声明事件的类外部不能用=对事件对象赋值

直接看看代码

public delegate void HelloWorldDelegate(string name);

public class HelloWorldClass2
{
public event HelloWorldDelegate del;//!!!!event修饰了委托对象
public void HelloWorld(string name)
{
//del = (n) => { Console.WriteLine(n); };//在声明事件的类内部可以用=直接定义事件的引用(赋值)
del(name);
}
} class Program
{
static void Main(string[] args)
{
HelloWorldClass2 h2 = new HelloWorldClass2();
//h2.del = ByEnglish;//不允许改变事件的引用(不能用=赋值)
h2.del += ByEnglish;//第一种
//手工创建一个委托变量是最直接的方式。但是大多数情况下,我们并不依靠委托对象。我们可以使用C#提供的方法组转换的方法,它允许我们在调用以委托作为参数的方法时直接提供了与委托期望的签名想匹配的方法的名称(返回 void,参数 string),而不是创建委托对象。(所以一般直接用上面这种)
HelloWorldDelegate de = ByChinese;
h2.del += de;//第二种
h2.HelloWorld("mary"); Console.ReadLine(); } static void ByEnglish(string name)
{
Console.WriteLine("hello,world"+name);
} static void ByChinese(string name)
{
Console.WriteLine("你好,世界" + name);
}
}

事件默认是个多播委托,什么是多播委托呢?就是上面的h2.del委托容纳的方法有多个,ByEnglish跟ByChinese,用+=可以继续往下延伸。

委托和事件的区别在于,事件是个规约,委托是个实现(当然抽象上的委托也可以不是个具体的实现)。

规约的含义是,我定义了这么个语法,你可以通过+=和-=把委托挂载到这个东西(事件)上,当发生这个事件的时候,我会确保这些委托都被得到调用。但是具体是怎么调用的,你不用关心。

欢迎讨论~

感谢阅读~

个人公众号:

原文:http://www.cnblogs.com/joeymary/p/8486358.html

C#委托与事件--简单笔记的更多相关文章

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

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

  2. C#委托与事件学习笔记

    委托事件学习笔记 本文是学习委托和事件的笔记,水平有限,如有错漏之处,还望大神不吝赐教. 什么是委托?从字面意思来解释,就是把一个动作交给别人去执行.在实际开发中最常用的就是使一个方法可以当做一个参数 ...

  3. Silverlight项目笔记1:UI控件与布局、MVVM、数据绑定、await/async、Linq查询、WCF RIA Services、序列化、委托与事件

    最近从技术支持转到开发岗,做Silverlight部分的开发,用的Prism+MVVM,框架由同事搭好,目前做的主要是功能实现,用到了一些东西,侧重于如何使用,总结如下 1.UI控件与布局 常用的主要 ...

  4. C#委托与事件的简单使用

    前言:上一篇博文从原理和定义的角度介绍了C#的委托和事件.本文通过一个简单的小故事,来说明C#委托与事件的使用方法及其方便之处. 在阅读本文之前,需要你对委托和事件的基本概念有所了解.如果你是初次接触 ...

  5. C# 委托和事件(一):最简单的委托和事件

    C#的事件基于委托,所以先说委托. 一切脱离实际场景的抽象概念新手看上去就像是在扯犊子,不错,我就是个新手.所以我需要一个实际的场景. 明天刚好考试(商务英语),考试上有两个角色(class):老师( ...

  6. (.NET高级课程笔记)委托、事件总结

      1.委托的声明.实例化和调用 同样的,也可以把事务写成上面的形式 2.泛型委托---Func.Action 3.委托的意义:解耦 4.委托的意义:异步多线程 5.委托的意义:多播委托 6.观察者模 ...

  7. 《C#从现象到本质》读书笔记(六)第8章委托和事件

    <C#从现象到本质>读书笔记(六)第二部分 C#特性 第8章委托和事件 从这一部分开始,知识点就相对少了,重要的是代码练习.奈何太高深的代码平常不怎么用,这些特性也不是经常写代码的. 委托 ...

  8. C# 委托和事件,简单示例说明问题

    先看看示例效果 按照国际惯例,得先说说概念. 委托(C# 编程指南) 事件(C# 编程指南) 以上内容来自MSDN. 委托源码 [委托] 概念和代码都有了.剩下的就是应用了,要是只知道概念不会用,那还 ...

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

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

随机推荐

  1. 一个不可思议的MySQL慢查分析与解决

    转自:http://fordba.com/optimize-an-amazing-mysql-slowlog.html?hmsr=toutiao.io&utm_medium=toutiao.i ...

  2. JVM-触发Full GC的情况

    除直接调用System.gc外,触发Full GC执行的情况有如下四种: 1.老年代空间不足 老年代空间只有在新生代对象转入及创建为大对象.大数组时才会出现不足现象,当执行Full GC后空间仍然不足 ...

  3. linux_运维职责

    运维准则: 不要删文件,移动文件,可以复原,一个月后什么事没有,删除 运维人员主要关注哪些方面? CPU:对计算机工作速度和效率起决定性作用(intel amd) 内存: 临时存放数据:容量和处理速度 ...

  4. POI--HSSFCellStyle类

    通过POI来进行单元格格式的设定 设定格式使用「HSSFCellStyle」类.它有一个构造方法: protected HSSFCellStyle(short index, ExtendedForma ...

  5. 豹哥嵌入式讲堂:ARM知识概要杂辑(4)- Cortex-M处理器性能指标

    1.处理器的性能指标 用于评价CPU的性能指标非常多,不同的性能侧重点下的测试标准可能得出的指标值不同,下面介绍嵌入式行业广泛使用的两个经典的测试标准. 1.1 Dhrystone标准 Dhrysto ...

  6. awk进阶整理

    BEGIN{写在前言,我英语不好,有许多地方直接使用的谷歌翻译.为了能理清awk工具使用的思路,详情还要看awk说明书(man awk) 或者http://www.gnu.org/software/g ...

  7. 【sed & awk 第二版笔记】以州和人名排列_P38

    [root@nhserver1 02]# cat listJohn Daggett, 341 King Road, Plymouth MAAlice Ford, 22 East Broadday, R ...

  8. Node.js在任意目录下使用express命令‘不是内部或外部命令’解决方法

    1.一开始我只能在nodejs全局目录下使用express命令建一个新的项目,建在其他任意一个目录命令行都会提示"不是内部或外部命令",导致目录会乱,目录如下. 2.尝试了一会,发 ...

  9. pat 1014 1017 排队类问题

    1.用循环模拟时间 2.采用结构体模拟客户和窗口对象 3.合理处理边界,去除无用信息 4.使用自带排序sort()结合自定义功能函数compare()实现排序

  10. VNC配置

    简介 VNC (Virtual Network Console)是虚拟网络控制台的缩写.它 是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的.VNC 是在基于 UNIX ...