delegate

61 (OC)* 代理 block 通知 代理 kvo

别说谁变了你拦得住时间么 提交于 2019-11-28 15:05:55
1.从源头上理解和区别block和delegate delegate运行成本低,block的运行成本高。 block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置nil后才消除。delegate只是保存了一个对象指针,直接回调,没有额外消耗。就像C的函数指针,只多做了一个查表动作。 2.从使用场景区别block和delegate 有多个相关方法。假如每个方法都设置一个 block, 这样会更麻烦。而 delegate 让多个方法分成一组,只需要设置一次,就可以多次回调。当多于 3 个方法时就应该优先采用 delegate。当1,2个回调时,则使用block。 delegate更安全些,比如: 避免循环引用。使用 block 时稍微不注意就形成循环引用,导致对象释放不了。这种循环引用,一旦出现就比较难检查出来。而 delegate 的方法是分离开的,并不会引用上下文,因此会更安全些。 delegate回调返回的参数被限制在了 NS 类的范围内,数量也很有限(当然可以用直接调用方法的形式在绕过,并不推荐;也可以用 Array 套着传, 不过这样需要有文档支持,不然不够清晰,回调方法也需要独立的验证,故也不推荐)。 效率 肯定是delegate比NSNotification高。 KVO提供一种机制,当指定的被观察的对像的属性被修改后

C#委托

别等时光非礼了梦想. 提交于 2019-11-28 12:41:59
什么是委托? emm... 先理解一下字面含义。。。    委托(Delegate) 是一种存储函数引用的类型。    委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。 emm... 把方法作为参数代入另一个方法中。。。 定义委托:    委托的定义类似于方法,但不带结构体,必须要有 Delegate 关键字。 委托的声明指定了一个返回类型和一个参数列表。 /// <summary> /// 委托老王帮我办点事 /// </summary> /// <returns></returns> public delegate void TakeSomethingDelegate(); // 帮我打包一份吃的 public static void TakeOutFood() => Console.WriteLine("老王帮我打包了一份吃的!"); // 帮我带一包烟 public static void TakeSmoke() => Console.WriteLine("老王帮我带了一包烟!");    var oldWangDelegate = new TakeSomethingDelegate(TakeOutFood); oldWangDelegate += TakeSmoke;

怎么判断事件是否已订阅某一方法

爱⌒轻易说出口 提交于 2019-11-28 05:15:23
1用反射 PropertyInfo pi = (typeof(Button)).GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic); EventHandlerList ehl = (EventHandlerList)pi.GetValue(btnHardInfo, null);//这是你的Button FieldInfo fi = (typeof(Control)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic); Delegate d = ehl[fi.GetValue(null)]; if (d != null) { System.Delegate[] dels = d.GetInvocationList(); for (int i = 0; i < dels.Length; i++) { MsgBox.Items.Add(dels[i].Method.Name);//这里会输出所有方法名称 } }    2只要在加事件之前先-=就可以了 button2.Click -= new EventHandler(button2_Click); button2.Click += new EventHandler

C#委托

[亡魂溺海] 提交于 2019-11-28 03:17:48
C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。 委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。 委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。 来源: https://www.cnblogs.com/moon-boke/p/11388460.html

C# 中的委托和事件

谁都会走 提交于 2019-11-28 01:53:30
源码下载: http://www.tracefact.net/SourceCode/Delegates-and-Events-in-CSharp.rar 转载: http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html 个人学习使用 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。 将方法作为方法的参数 我们先不管这个标题如何的绕口,也不管委托究竟是个什么东西,来看下面这两个最简单的方法,它们不过是在屏幕上输出一句问候的话语: public void GreetPeople( string name) { // 做某些额外的事情,比如初始化之类,此处略 EnglishGreeting(name); } public void EnglishGreeting( string name) { Console

C#十种语法糖

我只是一个虾纸丫 提交于 2019-11-27 04:43:07
原文: C#十种语法糖 语法糖 指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。 需要声明的是“语法糖”这个词绝非贬义词,它可以给我们带来方便,是一种便捷的写法,编译器会帮我们做转换,而且可以提高开发编码的效率,在性能上也不会带来损失。 一、自动属性 以前:手写私有变量+公有属性 现在:声明空属性,编译器自动生成对应私有成员字段。 写法:输入prop ,连续按两次tab键,自动生成属性。 1 /// <summary> 2 /// 自动属性 3 /// </summary> 4 public string Name { get; set; } 5 6 /// <summary> 7 /// 传统属性写法 8 /// </summary> 9 private string _LoginName; 10 11 public string LoginName 12 { 13 get { return _LoginName; } 14 set { _LoginName = value; } 15 } 二、隐式类型(var) var定义变量有以下四个特点: 程序员在声明变量时可以不指定类型,由编译器根据值来指定类型 1、必须在定义时初始化 2、一旦初始化完成

C#中delegate对象Equals方法简析

