委托类型

委托时一种特殊的类型,它用来保存方法的地址,这样我们很方便的调用方法,像变量一样传递,回调。

C++中的函数指针也是保存方法的地址,但是有一点不一样的是定义委托的时候就知道了它里面可以保存什么样的方法,而函数指针就没有这些

所以委托相对更明确一点,更安全一点。

 

public delegate void MyDelegate(int x) //这样的委托类型表示,该委托可以用来保存无返回值,切参数为int类型的方法

 

当然当我们写出上面那段代码的时候,实际上编译器做了其他一些事,实际可能定义像下面这样的

public class MyDelegate:system.MusticastDelegate{public MyDelegate(object obj,IntPtr method){……} //obj保存,方法的实例(静态方法则null),IntPtr保存方法地址public virtual void Invoke(int value){……}  //调用方法
……//省略

}

MusticastDelegate 内部有

_target字段 //保存当前委托保存方法,要使用的实例

_methodPtr字段 //保存委托保存的方法

_invoalcationList字段 //保存委托链(如果只有一个委托就Null)

public class MyClass{Public void Method1(int y){}public static void Method2(int y){}}

1、当我们使用MyDelegate del = new MyDelegate(new MyClass().Method1);

那么del对象中_target则保存了new MyClass()实例

_methodPtr保存了Method1地址

_invoalcationList此时为NULL,因为只有一个委托

当我们调用del(10),实际上是调用del.Invoke(10) 然后Invoke执行的是_target._methodPtr(10)

 

2、当我们使用MyDelegate del2 = new MyDelegate(MyClass.Method2);

那么del2对象中_target则保存了NULL,因为是保存静态方法,所以没有对象

_methodPtr保存了Method2地址

_invoalcationList此时为NULL,因为只有一个委托

当我们调用del2(10),实际上是调用del2.Invoke(10) 然后Invoke执行的是_target._methodPtr(10) 因为_target是null,所以实际是MyClass._methodPtr

 

3、del+=del2

那么实际是执行了del = Delegate.Combine(del,del2)

内部是创建了_invoalcationList数组,里面包含有两个委托del,del2

_target =null

_methodPtr =Method2地址

当我们调用del(10)时发现_invoalcationList里面有两个委托,则循环这个数组,分别调用每个委托

转载于:https://www.cnblogs.com/fuyun2000/p/3439994.html

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

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

相关文章

python 管道 异步读取 select_python之异步select解析

一、I/O多路复用I/O的含义:在计算机领域常说的IO包括磁盘IO和网络IO,我们所说的IO复用主要是指网络IO;在Linux中一切皆文件,因此网络IO也经常用文件描述符FD来表示。复用的含义:在通信领域中为了充分利用网络连接的物理…

C语言 文件

1. 需要了解的概念 需要理解的知识点包括:数据流、缓冲区、文件类型、文件存取方式 1.1 数据流: 指程序与数据的交互是以流的形式进行的。进行C语言文件的存取时,都会先进行“打开文件”操作,这个操作就是在打开数据流&#xff0…

WINCE BSP中source文件中的宏定义

在WinCE BSP中会看到很多sources文件,一般会和源代码放在同一个目录,当然不是绝对的。这些sources文件里面就是定义了一些宏,主要用于告诉Build.exe在编译源代码的时候应该如何编译和链接,告诉Nmake.exe如何编译源代码以及最后生成…

java递增_java-8 – 如何按组递增

有一个表,现在添加一个新列 – sort_num int default 0id level sort_num1 1 02 1 03 2 04 2 05 2 06 3 07 3 08 3 09 3 0现在我想设置如下的sort_num值id level sort_num1 1 12 1 23 2 14 2 25 2 36 3 17 3 28 3 39 3 4上面的Java代码实现要求是int sortNum 0;int currentLev…

解决WCF接口无法传递object参数的问题

在某些场合中,我们需要提供以object为参数的方法。不过在WCF中,由于需要序列化与反序列化,因此它要求所有WCF传递的参数类型都是已知的,无法传递object这种未知类型。即使用了KnownType来标记自定义对象,也无法调用。以…

wince中的BSP工程的相关文件介绍

一.pbcxml分析 每一个BSP都有一个工程文件&#xff0c;比如MyBSP.pbcxml&#xff0c;里面描述了BSP的信息。下面就来介绍一下BSP的pbcxml文件。 文件的大致格式应该是这样的&#xff1a; <CatalogFile …> <FileInformation ….> …. </FileInformation>…

calcite连接mysql_使用Calcite做Sql语法解析

Flink SQL中使用Calcite作为sql语法解析、校验、优化工具&#xff0c;本篇是实操篇&#xff0c;介绍一下calcite做sql语法解析使用方式。sql经过calcite解析之后&#xff0c;得到一棵抽象语法树&#xff0c;也就是我们说的AST&#xff0c;这棵语法树是由不同的节点组成&#xf…

ASP.NET Web Froms开发模式中实现程序集的延迟加载

