DoNet:浅淡对delegate的理解
1 前言
C#的相关文档,MSDN上其实已经很详细了,关于delegate的使用可以参
考MSDN上的文档https://msdn.microsoft.com/zh-cn/library/900fyy8e.aspx
2 官方示例
委托类型的声明与方法签名相似, 有一个返回值和任意数目任意类型的参数:
public delegate void TestDelegate(string message);
public delegate int TestDelegate(MyType m, long num);
delegate 是一种可用于封装命名或匿名方法的引用类型。 委托类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。 有关委托的应用,请参见委托和泛型委托。
备注
委托是事件的基础。通过将委托与命名方法或匿名方法关联,可以实例化委托。 有关更多信息,请参见命名方法和匿名方法。必须使用具有兼容返回类型和输入参数的方法或 lambda 表达式实例化委托。 有关方法签名中允许的差异程度的更多信息,请参见委托中的变体(C# 和 Visual Basic)。 为了与匿名方法一起使用,委托和与之关联的代码必须一起声明。 本节讨论这两种实例化委托的方法。
C#示例
// Declare delegate -- defines required signature:
delegate double MathAction(double num);
class DelegateTest
{
// Regular method that matches signature:
static double Double(double input)
{
return input * 2;
}
static void Main()
{
// Instantiate delegate with named method:
MathAction ma = Double;
// Invoke delegate ma:
double multByTwo = ma(4.5);
Console.WriteLine("multByTwo: {0}", multByTwo);
// Instantiate delegate with anonymous method:
MathAction ma2 = delegate(double input)
{
return input * input;
};
double square = ma2(5);
Console.WriteLine("square: {0}", square);
// Instantiate delegate with lambda expression
MathAction ma3 = s => s * s * s;
double cube = ma3(4.375);
Console.WriteLine("cube: {0}", cube);
}
// Output:
// multByTwo: 9
// square: 25
// cube: 83.740234375
}
3 个人见解
3.1 C语言函数指针
以下代码简单实现了C语言中的函数指针
#include <iostream>
using namespace std;
//this is likely to "delegate"
typedef void(*func)(void);
//this is likely to "event"
func event;
void CallBack()
{
cout << "Callback start running" << endl;
}
int main()
{
event= CallBack;
event();
}
一、typedef void(*func)(void); 定义了一个返回为void,传入参数为void的函数指针类型,类似于C#中的delegate;
二、func enent; 定义了一个名为event的函数指针变量;
三、主函数中将回调函数CallBack的地址赋值给event这个变量,event();即执行回调函数 CallBack()。
运行结果
3.2 C#个人示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CsharpCallback
{
class Program
{
public delegate void Handler(int i);
public event Handler EventRegister;
void CallBack(int i)
{
Console.WriteLine("Callback is running " + i);
}
void CallTest(int i)
{
Console.WriteLine("Calltest is running " + i);
}
void RegisetCallback()
{
EventRegister += new Handler(CallBack);
EventRegister += new Handler(CallTest);
}
static void Main(string[] args)
{
Program test = new Program();
test.RegisetCallback();
for (int i=0; i<100; i++)
{
if(i == 50)
{
test.EventRegister(i);
}
}
}
}
}
程序分析:
一、 public delegate void Handler(int i); 这里申明了一个名为Handler 委托,当然类似于C中的函数指针,可以参考C代码的示例加以理解,同样的,对于回调函数类型需要和委托相同;
二、public event Handler EventRegister; 这里我理解为定义了一个函数指针的变量(这个理解可能欠妥当),event的具体使用,可以参考官方文档https://msdn.microsoft.com/zh-cn/library/8627sbea.aspx;
三、RegisetCallback() 函数则将回调函数的指针赋值给指针变量。
程序运行结果:
4 总结
粗浅的认识了一下C#中的delegate和event的简单用法,并将其与C++中的函数指针做了对比,发现存在相似之处,event的详细使用可以在MSDN上参考官方文档,这方面做的很不错,由于作者水平和能力有限,文中必有错误或者不恰当处,请各位多多指教
DoNet:浅淡对delegate的理解的更多相关文章
- 浅淡fhq_Treap
浅淡 \(fhq\_Treap\) 前言 fhq_Treap \(yyds\)! \(sto\ FHQ\ orz\) 机房大佬们都打的 \(Splay\) 只有蒟蒻打的 \(fhq\) (防火墙)(范 ...
- 浅淡Webservice、WSDL三种服务访问的方式(附案例)
Webservice Webservice是使应用程序以与平台和编程语言无关的方式进行相互通信技术. eg:站点提供访问的数据接口:新浪微博.淘宝. 官方解释:它是一种构建应用程序的普遍模型,可以在任 ...
- 浅谈 Attention 机制的理解
什么是注意力机制? 注意力机制模仿了生物观察行为的内部过程,即一种将内部经验和外部感觉对齐从而增加部分区域的观察精细度的机制.例如人的视觉在处理一张图片时,会通过快速扫描全局图像,获得需要重点关注的目 ...
- 浅谈-对modbus的理解
浅谈-对modbus的理解 一.简介 Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准.1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP ...
- 委托学习总结(一)浅谈对C#委托理解
初入社会,对于我这个初级程序员来说要学的东西实在太多了,公司最近在做一个winform框架开发的桌面应用程序,众所周知,winform也好,webform也好,里面随处可见的事件驱动,有事件,当然也少 ...
- 浅谈Js原型的理解
一.js中的原型毫无疑问一个难点,学习如果不深入很容易就晕了! 在参考了多方面的资料后,发现解释都太过专业,对于很多还没有接触过面向对象 语言的小白来说,有理解不了里面的专有名词!如果你没 ...
- 浅淡HTML5移动Web开发
说实话,我们这次开发移动端的项目,整个项目组的人都是第一次,最初立项的时候为是选择native app和web app还争论了一番,最后综合考虑,我们选择了web(我们选择了h5)开发.但从这两种开发 ...
- 对iOS中Delegate的理解
首先 协议protocol 和委托delegate 是两个完全不同的概念 放在一起说 是因为我们总是在同一个头文件里看到它们: 首先解释一下什么是委托 :举个例子 ,我工作的时候给你打电话,让你帮我 ...
- js的深层克隆和浅层克隆代码和理解
<script> //判断是不是原始值 //判断是数组还是对象 //建立相应的数组或对象 var obj={ name:'辣鸡', sex:'male', card:['laobi','f ...
随机推荐
- net core天马行空系列:降低net core门槛,数据库操作和http访问仅需写接口,实现类由框架动态生成
引文 hi,大家好,我是三合.不知各位有没有想过,如果能把数据库操作和http访问都统一封装成接口(interface)的形式, 然后接口对应的实现类由框架去自动生成,那么必然能大大降低工作量,因 ...
- C# WCF 之优势及特性
Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台. 整合了原有的windows通讯的 . ...
- php中垃圾回收机制
php中垃圾回收机制 我们可能在开发中经常会听到gc,是的gc就是垃圾回收容器,全称Garbage Collection. 此篇文章中“垃圾”的概念:如果一个变量容器能被减少到0,说明他就已经没有被引 ...
- web--ajax--json
案例: 其中,用eval()解析的话,如果json有一些代码,如:{"age":"alert(你好)"},他也会帮你实行,而JOSN.parse();则会自动报 ...
- php数组gbk和utf8的相互转化
GBK转换成UFT-8用iconv()转化效率没有mb_convert_encoding()效率高eval() var_export() 把数组整体转化,如有一些特殊字符的话,可以用str_repla ...
- 2019-2020-20199303《Linux内核原理与分析》第四周作业
构造一个简单的Linux内核 Linux是一种开源电脑操作系统内核,它是一个用C语言写成.主要子系统: 1.系统调用接口 2.进程管理 3.内存管理 4.虚拟文件系统 qemu是一个开源模拟处理器,在 ...
- Data Flow Diagram with Examples - Customer Service System
Data Flow Diagram with Examples - Customer Service System Data Flow Diagram (DFD) provides a visual ...
- 数据挖掘入门系列教程(十一)之keras入门使用以及构建DNN网络识别MNIST
简介 在上一篇博客:数据挖掘入门系列教程(十点五)之DNN介绍及公式推导中,详细的介绍了DNN,并对其进行了公式推导.本来这篇博客是准备直接介绍CNN的,但是想了一下,觉得还是使用keras构建一个D ...
- 在Spring Boot中加载初始化数据
文章目录 依赖条件 data.sql文件 schema.sql 文件 @sql注解 @SqlConfig 注解 在Spring Boot中加载初始化数据 在Spring Boot中,Spring Bo ...
- Scala的Higher-Kinded类型
Scala的Higher-Kinded类型 Higher-Kinded从字面意思上看是更高级的分类,也就是更高一级的抽象.我们先看个例子. 如果我们要在scala中实现一个对Seq[Int]的sum方 ...