• 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         }
  • 相关阅读:
    开源Jabber(XMPP) IM服务器介绍
    ejabberd、jabber、jabberd、xmpp辨析
    分布式与集群的区别
    浅谈Javascript事件模拟
    理清javascript的相关概念 DOM和BOM
    js基础学习第一天(关于DOM和BOM)一
    处理机调度和死锁
    C++11 之 " = delete "
    小数的二进制表示
    二进制数的插入
  • 原文地址:https://www.cnblogs.com/xiaoxiaogogo/p/3571820.html
Copyright © 2020-2023  润新知