zoukankan      html  css  js  c++  java
  • 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         }
  • 相关阅读:
    Angular指令2
    MD测试
    LeeCX
    Java公众号推荐
    基于云落地SLB+Tengine实现高可用集群负载均衡
    非HTTP状态下开启web视频的临时方案
    慕课网 20200330 es+geo+baidu-map 直播视频与文字版笔记
    [涨姿势]Chrome 谷歌浏览器原生截长图命令
    人人都要关注的分布式系统中的CAP理论
    疫情风险下的项目管理与紧急预案策略
  • 原文地址:https://www.cnblogs.com/xiaoxiaogogo/p/3571820.html
Copyright © 2011-2022 走看看