一、我们在使用C#的过程中,不可避免的用到了委托。

委托的本质是什么呢?

从语法上看,委托是对方法的抽象封装,例如:public void print1(),public void print2(),我们可以抽象化,public delegate void Print();用Print p来声明,委托需要实例化和调用,类似于c++中的函数模板;

从功能上看,委托主要是方法的指针,用以方便实现函数的回调、调用(异步等)。

直观上,委托的作用有方法(函数)回调、方法(函数)接收值(listener),方法(函数)多线程调用、传值等等。

本质上,delegate是一个类,同关键字class和interface平级的,这个类中包含方法所属的类实例的地址、方法的地址,以及下个委托的引用(因此委托是链式结构的)。

以下我们以实例展开委托声明、实例化、调用等技巧。

二、委托的声明

C#中借用delegate关键字,C#的编译器一遇到delegate,在翻译C#的时候就被翻译成类似于函数模板的东西。delegate刻意定义在类的内部,也可以定义在外部,和类没有关系。

public delegate void Print();              //无参数,无返回值的委托

public delegate <out string>Print();   //无参数,返回string的委托

public delegate<out string,in string>Print(string str);  //string参数,返回string的委托

.net3.,系统定义了无参和有参的委托Action和Func关键字

public Action  本质就是public delegate void的转定义

public Func    本质是public delegate <out string>

用法:

public Action<string> action;

public Func<string> func;

委托的方法必须在形式上和委托的声明一致

三、委托的赋值

public NoparamDelegate noParam = new NoparamDelegate(doSomething_forNoparamDelegate);    //new 实现

public NoparamDelegate noparam_for_lambd = () =>                                                                            //lambd表达式直接赋值
{
Console.WriteLine("no param,form lambd,test");
};
public NoparamDelegate noparam_for_function = doSomething_function; //方法直接赋值 public static void doSomething_forNoparamDelegate()
{
Console.WriteLine("no param,form test");
} public static void doSomething_function()
{
Console.WriteLine("no param,form function, test");
}

四、委托的调用

//委托调用-普通方法
doSomething();

//委托调用invoke
doSomething?.Invoke();
oneParam?.Invoke("one param,form test");

//异步调用

doSomething?.BeginInvoke(complete, null); //object标识附加信息
IAsyncResult ret = func_oneparam?.BeginInvoke("transmit赋值,异步调用,", null, null); //ret.IsCompleted, ret.AsyncWaitHandle.WaitOne(100)等用于轮询过程
Console.WriteLine("开始其他工作!..");
string strRet = func_oneparam?.EndInvoke(ret);
Console.WriteLine(strRet);

委托的BeginInvoke有两个或三个参数(重载)

param1:string,参数

param2:回调函数,异步方法完成后调用

param3:object形式的附加信息

返回值:IAsyncResult 类型,我们记作ret

ret中有属性IsCompleted和AsyncWaitHandle,可以用以轮询异步方法调用的方法

string strRet = func_oneparam?.EndInvoke(ret);  //在需要的地方获取异步执行结果,如果没执行完,将阻塞调用线程,直至获取结果

五、委托链

对于多个委托方法,.net定义了委托链的概念

Delegate主要定义了Combine(简写+=),Remove(简写-=)等方法

Action delegateSet = null;
delegateSet = (Action)Delegate.Combine(actionChainOne,actionChainTwo);

下面是一段示例代码:

  public class Test
{
public delegate void Print();
Print p;
public void method1()
{
Console.WriteLine("m 1");
}
public void method2()
{
Console.WriteLine("m 2");
} public void method3()
{
Console.WriteLine("m 3");
}
public void method4()
{
Console.WriteLine("m 4");
} public void combine()
{
p += method1;
p += method2;
p += method3;
p += method4;
}
public void run()
{
Delegate[] myDelegates = p.GetInvocationList();
foreach (var myDelegate in myDelegates)
{
Print m1 = (Print)myDelegate;//注意此处需强转
m1.Invoke();
}
}
}
class Program
{
static void Main(string[] args)
{
Test test = new Test();
test.combine();
test.run(); Console.ReadKey();
}
}

有交流沟通,请加群:568055323

