首页 > 学院 > 开发设计 > 正文

说清委托和事件

2019-11-17 03:16:04
字体:
来源:转载
供稿:网友

说清委托和事件

一、委托什么

一个能存放符合某种格式的方法(方法签名)的指针的容器

二、语法

Demo1

 1  //声明委托类(必须指定返回值类型和方法参数列表) 2     public delegate void DGSayHi(string str); 3     public partial class demo1 : System.Web.UI.Page 4     { 5         PRotected void Page_Load(object sender, EventArgs e) 6         { 7             //创建委托对象,并为委托对象添加一个方法指针(方法对象地址),注意:不能存放签名和委托签名不一致的方法 8             DGSayHi dgSayHi = new DGSayHi(SayHiSomeWhere); 9             //调用委托(委托对象内部的方法就会被调用)10             dgSayHi("哈哈哈");11         }12         public void SayHiChina()13         {14             Response.Write("你好");15         }16         public void SayHiSomeWhere(string location)17         {18             Response.Write(location + "你好");19         }
View Code

自定义按钮:Demo2

MyButton类:

 1  public delegate void DGMyClick(DateTime clickTime); 2     public class MyButton : System.Web.UI.WebControls.Button 3     { 4  5         public DGMyClick dgMyClick; 6         public MyButton() 7         { 8             //为父类的单击事件注册一个方法 9             base.Click += MyButton_Click;10         }11         void MyButton_Click(object sender, EventArgs e)12         {13             if (dgMyClick != null)14             {15                 dgMyClick(DateTime.Now);//调用委托16             }17         }
View Code

demo2调用:

 1 protected void Page_Load(object sender, EventArgs e) 2         { 3             MyButton m = new MyButton(); 4             m.Text = "自定义按钮"; 5             form1.Controls.Add(m); 6             m.dgMyClick = MyButtonClick; 7         } 8         public void MyButtonClick(DateTime clickTime) 9         {10             Response.Write(string.Format("<script>alert('当前时间是{0}')</script>", clickTime.ToString()));11         }
View Code

三、语法糖

在c#中有很多简洁语法,实质是由编译器在编译时转成完整语法

Demo3

 1  public partial class demo3 : System.Web.UI.Page 2     { 3         public delegate void DGTest(); 4         protected void Page_Load(object sender, EventArgs e) 5         { 6  7         } 8  9         protected void Button1_Click(object sender, EventArgs e)10         {11             DGTest dg=Test1;//编译后:new DGTest(this.Test1)12             dg+=Test2;//编译后:(DGTest) Delegate.Combine(dg,new DGTest(this.Test2))13             dg+=Test3;//编译后:(DGTest) Delegate.Combine(dg,new DGTest(this.Test3))14             dg -= Test3;//编译后:(DGTest) Delegate.Remove(dg,new DGTest(this.Test3))15             dg();//编译后:dg.Invoke()16         }17         void Test1()18         {19             Response.Write("test1");20         }21         void Test2()22         {23             Response.Write("test2");24         }25         void Test3()26         {27             Response.Write("test3");28         }29     }
View Code

四、委托类

1、 委托编译后,声称一个同名的类,如DGTest,它继承于MulticastDelegate,MulticastDelegate继承于Delegate

2、 为委托追加方法的本质,是为被追加的方法创建一个新的委托对象,并将方法指针存入对象的父类的父类(Delegate)的IntPrt(专门存指针的一种数据类型)变量中,然后再将新创建的委托添加到当前委托对象(dg)的数组中。

五、委托的目的

1、 委托当返回值 demo4

 1 public delegate void DGTest(); 2     public partial class demo4 : System.Web.UI.Page 3     { 4         protected void Page_Load(object sender, EventArgs e) 5         { 6  7         } 8  9         protected void Unnamed1_Click(object sender, EventArgs e)10         {11             DGTest dg = InvokeTest("1");12             dg();13         }14 15         public DGTest InvokeTest(string s)16         {17             switch (s)18             {19                 case "1":20                     return Test1;21                 case "2":22                     return Test2;23                 default:24                     return Test3;25             }26         }27         void Test1()28         {29             Response.Write("test1");30         }31         void Test2()32         {33             Response.Write("test2");34         }35         void Test3()36         {37             Response.Write("test3");38         }39     }
View Code

2、 方法当参数 demo5

 1    public delegate void DGTest1(); 2     public partial class demo5 : System.Web.UI.Page 3     { 4         protected void Page_Load(object sender, EventArgs e) 5         { 6  7         } 8  9         protected void Button1_Click(object sender, EventArgs e)10         {11             InvokeTest(Test1);12         }13         public void InvokeTest(DGTest1 dgTest)14         {15             dgTest();16         }17         void Test1()18         {19             Response.Write("test1");20         }21         void Test2()22         {23             Response.Write("test2");24         }25         void Test3()26         {27             Response.Write("test3");28         }29     }
View Code

六、委托加工字符串

Demo6

 1 public delegate string DGMakeUpStr(string str); 2     public partial class demo6 : System.Web.UI.Page 3     { 4         protected void Page_Load(object sender, EventArgs e) 5         { 6             7         } 8  9         public string MakeUpStr(string str)10         {11             return str += "我";12         }13         public string[] MakeUpStrArr(string[] arrStr, DGMakeUpStr dg)14         {15             string[
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表