C#深度学习の委托深度解析
一、我们在使用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#深度学习の委托深度解析的更多相关文章
- 深度学习论文翻译解析(四):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 ...
- 深度学习论文翻译解析(五):Siamese Neural Networks for One-shot Image Recognition
论文标题:Siamese Neural Networks for One-shot Image Recognition 论文作者: Gregory Koch Richard Zemel Rusla ...
- 深度学习论文翻译解析(八):Rich feature hierarchies for accurate object detection and semantic segmentation
论文标题:Rich feature hierarchies for accurate object detection and semantic segmentation 标题翻译:丰富的特征层次结构 ...
- 深度学习论文翻译解析(九):Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
论文标题:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 标题翻译:用于视觉识别的深度卷积神 ...
- 深度学习论文翻译解析(十三):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 ...
- 深度学习论文翻译解析(十八):MobileNetV2: Inverted Residuals and Linear Bottlenecks
论文标题:MobileNetV2: Inverted Residuals and Linear Bottlenecks 论文作者:Mark Sandler Andrew Howard Menglong ...
- 学习笔记︱Nvidia DIGITS网页版深度学习框架——深度学习版SPSS
DIGITS: Deep Learning GPU Training System1,是由英伟达(NVIDIA)公司开发的第一个交互式深度学习GPU训练系统.目的在于整合现有的Deep Learnin ...
- 一天搞懂深度学习-训练深度神经网络(DNN)的要点
前言 这是<一天搞懂深度学习>的第二部分 一.选择合适的损失函数 典型的损失函数有平方误差损失函数和交叉熵损失函数. 交叉熵损失函数: 选择不同的损失函数会有不同的训练效果 二.mini- ...
- 【神经网络与深度学习】深度学习实战——caffe windows 下训练自己的网络模型
1.相关准备 1.1 手写数字数据集 这篇博客上有.jpg格式的图片下载,附带标签信息,有需要的自行下载,博客附带百度云盘下载地址(手写数字.jpg 格式):http://blog.csdn.net/ ...
随机推荐
- mysql Unknown error 1054
mysql查询错误 Unknown error 1054 错误原因:字段名字不对应 解决方案:一一比对字段名称,令实体字段名称与数据库字段对应或者与你的sql语句中的别名对应起来
- EF(EntityFramework) 插入或更新数据报错
报错信息:Store update, insert, or delete statement affected an unexpected number of rows (0). Entities m ...
- TFS自动记住用户名密码
在使用Team Foundation Server(以下简称TFS) 的时候,先在安装Team Foundation 的机器中新建一个与客户机中的同名的用户名,这样,在Visual Studio 20 ...
- WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件
在WPF中,只有鼠标位置在某个控件上的时候才会触发该控件的鼠标事件.例如,有两个控件都注册了MouseDown和MouseUp事件,在控件1上按下鼠标,不要放开,移动到控件2上再放开.在这个过程中,控 ...
- [日常] nginx与负载均衡策略
upstream mail.sina.net { #upstream的负载均衡,weight是权重,可以根据机器配置定义权重.weigth参数表示权值,权值越高被分配到的几率越大. server we ...
- Java Date类的使用总结
Date类表示特定的瞬间,精确到毫秒. 有2种方法可以创建Date对象(这里不考虑已过时的构造函数) 1.public Date()——分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫 ...
- 【转】消除代码中的 if-else/switch-case
在很多时候,我们代码中会有很多分支,而且分支下面的代码又有一些复杂的逻辑,相信很多人都喜欢用 if-else/switch-case 去实现.做的不好的会直接把实现的代码放在 if-else/swit ...
- learnVUE-note
title: learnVUE-note date: 2018-02-27 15:57:37 tags: categories: 前端技术 --- 本文是自己在学习Vue中的 VUE事件处理 在事件处 ...
- Js中的闭包原理
要了解清楚js中的闭包制机,那么得先了解全局执行环境.块级执行环境.函数执行环境.变量对象.环境栈.作用域链.摧毁执行环境. 全局执行环境 全局执行环境指的是最外层的执行环境.在web中全局执行环境被 ...
- Your local changes to the following files would be overwritten by merge:
在服务器改动之后,用sourcetree提交会产生冲突,解决办法: