C#中的委托、事件学习笔记

1.委托delegate

委托delegate也是一种类型,在任何可以声明类的地方都可以声明委托,它将方法当做另一个方法的参数进行传递,这样就可以传递不同的方法,完成不同的功能,使程序具有很好的可扩展性。

举例:

假设这里有一台电脑,有人会用它写程序,有人会用它打游戏,有人会用它看电影,有人会用它边听音乐边玩游戏,有人会用它边听音乐边看文档,边上QQ。

这台电脑可以抽象成一个类Computer,里面有个方法DoWork,所有的人都要通过这个方法来做自己的事情。

不用委托的时候我们可以实现一些固定的东西,不够灵活:

例如:

代码如下:

class Program {
        static void Main(string[] args) {
            Computer computer = new Computer();
            computer.DoWork("猪八戒", "在看电影!");
            computer.DoWork("沙和尚", "在写程序!");
            computer.DoWork("孙悟空", "在玩游戏!");
        }
    }

public class Computer {
        public void DoWork(string name, string work) {
            Console.WriteLine("{0}{1}", name, work);
        }
    }

上面的代码,很死板,调用DoWork的时候只能做一件事情。

所以下面轮到委托登场了。

代码如下:

代码如下:

public delegate void WorkEventHandle(string name);

class Program {
        static void Main(string[] args) {
            Computer computer1 = new Computer();
            WorkEventHandle work = Do1;
            computer1.DoWork("孙悟空", work);

Console.WriteLine("");

work = Do2;
            computer1.DoWork("八戒", Do2);
        }

static void Do1(string name) {
            Console.WriteLine("{0}在上QQ!", name);
            Console.WriteLine("{0}在听音乐!", name);
            Console.WriteLine("{0}在玩游戏!", name);
        }

static void Do2(string name) {
            Console.WriteLine("{0}在听音乐!", name);
            Console.WriteLine("{0}在写代码!", name);
        }
    }

public class Computer {
        public void DoWork(string name, WorkEventHandle Work) {
            Work(name);
        }
    }

委托总结:

优点:委托可以作为方法的一个参数来传递。谁要调用Computer里的DoWork来完成自己的事情,谁就实现委托绑定的方法,这样就可以按照自己的需求传递不同的方法,使程序具有了很好的扩展性。

缺点:我们可以随意的给委托进行赋值,这样就破坏了程序的封装性。

2. 事件

为了弥补委托的缺陷,所以事件出现了,我们只能对事件进行“+=”和“-=”操作,不可以对事件进行赋值(=)操作。
上面的实例用事件实现如下:

代码如下:

public delegate void WorkEventHandle(string name);

class Program {
        static void Main(string[] args) {
            Computer computer1 = new Computer();
            computer1.Work += new WorkEventHandle(Do1);

computer1.DoWork("孙悟空");

Console.WriteLine("");
            computer1.Work += new WorkEventHandle(Do2);

computer1.DoWork("八戒");
        }

static void Do1(string name) {
            Console.WriteLine("{0}在上QQ!", name);
            Console.WriteLine("{0}在听音乐!", name);
            Console.WriteLine("{0}在玩游戏!", name);
        }

static void Do2(string name) {
            Console.WriteLine("{0}在听音乐!", name);
            Console.WriteLine("{0}在写代码!", name);
        }
    }

public class Computer {
        public event WorkEventHandle Work;
        public void DoWork(string name) {
            if (Work != null) {
                Work(name);
            }
        }
    }

总结:

委托既可以进行“+=”和“-=”操作,也可以进行赋值(=)操作,委托不具有封装性
事件只可以进行“+=”和“-=”操作,事件具有封装性。

(0)

相关推荐

  • C#事件用法实例浅析

    本文实例讲述了C#事件用法.分享给大家供大家参考.具体分析如下: EventHandler<TEventArgs>的定义如下 public delegate void EventHandler<TEventArgs>(object sender,TEventArgs e) where TEventArgs:EventArgs 第一个参数必须是object类型(是一个对象,包含事件的发送者) 第二个参数是T类型(即泛型),定义了一个T的约束,它必须派生自基类EventArgs Car

  • C#自定义事件及用法实例

    本文实例讲述了C#自定义事件及用法.分享给大家供大家参考.具体分析如下: 事件是C#中一个重要的内容,MSDN上有一个自定义事件的演示示例.我看了半天有点晕,所以新建了一个winform工程添加了一个按钮,然后找出调用的程序,一对比做了一个类似的示例,就明白了.看代码有时候比看文档来得更快. 所以还是一贯的原则,来干的,不来稀的. using System; namespace TestEventArgs { /// <summary> /// 这个类对应于EventArgs,做对比学习. /

  • 详解C#编程中.NET的弱事件模式

    引言 你可能知道,事件处理是内存泄漏的一个常见来源,它由不再使用的对象存留产生,你也许认为它们应该已经被回收了,但不是,并有充分的理由. 在这个短文中(期望如此),我会在 .Net 框架的上下文事件处理中展示这个问题,之后我会教你这个问题的标准解决方案,弱事件模式.有两种方法,即: "传统"方法 (嗯,在 .Net 4.5 前,所以也没那么老),它实现起来比较繁琐 .Net 4.5 框架提供的新方法,它则是尽其可能的简单 (源代码在 这里 可供使用.) 从常见事物开始 在一头扎进本文核

  • C#处理Paint事件的方法

    本文实例讲述了C#处理Paint事件的方法.分享给大家供大家参考.具体方法如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication2 { public parti

  • C#自定义事件监听实现方法

    本文实例讲述了C#自定义事件监听实现方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApp { /// <summary> /// 定义事件 /// </summary> class CustomEvent { /// <summary> /// 定义委托 /// &

  • C#3.0使用EventLog类写Windows事件日志的方法

    本文实例讲述了C#3.0使用EventLog类写Windows事件日志的方法.分享给大家供大家参考.具体如下: 在程序中经常需要将指定的信息(包括异常信息和正常处理信息)写到日志中.在C#3.0中可以使用EventLog类将各种信 息直接写入Windows日志.EventLog类在System.Diagnostics命名空间中.我们可以在"管理工具" > "事件查看器"中 可以查看我们写入的Windows日志 下面是一个使用EventLog类向应用程序(App

  • C#基本打印事件用法实例

    本文实例讲述了C#基本打印事件用法.分享给大家供大家参考.具体如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication3 { public partial cla

  • C#中datagridview的EditingControlShowing事件用法实例

    本文实例讲述了C#中datagridview的EditingControlShowing事件用法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using datagridv

  • 理解C#中的事件

    前面文章中介绍了委托相关的概念,委托实例保存这一个或一组操作,程序中将在某个特定的时刻通过委托实例使用这些操作. 如果做过GUI程序开发,可能对上面的描述会比较熟悉.在GUI程序中,单击一个button会触发一个click事件,然后会执行一系列的操作,这一系列的操作就被存放在一个委托实例中. 接下来我们就看看事件. 使用委托中的问题 回到前面文章中苹果和富士康的例子,苹果将iphone的组装.包装和运输的工作全部委托给了富士康. 根据上面的描述,我们修改了一下代码,在Apple这个类中加入一个订

  • 结合Visual C#开发环境讲解C#中事件的订阅和取消订阅

    类或对象可以通过事件向其他类或对象通知发生的相关事情.发送(或引发)事件的类称为"发行者",接收(或处理)事件的类称为"订户". 在典型的 C# Windows 窗体或 Web 应用程序中,可订阅由控件(如按钮和列表框)引发的事件.可使用 Visual C# 集成开发环境 (IDE) 来浏览控件发布的事件,选择要处理的事件.IDE 会自动添加空事件处理程序方法和订阅事件的代码. 事件概述 事件具有以下特点: 发行者确定何时引发事件,订户确定执行何种操作来响应该事件.

随机推荐