c#之委托和事件的区别
1、什么是委托,这里就不做介绍了,如果想了解可以查看博客:http://www.cnblogs.com/xiaoxiaogogo/p/3571494.html
下面开始对事件进行介绍
1、定义事件以及事件的编译原理
首先定义事件对应的委托:
1 public delegate void ThreeClickEventDel();
然后对应事件变量:(其实就是在委托前面加一个event)
public event ThreeClickEventDel ThreeClickEvent;
反编译之后:是:一个“私有委托”和两个“公有”的“add”和“remover”方法
1)因为是私有委托:所以只有类的内部可以调用,在类外部就不能被调用。创建的类的实例也是不能调用的。所以事件是安全的。
因为私有,所以不能使用 “=”对事件进行赋值
2)因为有 “公有” 的add 和 remove,,所以 类的实例 可以对事件 进行 “+=”和“-=”对事件进行 添加 事件和 删除事件(所以在类的外部可以对事件进行赋值,但是不能调用)
2、委托和事件的区别:
1、委托时数据类型,但是 事件 是数据类型的变量(并且是私有委托)
2、委托可以在类的外部被调用,但是事件不能再类的外部,通过类的实例进行调用(因为是私有委托)
3、委托可以通过“=”、“+=”、“-=”进行赋值,但是事件只能通过“+=”和“-=”对事件进行赋值。(因为事件是私有委托)
3、委托也能注册事件,为什么会衍生出事件呢?
委托注册事件:
1 //定义一个委托 2 public delegate void JingGaoDel(); 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 GuoluFang Guolu = new GuoluFang(); 8 //为 委托注册 事件 9 Guolu.jingGao = delegate() 10 { 11 Console.WriteLine("水已经烧开了!"); 12 }; 13 for (int i = 0; i <100; i++) 14 { 15 Guolu.ShaoShui(); 16 } 17 Console.ReadKey(); 18 } 19 }
为什么衍生事件:
1、因为事件只能通过“+=”和“-=”进行赋值,所以可以避免像委托那样(可能用“=”赋值将原有的事件冲掉)。
2、事件虽然是public 定义的,但是会编译成“私有的委托”,所以事件只能在类的内部被调用,类的实例不能被调用。
4、使用事件的练习(窥探微软 的事件)
创建验证控件:
添加一个UserControl控件,设计如下:
写后台代码:
1 public delegate void UserVilidateDel(object sender,MyEventArgs e); 2 3 public partial class UserVilidateControl : UserControl 4 { 5 public UserVilidateControl() 6 { 7 InitializeComponent(); 8 } 9 public event UserVilidateDel UserViliDating; 10 11 private void btnLogin_Click(object sender, EventArgs e) 12 { 13 string userName = txtUserName.Text.Trim(); 14 string pwd = txtPwd.Text.Trim(); 15 MyEventArgs eArgs = new MyEventArgs(); 16 eArgs.UserName = userName; 17 eArgs.Pwd = pwd; 18 eArgs.IsSuccess = false; 19 UserViliDating(this, eArgs); 20 if (eArgs.IsSuccess) 21 { 22 this.txtUserName.BackColor = Color.Blue; 23 this.txtPwd.BackColor = Color.Blue; 24 } 25 else 26 { 27 this.txtUserName.BackColor = Color.Red; 28 this.txtPwd.BackColor = Color.Red; 29 } 30 } 31 } 32 33 public class MyEventArgs 34 { 35 public string UserName { set; get; } 36 public string Pwd { set; get; } 37 public bool IsSuccess { set; get; } 38 }
主窗体添加验证控件:
后台代码:
1 private void Form1_Load(object sender, EventArgs e) 2 { 3 //注册事件 4 userVilidateControl1.UserViliDating += new UserVilidateDel(userVilidateControl1_UserViliDating); 5 } 6 7 //创建对应方法事件 8 void userVilidateControl1_UserViliDating(object sender, MyEventArgs e) 9 { 10 if (e.UserName == "admin" && e.Pwd == "123") 11 { 12 e.IsSuccess = true; 13 } 14 }