委托的那些事

什么是委托?

之前写了事件和委托的区别:http://www.cnblogs.com/wolf-sun/p/3293146.html

这里也把委托相关知识也总结一下。

委托是c#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针

声明委托的方式:delegate 返回值类型 委托类型名(参数)
比如:

delegate void StringProcess(string s);

注意:这里的除了前面的delegate,剩下部分和声明一个函数一样,但是StringProcess不是函数名,而是委托类型名

声明的委托是一种类型,就像int、Person一样,如果要用的话还要声明委托类型的变量,声明委托类型变量的方式:StringProcess f1;

将委托类型变量指向函数 StringProcess sp = new StringProcess(SayHello),这样就可以像调用普通函数一样把sp当成函数用了。委托可以看做是函数的指针。整数可以用整数变量指向它,对象可以用对象变量指向它,函数也可以用委托变量指向它。和直接调用函数的区别:用委托就可以指向任意的函数,哪怕是之前没定义的都可以,而不使用受限于那几种。

将委托类型变量指向函数还可以简化成StringProcess sp = SayHello,编译器帮我们进行了new。但是不能sp=PrintIt(),因为这样就成了函数调用。

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 namespace Wolfy.DelegateTest
 7 {
 8     class Program
 9     {
10         delegate void StringProcess(string s);
11         static void Main(string[] args)
12         {
13             string s = "HI,I AM WOLFY";
14             string s2 = "HOW DO YOU DO?";
15             //定义委托变量p
16             StringProcess p = new StringProcess(ToLower);
17             //简化方式
18             StringProcess p2 = ToLower;
19             p(s);
20             p2(s2);
21             Console.Read();
22         }
23         static void ToLower(string s)
24         {
25             Console.WriteLine(s.ToLower());
26         }
27     }
28 }

结果:

 StringProcess p2 = ToLower;

这种简化方式,编译器到底为我们做了什么?可以通过反编译工具看一下:

可以见编译器帮咱们new了一个。

返回类型和签名指定了委托的接受方法的形式:也就是你的委托是什么样式的,指向的方法也要是什么样式的,比如这里返回类型为void 参数是string类型的。

 

匿名方法

使用Delegate的时候很多时候没必要使用一个普通的方法,因为这个方法只有这个Delegate会用,并且只用一次,这时候使用匿名方法最合适。

匿名方法就是没有名字的方法。3就是没有名字的int对象。3+5就是两个匿名int对象的相加,允许匿名对象,就允许匿名方法。

 ProcessWordDelegate p = delegate(string s)

            {

                Console.WriteLine(s);

            };

 

知道C#中有匿名方法,看到这种写法知道是匿名函数即可

多播委托*

  委托的增减方法

  d+=SayHello,为委托增加一个方法,不要感觉奇怪,因为它就是d=d+ SayHello

  d-=SayHello,将方法从委托中移除。

 注意:在使用多播委托的时候,一般是让委托指向返回值为void的方法,不然会覆盖返回值,输出最后一个方法的返回值。

 1  class Program
 2     {
 3         delegate int IntProcess(int a, int b);
 4         static void Main(string[] args)
 5         {
 6             IntProcess p = Add;
 7             p += Minus;
 8             int result = p(1, 2);
 9             Console.Write(result);
10             Console.Read();
11         }
12         static int Add(int a, int b)
13         {
14             return a + b;
15         }
16         static int Minus(int a, int b)
17         {
18             return a - b;
19         }
20     }

结果为:-1。
从结果可以看出是返回了最后一个方法Minus。

委托的本质

    其实就是一个类把方法包装了一下,委托都继承自System.MulticastDelegate,而System.MulticastDelegate又继承自System.Delegate

    多播委托就是有一个委托数组,依次调用

 

博客地址: http://www.cnblogs.com/wolf-sun/
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。http://www.cnblogs.com/wolf-sun/p/3293150.html
时间: 2024-07-30 19:28:16

委托的那些事的相关文章

asp.net C# 委托的使用学习笔记

委托一词源于生活,在生活中我们经常做或看见一些被委托或委托别人的事.比如:   场景1:"由于刘翔还在美国疗伤,特委托我带他领取今天的奖项,--" 场景2:"由于小明的爸爸妈妈忙,特委托我来参见今天的家长会,--" 场景3:"刘师傅,我这里是在是走不开,下班后麻烦你帮我接下孩子,谢谢--" ----   以上诸多情况都是生活中委托的形式,总之,委托可以理解为我请(委托)别人做事,或别人请(委托)我做事.   现在我们将上面的故事再发展一下.现在社

