delegate是什么

委托(delegate) 是存有对某个方法的引用的一种引用类型变量,引用可在运行时被改变。如果不好理解,可以把委托理解成为函数指针,但它们是有区别的。

delegate和C++中的函数指针:

函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引 用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。其次,与函数指针相 比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法, 你无须担心delegate会指向无效地址或者越界地址。

实例化委托:一旦声明了委托类型,委托类型必须要通过new关键字来创建(相当于面向对象中的实例化一个对象),当创建委托时,传递到new语句中的参数就像方法的调用一样书写, 但是不带参数。

// 委托的声明
public delegate void PrintSting(string s);
//实例化委托
PrintSting ps=new PrintString(WriteToScreen);

匿名方法:

本来委托定义(声明)好之后,还得再单独定义委托需要使用的方法。比如你定义了一个计算器的委托, 你还需要重新写计算加减乘除的方法了来供计算器委托来使用。这时候我们就想到了匿名方法。用匿名方法就不需要再单独写加减乘除这些方法了,只需要在匿名方法的方法体内实现这些逻辑就好了。例子如下:

delegate int calculator(int x, int y); //委托类型
static void Main(string[] args)
{//创建委托对象(确定与哪些方法进行绑定),委托实例名=new 委托名(某个类的方法,本例与加法向绑定calculator Adding =delegate( int x, int y){ return x+y; };calculator Moveing = delegate(int x, int y){ return x - y; };calculator Multiply = delegate(int x, int y) { return x * y; };calculator Divide = delegate(int x, int y) { return x / y; };Adding(4, 4);//8Moveing(4, 4);//0Multiply(4, 4);//16Divide(4, 4);//1
}

event是什么

我们可以把事件编程简单地分成两个部分:事件发生的类(发布器:publisher)和事件接收处理的类(订阅器:subscriber)。事件使用 发布-订阅(publisher-subscriber) 模型。事件发生的类就是说在这个类中触发了一个事件,但这个类并不知道哪个个对象或方法将会加收到并处理它触发的事件。所需要的是在发送方和接收方之间存在一个媒介。这个媒介在.NET Framework中就是委托(delegate)。在事件接收处理的类中,我们需要有一个处理事件的方法。

public class A
{public delegate void EventHandler(object sender);public event EventHandler a;public void Run(){Console.WriteLine("Trigger an event.");a(this);}
}class B
{public B(A a){a.a += new A.EventHandler(this.b);}private void b(object sender){Console.WriteLine("Received and handled an event." );Console.Read();}
}

event和delegate的差异

event是一种特殊的delegate。同为public类型,对于delegate,我们在定义它的类外,不仅可以采用 += 和-=的运算符号,还可随时调用;但是对于event,在类外只能采用 += 和-=的运算符号,不能调用,也就是event把它本身的invoke函数和括号调用的函数变成拥有这个event类的私有函数。

event只能被本类调用,其他的即使该类的派生类也不行,如果非要调用类内部的event,可以先声明一个方法,在该方法中调用event。

Action

Action是一个泛型的委托,其内部即使用delegate去实现,当普通的delegate定义的参数与Action个数、类型一致时,两者实现的功能是一样的。只是Action的方式更加简洁、规范。

Action与delegate更重要的一个区别在于泛型,即Action的内部使用了泛型+委托,且泛型的方法的参数个数可扩展到16个。微软.net corefx中定义的Action内部代码如下:

namespace System
{[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")]public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9);[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")]public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10);[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")]public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11);[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")]public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12);[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")]public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13);[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")]public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14);[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")]public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15);[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")]public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16);
}

c#的delegate和event相关推荐

  1. c# 带返回值的action_C#知识点讲解之C#delegate、event、Action、EventHandler的使用和区别...

    今天来讲一讲<C#delegate.event.Action.EventHandler的使用和区别> 目录 所以,event应运而生 所以,EventHandler应运而生 所以,Acti ...

  2. C#中的delegate和event (转)

    C#中的delegate和event 在基于Windows平台的程序设计中,事件(event)是一个很重要的概念.因为在几乎所有的Windows应用程序中,都会涉及大量的异步调用,比如响应点击按钮.处 ...

  3. C#中的delegate和event作用及区别

    Delegate delegate是C#中很重要的语法. 委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用. 声明了delegate的属性都会继承自Delegate类. 使用单播委托类 ...

  4. C# delegate、event、Action、Func使用案例解析

    C# 中 delegate.event.Action.Func使用案例解析 一:delegate与event配合使用 public static class Evt_Test{public stati ...

  5. msdn 上的关于delegate和event的一个例子,理解后加点评论

    using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace Event ...

  6. C#中Delegate和Event以及它们的区别(转载)

    一.Delegate委托可以理解为一个方法签名. 可以将方法作为另外一个方法的参数带入其中进行运算.在C#中我们有三种方式去创建委托,分别如下: public delegate void Print( ...

  7. C# delegate and event

    真是的,这个东西看了不用,一段时间后就忘了. delegate相当于函数指针,可以把其他函数加入到delegate实体中,这样用调用delegate实体来实现对所加入函数的调用. 比如 public ...

  8. C# 委托(Delegate) 事件(Event)应用详解

    委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每 ...

  9. delegate和event(转载too)

    从 前,在南方一块奇异的土地上,有个工人名叫彼得,他非常勤奋,对他的老板总是百依百顺.但是他的老板是个吝啬的人,从不信任别人,坚决要求随时知道彼得的 工作进度,以防止他偷懒.但是彼得又不想让老板呆在他 ...

  10. C# delegate与event,委托与事件

    文章目录 委托 示例 事件 实例 博主写作不容易,孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 委托和事件是C#中两个比较复杂的概念,这篇文章介绍两个概念与基本用法,让大家理解C#中的事件处理机 ...

最新文章

  1. 西藏打造云计算数据中心 2020年中国数据中心规模约2000亿元
  2. 电脑上的c语言程序打不开,电脑软件打不开常用处理方法
  3. 【小题目】输入三个数字表示年月日,输出这一天在这一年是第几天
  4. 2、AD工程创建步骤
  5. LeetCode 1237. 找出给定方程的正整数解
  6. 搜索引擎核心技术与算法 —— 词项词典与倒排索引优化
  7. filename: core/loader.php,使用第三方包后出现的这个错误,你们都遇到过吗?
  8. linux系统修改为静态IP地址
  9. 2021年考研经验分享(初试408分)
  10. cmdline-tools component is missing
  11. 开源项目——小Q聊天机器人V1.2
  12. 华宇平台负责人_华宇平台负责人
  13. 在机顶盒上被移除adb后恢复的办法
  14. 2021年计算机类 人工智能 软件SCI一区期刊
  15. MySQL优化之Explain
  16. Pytorch | 报错The given NumPy array is not writeable,and PyTorch does not support non-writeable tensor
  17. matlab 柱面投影,图像拼接(不投影到柱面)(渐入渐出融合) matlab程序
  18. #10049. 「一本通 2.3 例 1」Phone List
  19. Quidem repellendus similique reiciendis quas.ExTable blond sorte bcepturi voluptatibus ipsa aliquid.
  20. 缺点 霍夫圆_基于机器视觉的磁环表面缺陷检测研究

热门文章

  1. Java、Rectangle类
  2. 微信公众号开发上传图文素材带有卡片小程序报错:errcode=45166,errmsg = invalid content hint...
  3. D3.js 入门教程1 基础 详细 一步步来
  4. 你真的知道什么是 Python「命名空间」吗?
  5. 超声心动图评价左室舒张功能的建议:来自美国超声心动图学会和欧洲心血管成像协会的更新
  6. charles安装与使用
  7. Centos 6.3 install reiserFS support
  8. uwsgi django nginx多站点 pyvenv virutalvenv python 3 django 2这些限制下,如何让uwsgi跑起来?...
  9. Translating Embeddings for Modeling Multi-relational Data 笔记(基于Translation提出了TransE)
  10. python之子弹移动