c#委托事件简单例子
2009-05-11 10:57
一、委托
委托类似于函数指针,但函数指针只能引用静态方法,而委托既能引用静态方法,也能引用实例方法。

委托使用分三步:1、委托声明。2、委托实例化。3、委托调用。

例程一:
程序代码

using System;

namespace 委托
{
     delegate int NumOpe(int a,int b); //第一步:委托声明
     class Class1
     {
         static void Main(string[] args)
         {
             Class1 c1 = new Class1();
             NumOpe p1 = new NumOpe(c1.Add); //委托实例化,注意参数是要使用的参数名,且不带括号
             Console.WriteLine(p1(1,2)); //委托调用
             Console.ReadLine();
         }

private int Add(int num1,int num2)
         {
             return(num1+num2);
         }
     }
}


例中,委托NumOpe引用了方法Add。
委托声明了以后,就可以象类一样进行实例化,实例化时把要引用的方法(如:Add)做为参数,这样委托和方法就关联了起来,就可以用委托来引用方法了。
委托和所引用的方法必须保持一致:
1、参数个数、类型、顺序必须完全一致。
2、返回值必须一致。

二、事件

事件有很多,比如说鼠标的事件:MouserMove,MouserDown等,键盘的事件:KeyUp,KeyDown,KeyPress。

有事件,就会有对事件进行处理的方法,而事件和处理方法之间是怎么联系起来的呢?委托就是他们中间的桥梁,事件发生时,委托会知道,然后将事件传递给处理方法,处理方法进行相应处理。

比如在WinForm中最常见的是按钮的Click事件,它是这样委托的:this.button1.Click += new System.EventHandler(this.button1_Click);按按钮后就会出发button1_Click方法进行处理。EventHandler就是系统类库里已经声明的一个委托。-------委托实例化,this.buttion1_click为方法名

三、自定义事件及其处理

EventHandler以及其它自定义的事件委托都是一类特殊的委托,他们有相同的形式:

delegate void 事件委托名(object sender,EventArgs e);

object用来传递事件的发生者,比如二中的Button控件就是一个事件发生者;EventArgs用来传递事件的细节。

例程二:

程序代码

using System;

namespace 最简单的自定义事件
{
     /// <summary>
     /// 事件发送类
     /// </summary>
     class Class1
     {
         public delegate void UserRequest(object sender,EventArgs e); //定义委托
         public event UserRequest OnUserRequest; //定义一个委托类型的事件

public void run()
         {
             while(true)
             {
                 if(Console.ReadLine()=="a")
                 {//事件监听
                     OnUserRequest(this,new EventArgs()); //产生事件
                 }
             }
         }
     }

/// <summary>
     /// 事件接收类
     /// </summary>
     class Class2
     {
         static void Main(string[] args)
         {
             Class1 c1 = new Class1();
             c1.OnUserRequest += new Class1.UserRequest(c1_OnUserRequest); //委托实例化后绑定到事件
             c1.run();
         }

private static void c1_OnUserRequest(object sender, EventArgs e)
         {//事件处理方法
             Console.WriteLine("\t你触发了事件!");
         }
     }
}


例程三:
程序代码

using System;

namespace 带事件数据的事件
{
     /// <summary>
     /// 带事件数据的事件类,从EventArgs继承
     /// </summary>
     class OnUserRequestEventArgs:EventArgs
     {
         private string inputText;
         public string InputText
         {
             get
             {
                 return inputText;
             }
             set
             {
                 inputText = value;
             }
         }
     }

/// <summary>
     /// 事件发送类
     /// </summary>
     class Class1
     {
         public delegate void UserRequest(object sender,OnUserRequestEventArgs e);------------->声明委托
         public event UserRequest OnUserRequest;------->定义一个委托类型的事件

public void run()
         {
             while(true)
             {
                 Console.WriteLine("请输入内容:");
                 string a=Console.ReadLine();
                 //if(a=="a")
                 //{
                 OnUserRequestEventArgs e1 = new OnUserRequestEventArgs();
                 e1.InputText = a;
                 OnUserRequest(this,e1);
                 //}
             }
         }
     }

/// <summary>
     /// 事件接收类
     /// </summary>
     class Class2
     {
         [STAThread]
         static void Main(string[] args)
         {
             Class1 c1 = new Class1();
             c1.OnUserRequest += new Class1.UserRequest(c1_OnUserRequest);
             c1.run();
         }

private static void c1_OnUserRequest(object sender, OnUserRequestEventArgs e)
         {
             Console.WriteLine("\t你输入的是:"+e.InputText);
         }
     }
}