[C#基础]Func和Action学习

目录 委托 Action Func 总结 委托 委托的那些事 关于委托的基本定义,在很久之前的这篇文章中,有个简单的介绍.稍微回顾一下. 委托是c#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针 声明委托的方式:delegate 返回值类型 委托类型名(参数) 例如: 1 delegate void Say(string strContent); 如果想使用该委托,需要一个对应的方法. 1 /// <summary> 2 /// 委托对应方法 3 /// </summary&

[C#基础]说说委托+=和-=的那些事

写在前面 为什么会突然想说说委托?原因吗,起于一个同事的想法,昨天下班的路上一直在想这个问题,如果给委托注册多个方法,会不会都执行呢?为了一探究性,就弄了个demo研究下. += 大家都知道委托都继承自System.MulticastDelegate,而System.MulticastDelegate又继承自System.Delegate,可以通过+=为委托注册多个方法.那么他们是否都执行了呢?执行的结果又是怎样的呢?有返回值和没返回值的是否结果是否一样?那就试着说说+=都干了哪些事? 测试代码

iOS开发那些事-iOS常用设计模式–委托模式案例实现

书接上回,应用案例 我们以UITextFieldDelegate为例来说明一下委托的使用.UITextFieldDelegate是控件UITextField的 委托,控件的委托主要负责响应控件事件或控制其他对象.除了UITextField,WebView.UITableView等控件也有相应的委托对象. 打开UITextFieldDelegate的API文档,其中有4个有关编辑的方法,还要3个其它方法. 这里我们在编辑过程中消息的发送,UITextField编辑过程中与UITextFieldDe

iOS开发那些事-iOS常用设计模式–委托模式

对于iOS开发,举例Cocoa框架下的几个设计模式为大家分析.当然,Cocoa框架下关于设计模式的内容远远不止这些,我们选择了常用的几种:单例模式.委托模式.观察者模式.MVC模式. 委托模式 委托模式从GoF 设计装饰(Decorator).适配器(Adapter)和模板方法(Template Method)等模式演变而来.几乎每一个应用都会或多或少地使用到委托模式.不只是CocoaTouch框架,在Cocoa框架中委托模式也得到了广泛的应用. 问题提出 对于应用生命周期的非运行状态--应用启

你可能不知道的陷阱:C#委托和事件的困惑

一. 问题引入          通常,一个C语言学习者登堂入室的标志就是学会使用了指针,而成为高手的标志又是"玩转指针".指针是如此奇妙,通过一个地址,可以指向一个数,结构体,对象,甚至函数.最后的一种函数,我们称之为"函数指针"(和"指针函数"可不一样!)就像如下的代码: int func(int x); /* 声明一个函数 */ int (*f) (int x); /* 声明一个函数指针 */ f=func; /* 将func函数的首地址赋

.NET委托:一个C#睡前故事

紧耦合 从前,在南方一块奇异的土地上,有个工人名叫彼得,他非常勤奋,对他的老板总是百依百顺.但是他的老板是个吝啬的人,从不信任别人,坚决要求随时知道彼得的工作进度,以防止他偷懒.但是彼得又不想让老板呆在他的办公室里站在背后盯着他,于是就对老板做出承诺:无论何时,只要我的工作取得了一点进展我都会及时让你知道.彼得通过周期性地使用"带类型的引用"(原文为:"typed reference" 也就是delegate??)"回调"他的老板来实现他的承诺,

翻译].NET委托:一个C#睡前故事

翻译].NET委托:一个C#睡前故事 英文原版地址:英文原版地址:http://www.sellsbrothers.com/writin...t=delegates.htm   .NET委托:一个C#睡前故事   英文版原作者:Chris Sells(www.sellsbrothers.com) 翻译:袁晓辉(www.farproc.com http://blog.csdn.net/uoyevoli)     紧耦合 从前,在南方一块奇异的土地上,有个工人名叫彼得,他非常勤奋,对他的老板总是百依

ASP.NET入门随想之多态、接口与委托

asp.net     曾几何时,我们居住的陆地沉睡在海底,大陆也紧密的联系在一起,千百年过去了七大洲的地壳板块在缓缓移动,喜马拉雅山在慢慢增高,世界在变,唯一不变的是变化. ■ 软件开发的悖论 - 把变化变成计划 在软件开发活动的过程中,常被一个悖论所缠绕:不写码就搞不清该做什么:搞不清做什么又不知道该如何写码. 人的思维是很随意的东西,不同的人,或同一个人的不同阶段,对同一件事情的看法都会有差异,可谓是远看成岭侧成峰,远近高低各不同.随意再加上变化,常常引起项目流产或工期大大拖延. 之所以会