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/ ...
随机推荐
- 向treeview中加载数据
1.获取树节点的值,用事件AfterSelect加载(id值的获取,用name来获取) 2.双击treeview控件得到 private void treeView1_AfterSelect(obje ...
- 正则表达式之 \b
引用网上一段话: \b 是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处.虽然通常英文的单词是由空格,标点符号或者换行来 ...
- Java高并发--缓存
Java高并发--缓存 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 在下图中每一个部分都可以使用缓存的技术. 缓存的特征 缓存命中:直接通过缓存获取到数据 命中率: ...
- Spring Data REST API集成Springfox、Swagger
原文: Documenting a Spring Data REST API with Springfox and Swagger 使用Spring Date REST,你可以迅速为Spring Da ...
- thinkphp 3.2 去除调试模式后报错,怎么解决
1.案例一: 最近用ThinkPHP开发一个项目,本地开发测试完成上传到服务器后,第一次打开正常,再刷新页面时就出现 “页面调试错误,无法找开页面,请重试”的错误. 我就郁闷啦,明明本地设置defin ...
- elementUI 设置input的只读或禁用
只读:readonly 在data里定义:readonly: true, 然后在input框里加上readonly就可以了. 禁用:disabled 在data里定义:edit: true, 然后在i ...
- android笔试题一
1.Android DVM(Dalvik VM)的进程和Linux的进程, 应用程序的进程是同一个概念吗? DVM(Dalvik VM)指dalvik的虚拟机.每一个Android应用程序都在它自己的 ...
- <API自动化测试>Centos-Newman
一.介绍: 在测试和开发中,有一款API测试工具一直占据着武林盟主的地位,那就是声名远播的Google公司的Postman. Postman原先是Chrome浏览器的一个插件,后面发展成了一个应用程序 ...
- wap2app(七)-- 长按保存图片
用Hbuilder打包网站,在打包好的app中是无法像网站那样直接使用长按图片保存的功能的,需要在网站里对来自wap2app进行单独处理,接下来介绍一下如何在Hbuilder打包后的app里实现长按图 ...
- float、double、BigDecimal的一些精度问题
float f = 280.8f;System.out.println(f*100);结果是什么?结果是:28080.0f(我是这么想的)实际结果是:28079.998 既然float处理有问题换do ...