梳理delegate相关概念

一、前言

  可能项目规模较小,项目中除了增删改查就只剩下业务流程,以前都没怎么弄明白的东西时间长了就越发的模糊了...

二、使用场景

  MSDN:delegate 是一种可用于封装命名或匿名方法的引用类型。 委托类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。

  1. 匿名方法

    1 static void Main(string[] args)
    2 {
    3     TestAnonymousMethod(delegate(string i) { return Convert.ToInt32(i); });
    4 }
    5
    6 static int TestAnonymousMethod(Func<string, int> func)
    7 {
    8     return func("10");
    9 }
  2. 委托类型

     1 //定义委托类型
     2 delegate bool CompareDelegate(int i, int j);
     3
     4 static void Main(string[] args)
     5 {
     6     //声明对象
     7     //CompareDelegate cd = new CompareDelegate(Compare);
     8     CompareDelegate cd = Compare;
     9     Console.WriteLine(cd(10, 20));
    10
    11     TestDelegate(Compare);
    12 }
    13
    14 //与委托类型签名相同的方法
    15 static bool Compare(int i, int j)
    16 {
    17     return i > j;
    18 }
    19
    20 //委托声明方法形参,将方法以参数传递
    21 static void TestDelegate(CompareDelegate cd)
    22 {
    23     Console.WriteLine(cd(20, 10));
    24 }
  3. event修饰委托(写这篇博客就是为了这一个节点...)
    MSDN:event 关键字用于在发行者类中声明事件。事件是特殊类型的多路广播委托,仅可从声明它们的类或结构(发行者类)中调用。 如果其他类或结构订阅了该事件,则当发行者类引发该事件时,会调用其事件处理程序方法。
    曾今天真的以为delegate与event是同级别的关键词,直到昨天整理资料才恍然大悟,delegate跟event半毛钱关系都没有。delegate相当于关键字class,使用关键字delegate定义委托类型,然后使用委托类型声明委托变量,声明变量时可用event修饰。

     1 class Program
     2 {
     3     delegate bool CompareDelegate(int i, int j);
     4
     5     static void Main(string[] args)
     6     {
     7         Publisher p = new Publisher();
     8         p.Sample = Method;
     9         p.Sample += Method; //注册第二个方法
    10
    11         //event仅可在声明它的类或结构使用=注册事件,防止外部注册事件时不小心覆盖了其他地方注册的事件方法
    12         p.SampleEvent += Method;
    13         p.RaiseSampleEvent();
    14
    15         //event修饰后的委托只能在声明它的类或结构中调用,没有event修饰的的委托可在外部调用
    16         p.Sample("外部测试调用");
    17     }
    18
    19     static void Method(string msg)
    20     {
    21         Console.WriteLine(msg);
    22     }
    23 }
    24
    25 public class Publisher
    26 {
    27     public delegate void SampleEventHandler(string msg);
    28
    29     //不使用event修饰
    30     public SampleEventHandler Sample;
    31
    32     //使用event修饰
    33     public event SampleEventHandler SampleEvent;
    34
    35     public virtual void RaiseSampleEvent()
    36     {
    37         if (Sample != null)
    38         {
    39             Sample("不使用event修饰");
    40         }
    41
    42         if (SampleEvent != null)
    43         {
    44             SampleEvent("使用event修饰");
    45         }
    46     }
    47 }
  4. 异步委托

    BeginInvoke 方法启动异步调用。该方法具有与你要异步执行的方法相同的参数,另加两个可选参数。第一个参数是一个AsyncCallback委托,此委托引用在异步调用完成时要调用的方法。第二个参数是一个用户定义的对象,该对象将信息传递到回调方法。 BeginInvoke 将立即返回,而不会等待异步调用完成。 BeginInvoke 返回可用于监视异步调用的进度的 IAsyncResult。
    EndInvoke 方法用于检索异步调用的结果。它可以在调用 BeginInvoke 之后的任意时间调用。如果异步调用尚未完成,那么EndInvoke将阻止调用线程,直到完成异步调用。EndInvoke的参数包括您需要异步执行的方法的out和ref 参数以及由 IAsyncResult 返回的 BeginInvoke。

     1 static void Main(string[] args)
     2 {
     3     Console.WriteLine("主线程开始");
     4     Action<string> act = msg =>
     5     {
     6         Thread.Sleep(1000);
     7         Console.WriteLine(msg);
     8     };
     9     //异步调用
    10     IAsyncResult result = act.BeginInvoke("委托方法", null, null);
    11
    12     Console.WriteLine("主线程。。。");
    13
    14     //异步调用完成返回
    15     act.EndInvoke(result);
    16
    17     Console.WriteLine("主线程结束");
    18 }

      

  5.  1 static void Main(string[] args)
     2 {
     3     Console.WriteLine("主线程开始");
     4     Action<string> act = msg =>
     5     {
     6         Thread.Sleep(1000);
     7         Console.WriteLine(msg);
     8     };
     9
    10     //异步调用,不阻塞进程
    11     act.BeginInvoke("委托方法", ar =>
    12     {
    13         Action<string> handler = (Action<string>)((AsyncResult)ar).AsyncDelegate;
    14         handler.EndInvoke(ar);
    15         Console.WriteLine(ar.AsyncState);
    16     }, "AsyncState:OK");
    17     Console.WriteLine("主线程结束");
    18     Thread.Sleep(2000);
    19 }

      

