理解委托

news/2024/7/5 3:07:07

 在C#中,委托与类,接口是同一级别的。
    1, 委托:方法的模板。
          定义:没有方法体的方法,即只有方法的声明。与抽象方法的声明相同,只需将abstract更改为delegate即可。
例:public delegate void SayHi (string name ) ;该例子定义了一个SayHi类型的委托(其实就是一个返回值为void,参数为string类型的方法的声明,只是多了个delegate 而已,我想是为了叫起来方便,所以管它叫委托。为什么非得叫这个名字,就得问C#的创造者了)。为了方便访问和重用,委托一般是放在命名空间下的。如果你想写在类的内部,随你高兴就好。
          实例:与类的实例一样使用new关键字,不同的是委托只有带参的实例函数,在new的同时就需要传递参数。最大的不同是参数只能是方法名(在C#2.0中匿名方法也可以)。如:SayHi say = new SayHi(Hello);或SayHi say = new SayHi(delegate (string name){ Console.WriteLine(name+"说:hello!");});
        public void Hello (string name)
       {
               Console.WriteLine(name+"说:hello!");
        }
        使用:委托实例名(参数),如 say (name); Hello方法和匿名方法的参数在使用实例委托时指定,name为string类型(我觉得完全多余,这句话)。到这里进入重点了,委托在没有实例化的情况下使用是不会引发编译异常的,但是会引发运行时异常。异常叫空引用。所以一般在都会加个非空判断,如:if(say != null){ say (name);}。这样当它还未实例化时使用,就不会让程序中断了。
        运算符:+,+=,=,-,-=(减等)可用于委托。比如说,
SayHi say = new SayHi(Hello);
say += new SayHi(delegate (string name){ Console.WriteLine(name+"说:hello!")};);
        也可以这样:
SayHi say1 = new SayHi(Hello);
SayHi say2 = new SayHi(Hello1);( Hello1方法和Hello一样,我不想多打字了)。
SayHi say = say1 + say2;
        也就是说委托可以引用多个实例,规则是方法的返回值必须为void才行,这个叫多播委托。如果不是的话,编译器会提醒你的。使用多播实例时只需写一次即可执行所有引用的方法,参数为共享,按实例化先后顺序执行引用方法。- , -=是用来移除实例引用的,这个就不多说了。
        另外,可以定义委托数组。SayHi[] sh = {new SayHi(Hello), new SayHi(Hello1)};通过数组下标访问sh[0]("liang")就是引用执行Hello方法了。这时结果为:liang说:hello!。

转载于:https://www.cnblogs.com/jameslu/archive/2010/08/12/1798089.html


http://lihuaxi.xjx100.cn/news/249179.html

相关文章

liunx软件安装

RPM包 1. -qa显示当前系统中以RPM方式安装的所有软件列表。 2. -qi查看指定软件包的名称、版本、许可协议、用途描述等详细信息(--info)。 3. -ql显示指定的软件包在当前系统中安装的所有目录、文件列表(--list)。 4. -qf查看指定…

javascript保留字

保留字不能被用作变量名或函数名。abstractbooleanbytecharclassconstdebuggerdoubleenumexportextendsfinalfloatgotoimplementsimportintinterfacelongnativepackageprivateprotectedpublicshortstaticsupersynchronizedthrowstransientvolatile注意:如果把关键字…

Bulk_Collect_Performance 比较

上一篇讲到了调用集锦,这篇关注一下性能问题吧。 DECLARECURSOR c_tool_listISSELECT descr d1 FROM hardware;l_descr hardware.descr%type; BEGINOPEN c_tool_list;LOOPFETCH c_tool_list INTO l_descr;EXITWHEN c_tool_list%notfound;END LOOP;CLOSE c_tool_list…

Java中 与,||与|的区别

阅读目录 区别短路运算举例回到顶部区别 && || 是逻辑运算,支持短路运算 & | 是位运算,不支持短路运算 回到顶部短路运算 当有多个表达式时,左边的表达式值可以确定结果时,就再继续运算右边的表达式的值; 回到顶部举例 例1 Testpublic void…

Android UI开发第二十五篇——分享一篇自定义的 Action Bar

Action Bar是android3.0以后才引入的,主要是替代3.0以前的menu和tittle bar。在3.0之前是不能使用Action Bar功能的。这里引入了自定义的Action Bar,自定义Action bar也不是完全实现了 Action bar功能,只是在外形上相似。自定义Action bar没有…

count http://www.cplusplus.com/reference/algorithm/count/

// count algorithm example#include <iostream>#include <algorithm>#include <vector>using namespace std;//count 他查找一个元素出现的次数int main () {int mycount;// counting elements in array: int myints[] {10,20,30,30,20,10,10,20}; // 8…

lamp一键安装包

lamp一键安装包 http://58.83.226.93/ http://www.centos.bz/lamp/ http://www.centos.bz/ lamp一键安装包 http://58.83.226.93/ http://www.centos.bz/lamp/ http://www.centos.bz/

IBM Thinkpad T43-44U 升级到 2G 内存后少了 66M

背景前段时间把 T43-44U 升级到 2G 内存&#xff0c;可以升级后&#xff0c;内存显示总是 1982M&#xff0c;少了 66M。奇怪之极&#xff0c;怎么搞都没搞好。有的热心网友建议重新刷 BIOS&#xff0c;升级到联想刚发布的 1.26 版。可是刷 BIOS 危险系数太高&#xff0c;俺是万…