大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C#技巧 > c#之委托和事件的区别

c#之委托和事件的区别

关键词:委托区别事件  阅读(673) 赞(10)

[摘要]委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

下面开始对事件进行介绍

1、定义事件以及事件的编译原理

首先定义事件对应的委托:

 public delegate void ThreeClickEventDel();

然后对应事件变量:(其实就是在委托前面加一个event)

public event ThreeClickEventDel ThreeClickEvent;

反编译之后:是:一个“私有委托”和两个“公有”的“add”和“remover”方法

1)因为是私有委托:所以只有类的内部可以调用,在类外部就不能被调用。创建的类的实例也是不能调用的。所以事件是安全的。因为私有,所以不能使用 “=”对事件进行赋值

2)因为有 “公有” 的add 和 remove,,所以 类的实例 可以对事件 进行 “+=”和“-=”对事件进行 添加 事件和 删除事件(所以在类的外部可以对事件进行赋值,但是不能调用)

2、委托和事件的区别:

1、委托时数据类型,但是 事件 是数据类型的变量(并且是私有委托)

2、委托可以在类的外部被调用,但是事件不能再类的外部,通过类的实例进行调用(因为是私有委托)

3、委托可以通过“=”、“+=”、“-=”进行赋值,但是事件只能通过“+=”和“-=”对事件进行赋值。(因为事件是私有委托),委托也能注册事件,为什么会衍生出事件呢?

 委托注册事件:

     //定义一个委托
     public delegate void JingGaoDel();
     class Program
     {
         static void Main(string[] args)
         {
             GuoluFang Guolu = new GuoluFang();
             //为 委托注册 事件
             Guolu.jingGao = delegate()
             {
                 Console.WriteLine("水已经烧开了!");
             };
             for (int i = 0; i <100; i++)
             {
                 Guolu.ShaoShui();
             }
             Console.ReadKey();
         }
     }

为什么衍生事件:

1、因为事件只能通过“+=”和“-=”进行赋值,所以可以避免像委托那样(可能用“=”赋值将原有的事件冲掉)。

2、事件虽然是public 定义的,但是会编译成“私有的委托”,所以事件只能在类的内部被调用,类的实例不能被调用。

4、使用事件的练习(窥探微软 的事件)

 创建验证控件:

添加一个UserControl控件,设计如下:

写后台代码:

     public delegate void UserVilidateDel(object sender,MyEventArgs e);
 
     public partial class UserVilidateControl : UserControl
     {
         public UserVilidateControl()
         {
             InitializeComponent();
         }
         public event UserVilidateDel UserViliDating; 
 
         private void btnLogin_Click(object sender, EventArgs e)
         {
             string userName = txtUserName.Text.Trim();
             string pwd = txtPwd.Text.Trim();
             MyEventArgs eArgs = new MyEventArgs();
             eArgs.UserName = userName;
             eArgs.Pwd = pwd;
             eArgs.IsSuccess = false;
             UserViliDating(this, eArgs);
             if (eArgs.IsSuccess)
             {
                 this.txtUserName.BackColor = Color.Blue;
                 this.txtPwd.BackColor = Color.Blue;
             }
             else
             {
                 this.txtUserName.BackColor = Color.Red;
                 this.txtPwd.BackColor = Color.Red;
             }
         }
     }
 
     public class MyEventArgs
     {
         public string UserName { set; get; }
         public string Pwd { set; get; }
         public bool IsSuccess { set; get; }
     }
控件后台代码

主窗体添加验证控件:

后台代码:

         private void Form1_Load(object sender, EventArgs e)
         {
             //注册事件
             userVilidateControl1.UserViliDating += new UserVilidateDel(userVilidateControl1_UserViliDating);
         }
 
         //创建对应方法事件
         void userVilidateControl1_UserViliDating(object sender, MyEventArgs e)
         {
             if (e.UserName == "admin" && e.Pwd == "123")
             {
                 e.IsSuccess = true;
             }
         }

相关C#技巧推荐

    暂时没有相关推荐



    相关评论