时间: 2024-10-15 10:57:48

梳理delegate相关概念的相关文章

[白话解析] 带你一起梳理Word2vec相关概念

[白话解析] 带你一起梳理Word2vec相关概念 0x00 摘要 本文将尽量使用易懂的方式,尽可能不涉及数学公式,而是从整体的思路上来说,运用感性直觉的思考来帮大家梳理Word2vec相关概念. 0x01 导读 1. 原委 本来只是想写Word2vec,没想到一个个知识点梳理下来,反而Word2vec本身只占据了一小部分.所以干脆就把文章的重点放在梳理相关概念上,这样大家可以更好的理解Word2vec. 为了讨论Word2vec,我们需要掌握(或者暂且当做已知)的先决知识点有: 独热编码 /

js模块,类,继承,命名空间,私有属性等相关概念梳理

js确切的说是一种基于对象的语言,和纯面向对象的语言(比如as)稍微有点区别,js中没有类的概念.虽然有继承但是基于原型的继承.随着前段越来越受重视,jser们利用js的一些特性他们制造出了和纯面向对象一样好玩的东西.下面就js中一些概念进行概述,很多东西都是来自博客园的一些大牛,我写这篇文章主要想拿as和js做对比来讲,以方便as像转js的程序员们.本片文章涉及的概念有,模块,类,继承,私有属性和公开属性. 1.模块大家写as的时候都知道,as里面是有类的概念,每次生成一个类,系统中都会多一个

iOS 面试常见问题最全梳理

序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态平衡.矫情一下,言归正传,我奉献一下,为iOS应聘者梳理一下面试题,希望能助一臂之力! OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装.继承.多态.它既具有静态语言的特性(如C++),又有动态语言的效率(动态绑定.动态加载等).总体来讲,OC确实是一门不错的编程语言,

iOS证书相关概念详解

关于开发证书配置(Certificates&Identifiers&Provisioning Profiles),相信做iOS开发的同学没少被折腾,本文将对相关概念做个系统的梳理. 在进行iOS证书申请之前,假设你使用过Apple设备且注册过Apple ID.首先,必须加入苹果开发者计划(Enrollin iOS Developer Program to become a member),分为Individual和Company/Organization两种类型. 下文主要基于个人开发者账

iOS面试必看,最全梳理

http://www.cocoachina.com/ios/20160323/15770.html 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态平衡.矫情一下,言归正传,我奉献一下,为iOS应聘者梳理一下面试题,希望能助一臂之力! OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装.继承.多态.它既具有静态语言的特

ASP.NET知识重新梳理(三)------C#基础语法

C#基础语法:1.基本语法:无论代码中是否有空格,回车符,tab字符(统称为空白字符),C#编译器都不考虑这些字符: C#字符由一系列语句组成,每个语句由一个分号来结束: C#是一个块结构的语言,所有的语句都是代码块的一部分,这些块用花括号来界定("{"和"}"): C#中的注释:标记注释/*...*/ 单行注释//... 单行注释/// (可以配置VS,在编译项目时,提取这些注释后面的文本,创建一个特殊格式的文本文件,该文件可用于 创建文档说明书): C#代码是区

c#知识梳理

转:http://www.cnblogs.com/zhouzhou-aspnet/articles/2591596.html 本文是一个菜鸟所写,本文面向的人群就是像我这样的小菜鸟,工作一年也辛辛苦苦学习了一年,一直没有机会梳理一下自己的知识,最近花了一些时间整理了一些C#基础知识,也算是对过去的一年做个回顾把~ 文章有点长,请自带瓜子和茶吧,请看下面C#基础知识简单架构图,不可能100%的全面,请见谅啊... 1.值类型和引用类型 1.1堆和栈 简单的说值类型存放在堆栈上面,引用类型的数据存放

Spark+hadoop+mllib及相关概念与操作笔记

Spark+hadoop+mllib及相关概念与操作笔记 作者: lw 版本: 0.1 时间: 2016-07-18 1.调研相关注意事项 a) 理解调研 调研的意义在于了解当前情况,挖掘潜在的问题,解决存在的疑问,并得到相应的方案. b) 调研流程 首先明确和梳理现有的疑问是什么,要通过调研解决什么问题,然后再去做调研,发现问题,再解决问题. c) 调研成果 最终需要得到结论与方案,以及详尽的论证理由,让别人信服. d) 书写格式 版本与作者以及时间可以以表格的形式,整齐明了. 结论简洁明了,

小兵 浅谈C#委托&lt;delegate&gt;

最近处于面试找工作的阶段,面试中遇到这个问题已经多次,一直想了解,就趁这个机会好好梳理一下啊. 当提及委托,大多数人第一印象是它相当于C++的函数指针,可以将方法作为参数进行传递,也可以达到函数回调的作用. 委托例子:其实在生活中也有很多这样的例子,例如我们打官司,首先应该找到律师,委托律师去帮我们打官司,这就是委托.在程序中我们可以针对这个例子这样写: 1.首先定义一个委托:public delegate void Lawyer(string matter)   //相当于律师这个角色 2.再