delegate

测试 C# delegate 执行效率

元气小坏坏 提交于 2020-02-29 07:02:26
关于delegate的执行效率,我也是偶然间关注的一个问题。我对一个问题提出了自己的解决方案,只不过这个解决方案是使用代理的。同时其他人又提出了直接封装一个类,调用这个类中的封装的方法去解决这个问题。针对我们遇到的问题,我们都一致认为代理是解决我们问题比较合适的方式。但是,他们也提出代理的效率是非常低下的,如果我们使用代理,会影响我们系统的性能。于是我就想:代理的执行效率真的很低吗? 写个测试程序试试呗。 首先写一个简单的代理类,源码如下: 1 public class DelegateT 2 { 3 public delegate int del(int a); 4 private event del DelHandle; 5 public void Reg(del d) 6 { 7 DelHandle = d; 8 } 9 public void UnReg(del d) 10 { 11 DelHandle -= d; 12 } 13 14 public int DoSomething(int a) 15 { 16 //这里可以做一些事情。 17 18 if (DelHandle != null) 19 { 20 return DelHandle(a);//触发事件,调用注册的方法。 21 } 22 else 23 { 24 return 0; 25 } 26 } 27 }

C#事件与委托详解

独自空忆成欢 提交于 2020-02-28 10:28:18
Delegate delegate是C#中的一种类型,它 实际上是一个能够持有 对某个方法的引用 的类 。 与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的引用 。它所实现的功能与C/C++中的函数指针十分相似。它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,delegate有许多函数委托和事件在 .Net Framework中的应用非常广泛指针不具备的优点。首先, 函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数 。在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用 。其次, 与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址 。 实现一个delegate是很简单的,通过以下3个步骤即可实现一个delegate: 1. 声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。 2. 创建delegate对象,并"将你想要传递的函数作为参数传入"。 3. 在要实现异步调用的地方

Invoke()和BeginInvoke()之间有什么区别

你说的曾经没有我的故事 提交于 2020-02-28 08:05:25
只是想知道 BeginInvoke() 和 Invoke() 之间的区别是什么? 主要是每个人将用于什么。 编辑:创建一个线程对象和调用它上面的调用,并在委托上调用 BeginInvoke() 有什么区别? 或者他们是一样的吗? #1楼 Control.Invoke() 和 Control.BeginInvoke() 之间的区别是, BeginInvoke() 将在GUI线程上安排异步操作。 安排异步操作后,代码将继续。 一段时间后(您不确切知道何时)将执行您的异步操作 Invoke() 将执行您的异步操作(在GUI线程上)并等待您的操作完成。 一个合乎逻辑的结论是,传递给 Invoke() 的委托可以有out-parameters或return-value,而传递给 BeginInvoke() 的委托则不能(你必须使用EndInvoke来检索结果)。 #2楼 只是给出一个简短的,有效的例子来看看它们之间的差异 new Thread(foo).Start(); private void foo() { this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate() { myTextBox.Text = "bing"; Thread.Sleep(TimeSpan.FromSeconds(3)

三十而立,从零开始学ios开发(七):Delegate,Action Sheet, Alert

时间秒杀一切 提交于 2020-02-27 03:48:11
Action Sheet和Alert是2种特殊的控件(暂且称之为控件吧,其实不是控件真正的控件,而是ios中的2个类,这2个类定义了2种不同类型的用于和用户交互的弹出框),Action Sheet是从底部弹出,上面有2个或者2个以上的选项供用户选择,Alert就是一个警告框,上面有1个或者1个以上的按钮供用户进行选择。 在继续这一篇的内容之前,稍微花点时间说一下ios中用到的Delegate Pattern(委托\代理模式)。 ios中有很多已经定义好的类可以供我们在编写程序时直接使用,例如UIActionSheet、UIAlertView等,这些类定义了很多method,我们可以调用这些method且不必知道这些method是如何实现的。但是有一个问题,如果我们想改变这些method的实现,那我们该这么做呢?一种方法是继承,我们可以继承一个类,然后在自己的类中重新写method,这是一个方法,但不是一个很方便的方法,有时候你仅仅需要改变很小的一个功能,却要继承一个很大的类,貌似有点复杂了,而且如果你需要一些不同的实现,那你就需要定义好多不同的类,这会很麻烦。为了使开发过程更加的方便,ios使用了另一种方法来达到同样的目的,就是使用delegate,我们使用一个已定义的类,然后使用委托\代理来改写类中的method,程序在运行时

C#委托(delegate、Action、Func、predicate)和事件

混江龙づ霸主 提交于 2020-02-26 23:07:51
一、前言 刚开始工作的时候,觉得委托和事件有些神秘,而当你理解他们之后,也觉得好像没有想象中的那么难。在项目中运用委托和事件,你会发现他非常棒,这篇博文算是自己对委托和事件的一次梳理和总结。 二、委托 C#中的委托,相当于C++中的指针函数,但委托是面向对象的,是安全的,是一个特殊的类,当然他也是引用类型,委托传递的是对方法的引用。 2.1、delegate 声明委托就必须使用关键字“delegate”,委托是先声明,后实例化。至少0个参数,至多32个参数 格式如下所示: private delegate string GetAsString(); 委托是一个类,所以他的实例化跟类的实例化一样,只是他总是接受一个将委托方法作为参数的构造函数。调用委托方法就有两种方式,如下所示: int i = 10; var method = new GetAsString(i.ToString); //调用方法一 Console.WriteLine($"method方法{method()}"); //调用方法二 Console.WriteLine($"method.Invoke方法{method.Invoke()}"); 运行结果: 2.2、Action Action是无返回值的泛型委托,可以接受0个至16个传入参数 Action 表示无参,无返回值的委托 Action<int,string>

C#委托的介绍(delegate、Action、Func、predicate)

ε祈祈猫儿з 提交于 2020-02-26 23:04:15
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。   1.委托的声明   (1). delegate delegate我们常用到的一种声明    Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。    例:public delegate int MethodtDelegate(int x, int y);表示有两个参数,并返回int型。   (2). Action Action是无返回值的泛型委托。    Action 表示无参,无返回值的委托    Action<int,string> 表示有传入参数int,string无返回值的委托   Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托 Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托    Action至少0个参数,至多16个参数,无返回值。    例: public void Test<T>(Action<T> action,T p) { action(p); }   (3). Func    Func是有返回值的泛型委托    Func<int> 表示无参,返回值为int的委托    Func<object,string,int>

2、监听器模式

我的未来我决定 提交于 2020-02-26 07:27:03
当在IDEA中点击Download Sources时报错cannot download sources,解决办法,在Terminal中输入 mvn dependency:resolve -Dclassifier=sources 参考:https://www.cnblogs.com/wwjj4811/p/10364580.html 系统运行到某些关键节点时,会通过广播发布一些事件,而系统中存在一些监听器对这些事件感兴趣,会监听到这些事件,从而触发某种行为 1.1、监听器加入SpringBoot容器 @SpringBootApplication public class SpringbootApplication { public static void main(String[] args) { SpringApplication.run(SpringbootApplication.class, args); } } // 走到SpringApplication的构造函数,这边代码第一节也分析过 public SpringApplication(ResourceLoader resourceLoader, Class<!--?--> primarySources) { this.resourceLoader = resourceLoader; Assert.notNull

在RedisTemplate中使用scan代替keys指令

若如初见. 提交于 2020-02-26 00:17:38
SCAN 简介 SCAN 命令及其相关的 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都用于增量地迭代(incrementally iterate)一集元素(a collection of elements): SCAN 命令用于迭代当前数据库中的数据库键。 SSCAN 命令用于迭代集合键中的元素。 HSCAN 命令用于迭代哈希键中的键值对。 ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。 基本用法可以参考: http://doc.redisfans.com/key/scan.html SCAN和KEYS的区别 当 KEYS 命令被用于处理一个大的数据库时, 又或者 SMEMBERS 命令被用于处理一个大的集合键时, 它们可能会阻塞服务器达数秒之久。在高并发下会导致请求大量堆积进而导致服务雪崩。有些公司在生产环境直接禁用 kyes * 命令。但是在redis服务器key的数量不大的情况下,使用keys也是没啥问题的。 SCAN 命令及其相关的 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都用于增量地迭代 ,它们每次执行都只会返回少量元素, 不会阻塞服务器 , 所以这些命令可以用于生产环境, 而不会出现像 KEYS 命令、 SMEMBERS 命令带来的问题。 SCAN 一样有它自己的问题: 因为是分段获取key

delegate pattern 委派模式

一曲冷凌霜 提交于 2020-02-25 19:18:41
委派模式(Delegate Pattern)的基本作用就是负责任务的调度和分配任务,跟代理模式很像,可以看做是一种特殊情况下的静态代理的全权代理,但是代理模式注重过程,而委派模式注重结果。 1 不属于GOF 23种设计模式之一。 2 属于行为型模式 3 Delegate 结尾的一般都是委派,Dispatcher 委派模式在 Spring 中应用非常多,常用的 DispatcherServlet 其实就是用到了委派模式 在 Spring 源码中,只要以 Delegate 结尾的都是实现了委派模式。例如:BeanDefinitionParserDelegate 根据不同类型委派不同的 public interface IEmployee { void doing(String command); } public class EmployeeB implements IEmployee { @Override public void doing(String command) { System.out.println("我是员工B,我现在开始干" + command + "工作"); } } public class EmployeeA implements IEmployee { @Override public void doing(String command) { System

浅谈C#中常见的委托

♀尐吖头ヾ 提交于 2020-02-24 16:30:17
一提到委托,浮现在我们脑海中的大概是听的最多的就是类似C++的函数指针吧,呵呵,至少我的第一个反应是这样的。 关于委托的定义和使用,已经有诸多的人讲解过,并且讲解细致入微,尤其是张子阳的那一篇。我就不用多废话了。 今天我要说的是C#中的三种委托方式:Func委托,Action委托,Predicate委托以及这三种委托的常见使用场景。 Func,Action,Predicate全面解析 首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如下的5种类型: (1) *delegate TResult Func<TResult>(); (2)*delegate TResult Func<T1,TResult>(T1 arg1); (3) *delegate TResult Func<T1,T2,TResult>(T1 arg1, T2 arg2); (4)*delegate TResult Func<T1,T2,T3,TResult>(T1 arg1, T2 arg2, T3 arg3); (5)*delegate TResult Func<T1,T2,T3,T4,TResult>T1 arg1, T2 arg2, T3 arg3, T4 arg4); 其中(1)只能委托无参但是有返回值的函数,TResult就是其返回类型。 而(2)只能委托具有一个传入参数,有返回值的函数