• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 理解C#中的事件

理解C#中的事件

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#中的委托和事件,c#中的事件,c#中键盘事件,c#中textbox事件,c#中鼠标事件等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

前面文章中介绍了委托相关的概念,委托实例保存这一个或一组操作,程序中将在某个特定的时刻通过委托实例使用这些操作。

如果做过GUI程序开发,可能对上面的描述会比较熟悉。在GUI程序中,单击一个button会触发一个click事件,然后会执行一系列的操作,这一系列的操作就被存放在一个委托实例中。

接下来我们就看看事件。

使用委托中的问题

回到前面文章中苹果和富士康的例子,苹果将iphone的组装、包装和运输的工作全部委托给了富士康。

根据上面的描述,我们修改了一下代码,在Apple这个类中加入一个订单属性,苹果只要接到新的订单,就发送一个通知给富士康,然后富士康就会执行一系列的操作了(组装、包装和运输)。

在主程序中,苹果将iphone的组装、包装和运输工作委托给了富士康,然后苹果每次收到订单,就会通过委托实例"VerdorToAssembleIphone"让富士康去执行一系列操作。
class Apple
{
    //声明委托类型
    public delegate void AssembleIphoneHandler(int num);
    public AssembleIphoneHandler VerdorToAssembleIphone;

    public void DesignIphone()
    {
        Console.WriteLine("Design Iphone By Apple");
    }

    private int orderNum;
    public int OrderNum
    {
        get { return this.orderNum; }
        set
        {
            this.orderNum = value;
            if (VerdorToAssembleIphone != null)
            {
                VerdorToAssembleIphone(this.orderNum);
            }
        }
    }
}

class Foxconn
{
    //与委托类型签名相同的方法
    public void AssembleIphone(int num)
    {
        Console.WriteLine("Assemble {0} Iphone By Foxconn", num);
    }

    public void PackIphone(int num)
    {
        Console.WriteLine("Pack {0} Ipnone By Foxconn", num);
    }

    public void ShipIphone(int num)
    {
        Console.WriteLine("Ship {0} Iphone By Foxconn", num);
    }
}


class Program
{
    static void Main(string[] args)
    {
        Apple apple = new Apple();
        Foxconn foxconn = new Foxconn();
        apple.VerdorToAssembleIphone = new Apple.AssembleIphoneHandler(foxconn.AssembleIphone);
        apple.VerdorToAssembleIphone += new Apple.AssembleIphoneHandler(foxconn.PackIphone);
        apple.VerdorToAssembleIphone += new Apple.AssembleIphoneHandler(foxconn.ShipIphone);

        apple.OrderNum = 100;
    
        Console.Read();
    }
}
</div>

下面我们看下这个例子实现中的问题:

如果用户在建立委托链的时候错误的使用了"="而不是"+=",那么委托链就断了
在主程序中,我们可以绕过设置订单这一步,直接调用委托实例"apple.VerdorToAssembleIphone(99);"来让富士康执行操作,这点是不合理的
class Program
{
    static void Main(string[] args)
    {
        Apple apple = new Apple();
        Foxconn foxconn = new Foxconn();

        //创建委托实例
        apple.AssembleIphone = new Apple.AssembleIphoneHandler(foxconn.AssembleIphone);
        apple.AssembleIphone += new Apple.AssembleIphoneHandler(foxconn.PackIphone);
        apple.AssembleIphone = new Apple.AssembleIphoneHandler(foxconn.ShipIphone);
        apple.DesignIphone();
       
        //委托实例的调用
        apple.VerdorToAssembleIphone(99);
    
        Console.Read();
    }
}
</div>

事件的出现

为了解决上面两个问题,出现了事件这个概念,我们要做的改变只是在声明委托实例的时候加上event关键字。
public event AssembleIphoneHandler VerdorToAssembleIphone;
</div>
这时,上面两处有问题的代码就会在编译的时候报错了。   

上面的问题是解决了,但是event关键字作用是什么,事件跟委托有什么关系,"VerdorToAssembleIphone"怎么理解?

深入理解事件

其实,下面这个语句还是比较难理解的,看到的第一反应就是,委托跟事件到底是什么关系,event关键字跟委托类型"AssembleIphoneHandler"是什么关系。
public event AssembleIphoneHandler VerdorToAssembleIphone;
</div>
其实,事件可以理解成一个委托的属性,通过对委托实例的封装来对委托实例的访问进行一些限制。下面我们通过IL来查看一下这个个程序,得到下图。

下面我们就结合IL的查看结果来分析事件到底是什么。在开始之前,相信大家一定都熟悉属性(property)这个概念吧,那就让我们从熟悉的属性开始分析。

C#属性的概念

首先来看看我们熟悉的东西,"OrderNum"是我们定义的一个订单数量的属性(property),它有一组get/set方法。通过这个属性的get/set方法,我们可以访问"orderNum"字段(field)。

通过IL查看"OrderNum"这个属性,我们可以看到这个属性对应的get/set方法。
public int32 get_OrderNum() { }
public void set_OrderNum(int32 'value') { }
</div>
事件

接下来再看"VerdorToAssembleIphone"事件,我们按照属性的方式去理解事件,从IL的截图中,可以看到事件中有一对addon/removeon方法来操作我们的委托实例(想想属性的get/set方法

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#中的委托使用
  • 理解C#中的事件
  • C#中的委托介绍
  • C#中的事件介绍

相关文章

  • 2017-05-28.net2.0+ Winform项目实现弹出容器层
  • 2017-05-28浅谈C# 非模式窗体show()和模式窗体showdialog()的区别
  • 2017-05-28C# 6.0的属性(Property)的语法与初始值详解
  • 2017-05-28使用C#调用系统API实现内存注入的代码
  • 2017-05-28举例讲解C#中自动实现的属性
  • 2017-05-28C#实现winform自动关闭MessageBox对话框的方法
  • 2017-05-28C#处理Paint事件的方法
  • 2017-05-28c#实现KTV点歌系统
  • 2017-05-28C#中实现抽象类里建立静态方法
  • 2017-05-28轻松学习C#的正则表达式

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • WinForm项目开发中WebBrowser用法实例汇总
    • C#学习进阶Hello World的17种写法代码分享
    • C/C++ 传递动态内存的深入理解
    • .Net WInform开发笔记(三)谈谈自制控件(自定义控件)
    • C#生成唯一不重复订单号
    • C#中DataGridView动态添加行及添加列的方法
    • C#实现写入与读出文本文件的实例代码
    • C#实现鼠标移动到曲线图上显示值的方法
    • c#中虚函数的相关使用方法
    • C#、ASP.NET通用扩展工具类之LogicSugar

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有