C#中的委托是什么?事件是不是一种委托?

本文详细介绍了委托和事件的概念及应用,包括委托的基本使用步骤、事件的处理方式以及自定义事件的实现过程。通过实例展示了如何定义委托、实例化并调用委托,以及如何创建和处理自定义事件。
一、委托ITPUB个人空间%A,@�Z4y/tX7x�T(H
委托类似于函数指针,但函数指针只能引用静态方法,而委托既能引用静态方法,也能引用实例方法。ITPUB个人空间)N%lz1GuQ
ITPUB个人空间n2mg lG A;_Pz
委托使用分三步:1、委托声明。2、委托实例化。3、委托调用。ITPUB个人空间b%i G�Ig;/
例程一:
agi8/p"?M3g7t0
 程序代码
ITPUB个人空间:s W*p�tf-g6f
using System;
lCoJ7tOe0
4y([McK$[@%j0namespace 委托
.f$wLGBAvN9]0{
I9qg$AK"]n9Nl0     delegate int NumOpe(int a,int b); //第一步:委托声明
fv"_$W%b!DXT#[0
     class Class1
r�F:@3m FS3i0     {ITPUB个人空间7k�n;fzB K
         static void Main(string[] args)ITPUB个人空间l.lC e7e0ay�T(@#h
         {
o{6/-j'A'kCEw/j0             Class1 c1 = new Class1();
J&p,|0N+NJ)C0             NumOpe p1 = new NumOpe(c1.Add); //委托实例化,注意参数是要使用的参数名,且不带括号ITPUB个人空间#FctC cKy6Sw
             Console.WriteLine(p1(1,2)); //委托调用ITPUB个人空间sH[3a`0L0x9QNP"~A7J G
             Console.ReadLine();ITPUB个人空间^?-r-a{ v
         }ITPUB个人空间ADLX;l2E5gl.u
ITPUB个人空间y_�Wr2~6V
         private int Add(int num1,int num2)ITPUB个人空间QN0e3x3z6|
         {
f+Z JsO^o0             return(num1+num2);
gk~'w:BI,Ff0         }
d*q(o+M/Tnq*U0     }ITPUB个人空间3OF-g%t'S6M_}[&s
}
#T[x7IV0

S+S9_P2]5?"sl0例中,委托NumOpe引用了方法Add。ITPUB个人空间�i;L}0f-v*wp$@:J
委托声明了以后,就可以象类一样进行实例化,实例化时把要引用的方法(如:Add)做为参数,这样委托和方法就关联了起来,就可以用委托来引用方法了。
-w6jh?3Xl3fn%U0委托和所引用的方法必须保持一致:
1?Z/F9XQ/|Jf01、参数个数、类型、顺序必须完全一致。
6Z;d+eb"wi02、返回值必须一致。
Vz5[{s0ITPUB个人空间:bF v?hFAD Q,^
二、事件
p'Fi:dak*v F0ITPUB个人空间l!}-qBf}O
事件有很多,比如说鼠标的事件:MouserMove,MouserDown等,键盘的事件:KeyUp,KeyDown,KeyPress。ITPUB个人空间$A^8}$G.|"e Dv9Y
ITPUB个人空间6NZ m_ H
有事件,就会有对事件进行处理的方法,而事件和处理方法之间是怎么联系起来的呢?委托就是他们中间的桥梁,事件发生时,委托会知道,然后将事件传递给处理方法,处理方法进行相应处理。ITPUB个人空间%?Vuc3Hn2?

f^h9/+o'd w0比如在WinForm中最常见的是按钮的Click事件,它是这样委托的:this.button1.Click += new System.EventHandler(this.button1_Click);按按钮后就会出发button1_Click方法进行处理。EventHandler就是系统类库里已经声明的一个委托。-------委托实例化,this.buttion1_click为方法名
:aV[Kc a0ITPUB个人空间 ~]`E+O4MiY
三、自定义事件及其处理
"[aUYL4l"meBV G0ITPUB个人空间!M.O:gh&TQ z4cD
EventHandler以及其它自定义的事件委托都是一类特殊的委托,他们有相同的形式:
/}*_{A{&But0
J,Eo zH5A7[`0delegate void 事件委托名(object sender,EventArgs e);
-E;/ F/Mc.x0
"?!aHd_*/ N$Y @0object用来传递事件的发生者,比如二中的Button控件就是一个事件发生者;EventArgs用来传递事件的细节。ITPUB个人空间_;?._aVmb

(|)O7iGV%X3I0例程二:
3I?-^ p)Nx/z.t5^0
 程序代码

Bt/]0M$M-J0using System;ITPUB个人空间E9}:J)[7m
ITPUB个人空间 RP c1_"{
namespace 最简单的自定义事件
5pg*_&L-_,L/iip0{
&L2qs6s} Q4K6w-f0     /// <summary>
(oui:q`V6o4v0     /// 事件发送类
5{.L4b/2mx.}$a0     /// </summary>
t�OZ2qWu0     class Class1ITPUB个人空间"?$C/M,?,h
     {ITPUB个人空间!Hk-rY{T9T!zj#y
         public delegate void UserRequest(object sender,EventArgs e); //定义委托
o�Ju7W"|2T bKK0
         public event UserRequest OnUserRequest; //定义一个委托类型的事件ITPUB个人空间'D/Z"Q I*Y"a[
ITPUB个人空间a_ax(x @y9?*|
         public void run()
KVrhu#c7Mg0         {
^@Vg N+^[0             while(true)
3Y f,d$hEzj$A0             {ITPUB个人空间I Ew"`?[$X0g['R
                 if(Console.ReadLine()=="a")ITPUB个人空间mxXN7u-vy"f:j.D
                 {//事件监听ITPUB个人空间$Vi)u7R$]gd.A:D:k!Lx
                     OnUserRequest(this,new EventArgs()); //产生事件ITPUB个人空间?&`Ssk|5Q
                 }
mv t-G4HP0             }
(o]uH[0         }
3?j%j!Q3nZg(f'Wn0     }
"P-kxaw'Z3d0ITPUB个人空间4P8L5`8`x
     /// <summary>ITPUB个人空间W[6bPo&n
     /// 事件接收类
%QK5W3@p0     /// </summary>ITPUB个人空间o]huI9Cl Vv
     class Class2
)Jo{%|%eNBD0     {ITPUB个人空间%M^G O7`fHm
         static void Main(string[] args)ITPUB个人空间+NY4E8iWe
         {ITPUB个人空间,{O)G`0o I8fU
             Class1 c1 = new Class1();ITPUB个人空间?+E3U-`M D
             c1.OnUserRequest += new Class1.UserRequest(c1_OnUserRequest); //委托实例化后绑定到事件
7fk&kv/RI0             c1.run();
H$Z'cQ.tD0         }ITPUB个人空间 O+v7X LO7dCj7v
ITPUB个人空间Tk+u*`*iJ
         private static void c1_OnUserRequest(object sender, EventArgs e)
xAF%bF0         {//事件处理方法ITPUB个人空间m6_3?&h)Q$D){B:B
             Console.WriteLine("/t你触发了事件!");ITPUB个人空间$R"kje6@
         }
5DDv_$fN%B0     }
/F3p~'o_xag0}
Mp!a+Bn8Q"i0
ITPUB个人空间v�M.O3g H
例程三:ITPUB个人空间Ho0/6QV
 程序代码

_X"H5?;bs$tc@~0using System;ITPUB个人空间`8Ao{�x?6e#O'p"`
ITPUB个人空间;gI7A(gU6c5WT
namespace 带事件数据的事件ITPUB个人空间 y3ZV!w8E$H*m"T oD5m
{
#dE d|T`C+~0     /// <summary>ITPUB个人空间C)A)t8QD'`
     /// 带事件数据的事件类,从EventArgs继承ITPUB个人空间vWgpmp%n
     /// </summary>ITPUB个人空间[L+r#vZA/Mp
     class OnUserRequestEventArgs:EventArgs
9s0Q(Pd�w�cvSNL0     {
e5X JO*Oh}K0         private string inputText;ITPUB个人空间,??!c1Mf?4XUAnG;/
         public string InputText
%loOE&TB.V.s0         {ITPUB个人空间UyM kjyr�F[1v
             get
z5{0S8o$l#O�B0             {ITPUB个人空间)K�F2z]:@c.T
                 return inputText;ITPUB个人空间'GX f1Z)s^~
             }
?T-H+P*QZ&PB3D^0             setITPUB个人空间�b%vUmv
             {
4u f3D] ?0                 inputText = value;ITPUB个人空间-}{)^Ub-[b/]Jh4Q
             }ITPUB个人空间{3KAsQ!@ ?
         }
4l�~y#s.^)p8R,]Q4Gm4d0     }ITPUB个人空间(qt9r8M N
ITPUB个人空间:_'EL"Y N{�z#b:~
     /// <summary>ITPUB个人空间 N#Z]'DNDs
     /// 事件发送类ITPUB个人空间*wWN!A zN"o P ?
     /// </summary>
Em&rw/BE5qlKvE0     class Class1
2E Md3BCVP8O8/F!~0     {ITPUB个人空间 A]aAT&N^
         public delegate void UserRequest(object sender,OnUserRequestEventArgs e);------------->声明委托ITPUB个人空间/c;U Nz5U"[/A/V
         public event UserRequest OnUserRequest;------->定义一个委托类型的事件ITPUB个人空间1w`#c4_9c'f@%D:@-NaiX

hnDcc p@0         public void run()ITPUB个人空间E'Sc�{ Z K"r
         {
:/~5}d7Z'y5l'[0             while(true)ITPUB个人空间x No&f s|#V#k
             {
7]6vt3T#D0                 Console.WriteLine("请输入内容:");ITPUB个人空间l1h4c!~{+S
                 string a=Console.ReadLine();ITPUB个人空间 o'?/D)h{I9r
                 //if(a=="a")ITPUB个人空间 U$RC9PP9s
                 //{
!F2E#nj'r/K?8C0                 OnUserRequestEventArgs e1 = new OnUserRequestEventArgs();
)eU$l&T$Xt_-_0                 e1.InputText = a;ITPUB个人空间 o?-@e@#kn
                 OnUserRequest(this,e1);
rR"T3l4kcB*xR0                 //}ITPUB个人空间 v'e I,l:u.]dG
             }ITPUB个人空间|'Y�p$AB
         }
7Mgg.p ~m0     }
U./ G"I2ty ?U0ITPUB个人空间u t!@/mgy!Cz;{
     /// <summary>ITPUB个人空间 I)AZe,MKz
     /// 事件接收类
6vc&wF"clx#Qm0     /// </summary>
{*[.^!/"iGmt@0     class Class2ITPUB个人空间3yR:n4Ke I
     {
+d'XYL#]:G0         [STAThread]
ln,Y[6waP1CU0         static void Main(string[] args)
e ?^,/ C3|�s9YM0         {ITPUB个人空间qj6@4Vr
             Class1 c1 = new Class1();ITPUB个人空间5?F'WEaK:A$C
             c1.OnUserRequest += new Class1.UserRequest(c1_OnUserRequest);
YI.w8f] nw Na k6]0             c1.run();ITPUB个人空间.[ iIVL/W Q6iq1X3y
         }ITPUB个人空间/h i't5vTV
ITPUB个人空间zJ,f.D8g#m%_~W
         private static void c1_OnUserRequest(object sender, OnUserRequestEventArgs e)ITPUB个人空间r_;/d0Qk/)P
         {
-roG/l0fZ:^T0             Console.WriteLine("/t你输入的是:"+e.InputText);
}m'JFF'^#pA0         }ITPUB个人空间-ng-dkF*mX"A
     }ITPUB个人空间6tp_#l_a.z;N&{
}ITPUB个人空间;Ml'i7?P
ITPUB个人空间"NBFt0_�SF$K
例程三跟例程二唯一的差别在于自定义了一个类OnUserRequestEventArgs,从EventArgs继承
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值