C#深度学习の委托深度解析的更多相关文章

  1. 深度学习论文翻译解析(四):Faster R-CNN: Down the rabbit hole of modern object detection

    论文标题:Faster R-CNN: Down the rabbit hole of modern object detection 论文作者:Zhi Tian , Weilin Huang, Ton ...

  2. 深度学习论文翻译解析(五):Siamese Neural Networks for One-shot Image Recognition

    论文标题:Siamese Neural Networks for One-shot Image Recognition 论文作者: Gregory Koch   Richard Zemel Rusla ...

  3. 深度学习论文翻译解析(八):Rich feature hierarchies for accurate object detection and semantic segmentation

    论文标题:Rich feature hierarchies for accurate object detection and semantic segmentation 标题翻译:丰富的特征层次结构 ...

  4. 深度学习论文翻译解析(九):Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

    论文标题:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 标题翻译:用于视觉识别的深度卷积神 ...

  5. 深度学习论文翻译解析(十三):Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

    论文标题:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 标题翻译:基于区域提议(Regi ...

  6. 深度学习论文翻译解析(十八):MobileNetV2: Inverted Residuals and Linear Bottlenecks

    论文标题:MobileNetV2: Inverted Residuals and Linear Bottlenecks 论文作者:Mark Sandler Andrew Howard Menglong ...

  7. 学习笔记︱Nvidia DIGITS网页版深度学习框架——深度学习版SPSS

    DIGITS: Deep Learning GPU Training System1,是由英伟达(NVIDIA)公司开发的第一个交互式深度学习GPU训练系统.目的在于整合现有的Deep Learnin ...

  8. 一天搞懂深度学习-训练深度神经网络(DNN)的要点

    前言 这是<一天搞懂深度学习>的第二部分 一.选择合适的损失函数 典型的损失函数有平方误差损失函数和交叉熵损失函数. 交叉熵损失函数: 选择不同的损失函数会有不同的训练效果 二.mini- ...

  9. 【神经网络与深度学习】深度学习实战——caffe windows 下训练自己的网络模型

    1.相关准备 1.1 手写数字数据集 这篇博客上有.jpg格式的图片下载,附带标签信息,有需要的自行下载,博客附带百度云盘下载地址(手写数字.jpg 格式):http://blog.csdn.net/ ...

随机推荐

  1. tomcat域名绑定设置

    域名绑定分为单域名绑定.多域名绑定,配置主要涉及到tomcat目录下conf/server.xml文件 一.单域名绑定 1.修改server.xml 大约105行的内容(不是必须修改,如果只是绑定一个 ...

  2. [日常] DNS解析概述

    DNS DomainNameSystem域名系统,根据域名查出IP地址 1.dig命令可以显示整个查询的过程 root@VM-38-204-ubuntu:~# dig www.sopans.com / ...

  3. 安装PyCharm

    安装包下载 本文以CentOS上PyCharm安装为例来介绍,安装包的下载地址:https://www.jetbrains.com/pycharm/download/ 官网提供了windows,mac ...

  4. Linux服务器配置

    配置ssh: 1. 查看22端口是否监听 netstat -antu | grep :22 2. 安装ssh服务 sudo apt-get install ssh 3. 再次查看22端口 安装apac ...

  5. Cesium-知识点(Viewer)

    Cesium之Viewer的构造(转自:https://blog.csdn.net/zhy905692718/article/details/78865107) Viewer属于Cesium的控件部分 ...

  6. 9.Odoo产品分析 (二) – 商业板块(4) –讨论(1)

    查看Odoo产品分析系列--目录 讨论模块就是一个信息记录和消息提醒的功能,在登录到odoo平台的时候第一个界面就是它:  1. 收件箱 收件箱,登录者的邮箱管理,并显示未读邮件数量:    点击上面 ...

  7. Javascript 对象 - 数学对象

    数学对象 JavaScript中提供了math对象,math对象包含一些常用的属相和方法.Math对象与Array对象.String对象.Data对象不同,没有构造函数,因此不能创建Math对象.可直 ...

  8. p标签内容实现第二行缩进两个字体间距

    p{ word-break:normal; text-indent: -2em; margin-left: 2em;} <p> p标签实现自动换行:p标签实现自动换行:p标签实现自动换行: ...

  9. C#:关于C#4中IEnumerable<out T>的理解

    IEnumerable<out T>这个接口非常常见,它是最基础的泛型集合接口,表示可迭代的项的序列. 但是奇怪的是为什么泛型参数要带一个“out”? 经过一番资料查阅后,发现此“out” ...

  10. git 入门教程之本地和远程仓库的本质

    本地仓库和远程仓库在本质上没有太大区别,只不过一个是本地电脑,一个是远程电脑. 远程仓库不一定非得是 github 那种专门的"中央服务器",甚至局域网的另外一台电脑也可以充当&q ...