延迟加载是一个很大的诱惑&#xff0c;可以达到一些比较好的效果&#xff0c;比如&#xff1a; 1、在实体框架中&#xff0c;由于关联数据的数量和使用时机是不确定的&#xff0c;通过延迟加载&#xff0c;仅在使用的时候去执行关联数据的查询操作&#xff0c;减少无谓的数据查…

java的国际化怎么用_Java有关国际化使用实例

1package com.commons.dormant.resources;import java.util.Locale;import java.util.ResourceBundle;/*** Commons-Resources没有提供已经发布的jar包&#xff0c;所以没有相关的实例&#xff0c;* 本例是java自带的和Resources功能相似的例子。主要是实现国际化* author chai…

jQuery之ajax的跨域获取数据

如果获取的数据文件存放在远程服务器上&#xff08;域名不同&#xff0c;也就是跨域获取数据&#xff09;&#xff0c;则需要使用jsonp类型。使用这种类型的话&#xff0c;会创建一个查询字符串参数 callback? &#xff0c;这个参数会加在请求的URL后面。服务器端应当在JSON数…

两个结构体ifconf和ifreq

用ioctl获得本地ip地址时要用到两个结构体ifconf和ifreq&#xff0c;它们对于大多数人 来说都是比较陌生的&#xff0c;这里给大家一种比较简单的理解方法&#xff0c;当然只一种帮助 理解的方法&#xff0c;在描述中可能会有一些地方与真实定义有所出入&#xff0c;仅供参考. …

java判断tcp是否阻塞_connect()调用在TCP堆栈中是非阻塞的(java)是什么意思

我有一个关于TCP套接字实现的connect()调用的问题.对于connect()调用来说,非阻塞是什么意思. connect()调用通过发送syn,等待SYNACK然后发送ACK,与其他一些套接字进行三次握手.如果连接成功,connect()调用也返回true,否则返回false.如果调用是非阻塞的,那么我猜这意味着连接应该…

php 换行 PHP_EOL变量

一个小小的换行&#xff0c;其实在不同的平台有着不同的实现&#xff0c;为什么要这样&#xff0c;可以是世界是多样的。 本来在unix世界换行就用/n来代替&#xff0c;但是windows为了体现他的不同&#xff0c;就用/r/n&#xff0c;更有意思的是在mac中用/r 因此unix系列用 /n …

alarm项目bug

1. rt5350上运行的soap服务器程序&#xff0c;响应时间过长 原因&#xff1a;打开了soap的调试日志&#xff0c;soap的调试日志是保存的文件中的。所以在rt5350上文件读写速度太慢造成的。因此 在编译的时候不能加-DDEBUG 2. 串口一次read调用读到两帧完整的报文测&#xff0c…

java 读取图片给 matlab_如何将MATLAB图像处理程序转换为java?

将Matlab代码转换为Java代码有几个一般的缺陷.我将Matlab转换成C代码,所以我的建议来自于这些经验.>如果你在Matlab中使用for循环,一般来说,你做错了.添加矩阵(图像等)是相当简单的&#xff1a;a b c;不管图像的大小.过滤也是一个相当简单的调用&#xff1a;a imfilter(‘…

C++ 一键关闭屏幕

Demo下载地址&#xff1a;http://pan.baidu.com/s/1vN4wF #include <windows.h> #include "resource.h"LRESULT CALLBACK WindowProc( HWND hwnd, // handle to windowUINT uMsg, // message identifierWPARAM wParam, // first message parameterL…

django 学习 (一)

1. 下载Django 1.3.3 https://pypi.python.org/simple/django/ 2. 验证下载的文件 md5sum 3. 解压安装 python setup.py install 4. 在python的shell里验证是否安装成功 import django 5. 建立第一个django工程 django-admin.py startproject firstproject 6. 修改新建的工…

炸金花比牌规则java_陈陈来给你们炸金花的简易纸牌规则教学与心态指导

原标题&#xff1a;陈陈来给你们炸金花的简易纸牌规则教学与心态指导炸金花是在全国广泛流传的一种4-7人能同时进行的民间纸牌游戏。游戏使用一副扑克牌&#xff0c;去掉大小王&#xff0c;共52张牌&#xff0c;以手中的三张牌比输赢&#xff0c;游戏过程中需要考验玩家的胆略和…

EBS业务学习之应付INVOICE类型

INVOICE类型 类 型 描 述 标准INVOICE 是指由于采购货物或接受劳务&#xff0c;从供应商处取得的INVOICE &#xff08;标准INVOICE&#xff0c;既可以和订单匹配&#xff0c;也可以不匹配&#xff09; 贷项通知单 是指供应商对已开INVOICE的货物或劳务&…

django 学习 (二) 模板

1. 在应用的目录下创建templates目录&#xff0c;并创建一个html文件&#xff0c;比如my.html 2. 修改应用的views.py文件&#xff0c;将my.html文件反馈给请求&#xff0c;有以下几种写法 1) from django.template import loader, Context from django.http import HttpRespo…