例程三跟例程二唯一的差别在于自定义了一个类OnUserRequestEventArgs,从EventArgs继承
------------------------------------------------------------------------------------------

using System;
 
 class TestClass
 {
     static void Main(string[] args)
      {
         EventClass myEventClass = new EventClass();
         myEventClass.CustomEvent += new EventClass.CustomEventHandler(CustomEvent1); // 关联事件句柄;
         myEventClass.CustomEvent += new EventClass.CustomEventHandler(CustomEvent2);
        myEventClass.InvokeEvent();
        myEventClass.CustomEvent -= new EventClass.CustomEventHandler(CustomEvent2);
        myEventClass.InvokeEvent();
        myEventClass.Load += new EventClass.CustomEventHandler(Load1);
        myEventClass.onLoad();
    }

private static void CustomEvent1(object sender, EventArgs e)
    {
        Console.WriteLine("Fire Event 1");
    }

private static void CustomEvent2(object sender, EventArgs e)
    {
        Console.WriteLine("Fire Event 2");
    }
    private static void Load1(object sender, EventArgs e)
    {
        Console.WriteLine("Current background color is {0}. Please input:", System.Console.BackgroundColor.ToString());
    }
}

public class EventClass
{
    public delegate void CustomEventHandler(object sender, EventArgs e);//首先定义一个委托类型的对象CustomEventHandler

//用delegate数据类型声明事件,要用event关键字,这里定义了两个字件;
    public event CustomEventHandler CustomEvent;
    public event CustomEventHandler Load;
       
    public void InvokeEvent()
    {
        CustomEvent(this, EventArgs.Empty);
    }
    public void onLoad()
    {
        Console.BackgroundColor = ConsoleColor.Red;
        Load(this, EventArgs.Empty);
        string s = Console.ReadLine();
        if (s != "yuping")
        {
            Console.WriteLine("You must type 'yuping' for change it !");
        }
        else
        {
            Console.BackgroundColor = System.ConsoleColor.Black;
            Console.Clear();
        }

}
}

  在包含事件声明的类中,声明一个数据类型是委托的这么样的一个对象CustomEventHandler, 它有两个参数(sender和e);在这里使用委托的目的就是在运行中向参数传递方法,并由委托对象生成的实例接收这个参数方法的返回值,因此,在声明委托型的对象时应根据类中的方法结构来定义,或者说在引用类中应当根据委托型对象的结构来生成响应事件的方法结构,比如两者都有哪些类型的参数、返回值的类型,也就是说两者要保持一致。同时,要正确地使用C#中的委托,就必须保持三个步骤:声明??实例化??调用。
       
  在上面的代码中,EventClass 类就体现了这个原则:
  1. 声明委托类型的对象: public delegate void CustomEventHandler(object sender, EventArgs e);
  2. 创建CustomEventHandler对象的实例CustomEvent:public event CustomEventHandler CustomEvent;
  3. 在InvokeEvent()方法中实现了对该事件的调用,引用事件。

--------------------------------------------------------------------------------

public delegate void RunHandler(string name);
  public class Man : IFlay, IRun
  {
    public event EventHandler Speak;
    public event RunHandler Sport;
    public void OnRun(string name)
    {
      if (Sport != null)
      {
        Sport(name);
      }
    }
    public void onSpeak()
    {
      if (Speak != null)
      {
        Speak(this, new EventArgs());
      }
    }
    public string Flay(string name)
    {
      return name + ",飞!";
    }
    public string Run(string name)
    {
      return name + ",跑!";
    }
  }

public interface IRun
  {
    string Run(string name);
  }

public interface IFlay
  {
    string Flay(string name);
  }

//--------------------------调用:

RunHandler rh = new RunHandler((string a) =>
      {
        MessageBox.Show(a);
      });
      rh("fx go zoo!");
      ma.Speak += new EventHandler(ma_Speak);
      ma.onSpeak();
      //ma.Sport += new RunHandler(ma_Sport);
      ma.Sport += delegate(string name)
      {
        MessageBox.Show(name);
      };
      ma.OnRun("fx");