不羁的心 提交于 2019-11-27 04:15:47
.NET的基础类 Object 有一个 Equals 方法,这个方法用来比较两个对象是否相等,默认的实现是比较两个引用是否相同,相当于 == 操作符。对于不同的子类可能会有不同的实现,本篇就来研究一下delegate的equals方法。 首先是 msdn 上给出的说明 按照以下方式比较这些方法和目标是否相等: 如果所比较的两种方法都是静态的且对同一类为同一方法,则这些方法被视为相等,这些目标也被视为相等 如果所比较的两种方法都是实例方法且对同一个对象为同一种方法,则这些方法被视为相等,这些目标也被视为相等。 否则,这些方法被视为不相等,这些目标也被视为不相等。 仅当两个调用列表具有相同顺序,并且两个列表的对应元素表示相同的方法和目标时,这两个调用列表才会被视为相同。 利用以上规则通常可以判断大部分情况的比较结果,但是如果用到了匿名方法,比如 lambda表达式 的时候应该怎么处理呢。带着这个问题我做了个小实验。 首先定义了一个类生产不同的delegate对象,一个用到了成员变量_value,一个用到了静态变量_svalue,一个没有用到任何变量: class ClosureEnv { private static int _svalue = 4; private int _value; public ClosureEnv( int n) { _value = n; } public

Spring Cloud中基于Sleuth的参数透传功能探索

南笙酒味 提交于 2019-11-27 03:11:41
一.需求 微服务环境,有A,B,C,D四个服务,调用关系为:A->B->C->D。用户在A的页面选择当前“语言”环境为“英文”,在某些业务场景下,其它几个服务需获取到这个“语言”信息。 二.分析 这个需求还是很简单的,类似于“击鼓传花”:当前服务从上一个服务中获取参数,并传给下一个服务。个人感觉基本上所有的RPC框架都会遇到这个问题,只是以前SOA架构下,服务层级比较少,将“语言”、“登陆”等附加信息放在参数列表中并不会带来太多工作量,所以这个问题并不是太突出。而引入了微服务架构思想后,服务调用层级急剧增长,这就需要一个更加优雅的方式来解决附加信息的传递问题。 三.方案探索 3.1 方案一:参数放在接口参数列表中 优点 :思路简单,开发没有学习成本 缺点 : 代码高度耦合:附加信息却要每个接口都显式维护 升级困难:如果将来再加一个参数,所有层级的接都要改动 引起迷惑:如果B服务的逻辑不需要“语言“参数,但是因为D需要,它也必须维护 太傻了,Big不够 思考:微服务之间绝大多数情况是通过HTTP调用的,HTTP的header中也可以放参数信息。这样,接口参数中就不用维护这些附加信了。 3.2 方案二:参数放在httpRequest的header中 实现 : 1.自定义一个Filter,获取Request中自己需要的附加信息, 2.将这些信息放入ThreadLocal中, 3

Lambda 表达式

梦想的初衷 提交于 2019-11-27 01:28:14
先看代码: View Code 1 class Program 2 { 3 static void Main() 4 { 5 Func< int , bool > func1 = new Func< int , bool >(isPositive); 6 7 Func< int , bool > func2 = isPositive; 8 9 int b = 5 ; 10 Func< int , bool > func3 = delegate ( int a) 11 { 12 return a + b > 0 ; 13 }; 14 15 Func< int , bool > func4 = a => 16 { 17 return a + b > 0 ; 18 }; 19 } 20 21 static bool isPositive( int a) 22 { 23 return a > 0 ; 24 } 25 } 从上面的代码,我们可以看出委托的进化过程: 1、第5行:原始的写法,Named Delegate,使用delegate 包装方法。 2、第7行:对原始的写法进行简化,不需要使用delegate包装方法。 3、第10行:Anonymous Method Delegate,直接使用匿名方法。 4、第15行:使用Lambda 表达式简化匿名方法。 总结: 1、

C#中delegate对象Equals方法简析

假装没事ソ 提交于 2019-11-26 21:45:13
.NET的基础类 Object 有一个 Equals 方法,这个方法用来比较两个对象是否相等,默认的实现是比较两个引用是否相同,相当于 == 操作符。对于不同的子类可能会有不同的实现,本篇就来研究一下delegate的equals方法。 首先是 msdn 上给出的说明 按照以下方式比较这些方法和目标是否相等: 如果所比较的两种方法都是静态的且对同一类为同一方法,则这些方法被视为相等,这些目标也被视为相等 如果所比较的两种方法都是实例方法且对同一个对象为同一种方法,则这些方法被视为相等,这些目标也被视为相等。 否则,这些方法被视为不相等,这些目标也被视为不相等。 仅当两个调用列表具有相同顺序,并且两个列表的对应元素表示相同的方法和目标时,这两个调用列表才会被视为相同。 利用以上规则通常可以判断大部分情况的比较结果,但是如果用到了匿名方法,比如 lambda表达式 的时候应该怎么处理呢。带着这个问题我做了个小实验。 首先定义了一个类生产不同的delegate对象,一个用到了成员变量_value,一个用到了静态变量_svalue,一个没有用到任何变量: class ClosureEnv { private static int _svalue = 4; private int _value; public ClosureEnv( int n) { _value = n; } public