转载于:https://www.cnblogs.com/fx2008/archive/2011/11/10/2244101.html

[转载]c#委托事件简单例子相关推荐

  1. C# 委托+事件的例子:①温度报警②计算器

    计算器 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Dat ...

  2. 一个委托和事件的例子

    一个委托和事件的例子 在以下情况下,请使用委托: 当使用事件设计模式时. 当封装静态方法可取时. 当调用方不需要访问实现该方法的对象中的其他属性.方法或接口时. 需要方便的组合. 当类可能需要该方法的 ...

  3. Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)

    Delegate,Action,Func,匿名方法,匿名委托,事件 (转载) 一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本 ...

  4. c#_委托事件的理解

    我找了三篇写的比较不错的博客,希望对委托和事件的理解有所帮助: 第一篇: 将方法作为方法的参数 我们先不管这个标题如何的绕口,也不管委托究竟是个什么东西,来看下面这两个最简单的方法,它们不过是在屏幕上 ...

  5. 程序员委托事件学习随笔

    委托的声明 public delegate void MyDelegate(string str); 委托是一种特殊的类型(class),用途是来实现对一种方法的封装.在某种事件发生时,自动调用该方法 ...

  6. C#通信之Socket通信的简单例子

    socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 这里构建一个简单的例子 ...

  7. webpack入门之简单例子跑起来

    webpack入门之简单例子跑起来 webpack介绍 Webpack是当下最热门的前端资源模块化管理和打包工具,它可以将很多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源,还可以将按需加载 ...

  8. 图片上传(加水印、缩略图、远程保存)的简单例子

    图片上传(加水印.缩略图.远程保存)的简单例子(应用于51aspx.com) 该源码下载地址:http://51aspx.com/CV/ImageUpload 今天看到xiongeee发的文章使用使用 ...

  9. .net中使用反射的简单例子

    说明:由于工作原因,本人使用反射的机会不是很多,所以没有必要为了炫耀技术而使用这种技术,不过今天有人问到这方面的问题,所以做了一个简单例子,供初学者参考,代码如下: using System; usi ...

最新文章

  1. DPKG命令与软件安装、APT
  2. Data Mining 论文翻译:Deep Learning for Spatio-Temporal Data Mining: A Survey
  3. 回调函数的意义以及python实现
  4. 数字语音信号处理学习笔记——语音信号的数字模型(2)
  5. java list 超出范围_java-列索引超出范围:2,列数1
  6. 手机突然电量消耗很快_手机掉电突然变快?这5点操作你肯定至少做了其中一个!...
  7. [C++] C++ Primer 笔记
  8. 《从零开始学Swift》学习笔记(Day 16)——字典集合
  9. 精功科技押宝互联网服务业 盘古数据承诺未来业绩大逆转
  10. Django 【第六篇】ORM跨表操作(聚合查询,分组查询,F和Q查询等)
  11. python写文件flush_python读写文件write和flush
  12. Acrobat Pro DC 教程,如何填写并签署 PDF 表格?
  13. Error Based Injection和sql注入函数
  14. Python系列之面向对象编程
  15. Arcgis 空间分析—学校选址
  16. 安卓手机上最好的3个txt阅读器
  17. 谷歌浏览器与驱动下载,以及放置位置
  18. Vim文本编辑器及文本处理常用操作
  19. jQuery文件导入
  20. 微信支付公的众号支付和扫码支付

热门文章

  1. c#点击按钮调出另一个窗体_在类库或winform项目中打开另一个winform项目窗体的方法...
  2. 使链接在新窗口中打开
  3. 特斯拉限时赠送4.6万元完全自动驾驶功能,马斯克:市值能涨1000%
  4. 国内首批AI专业毕业生创办的澎思科技,已完成Pre-A轮融资
  5. 图灵奖得主华人高徒发布首款AI芯片!64位RISC-V、高度可编程,低功耗
  6. 上岗乌镇大会安防的智慧警眼“云镜”,是谁家的AR眼镜?
  7. 近千人点赞!哈佛博士放出超多资源,机器学习课程教程小抄全都有
  8. 年底跳槽,都去哪儿?数万从业者的新选择即将揭幕
  9. 软银领投Petuum 9300万美元融资,CMU邢波想让AI走进普通企业
  10. 《代码敲不队》第八次团队作业:Alpha冲刺 第五天