程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> [叩響C#之門]寫給初學者:自定義事件

[叩響C#之門]寫給初學者:自定義事件

編輯:關於C#

16.4.2自定義事件

通過上一節的論述,我們知道要創建一個事件驅動的程序需要下面的步 驟:

1.聲明關於事件的委托;

2.聲明事件;

3.編寫觸發事件的函數;

4.創建事 件處理程序;

5.注冊事件處理程序;

6.在適當的條件下觸發事件.

現在我們來編寫一 個自定義事件的程序.主人養了一條忠實的看門狗,晚上主人睡覺的時候,狗負責看守房子.一旦有小偷進來 ,狗就發出一個Alarm事件,主人接到Alarm事件後就會采取相應的行動.假設小偷於2009年元旦午夜時分到 達.

作者:梁斌玉 摘自《C#初學課堂》

本章目錄

第16章 委托與事件

16.1委 托

16.2多播委托

16.3匿名函數

16.4事件處理機制

16.4.1事件處理機制的原 理

16.4.2自定義事件

試一試:自定義事件

//事件發送者

class Dog
  {

//1.聲明關於事件的委托;

public delegate void AlarmEventHandler(object sender, EventArgs e);

//2.聲明事件;

public event AlarmEventHandler Alarm;

//3.編寫引發事件的函數;

public void OnAlarm()
    {
      if (this.Alarm != null)
      {
          Console.WriteLine("\n狗報警: 有小偷進來了,汪汪~~~~~~~");
        this.Alarm(this, new EventArgs());  //發出警報
      }
     }
  }

  //事件接收者
  class Host
   {

//4.編寫事件處理程序

void HostHandleAlarm(object sender, EventArgs e)
    {
      Console.WriteLine("主 人: 抓住了小偷! ");
    }

//5.注冊事件處理程序

public Host(Dog dog)
    {
      dog.Alarm += new Dog.AlarmEventHandler(HostHandleAlarm);
    }
  }

//6.現在來觸發事件

class Program
   {
    static void Main(string[] args)
    {
      Dog dog = new Dog();
      Host host = new Host(dog);

      //當前時間,從2008 年12月31日23:59:50開始計時
      DateTime now = new DateTime (2008,12,31,23,59,50);
      DateTime midnight = new DateTime(2009, 1, 1, 0, 0, 0);

      //等待午夜的到來
      Console.WriteLine("時間一 秒一秒地流逝...");
      while (now < midnight)
      {
        Console.WriteLine("當前

當午夜時分小偷到達時,dog調用 dog.OnAlarm()函數,從而觸發Alarm事件,於是系統找到並執行了注冊在Alarm事件中的事件處理程序 HostHandleAlarm().

事件處理委托習慣上 以EventHandler結尾,比如AlarmEventHandler。事件Alarm實際上是事件處理委托AlarmEventHandler的 一個實例。引發事件的代碼常常被編寫成一個函數,.NET約定這種函數的名稱為 “OnEventName”,比如OnAlarm()的函數。在Host類中,我們定義了事件處理程序 HostHandleAlarm(),並把它注冊到dog.Alarm事件中。

事件處理程序的參數 應該和事件委托相同。一般情況下,事件處理程序接受兩個參數,一個是事件的發送者sender,一個是事 件參數e[①]。事件參數用於在發送者和接收者之間傳遞信息。

.NET提供了100個事件 參數類,這些都繼承於EventArgs類.一般情況下,使用.NET自帶的類足夠了,但為了說明原理,我們自定義一 個事件參數類.

試一試:使用事件參數

//事件參數
  public class NumberOfThiefEventArgs : EventArgs
  {
    public int numberOfThief;

    //構造函數
    public NumberOfThiefEventArgs(int number)
     {
      numberOfThief = number;
    }
  }

  //事 件發送者
  class Dog
{

//1.聲明關於事件的委托;

public delegate void AlarmEventHandler(object sender, NumberOfThiefEventArgs e);

//2. 聲明事件;

public event AlarmEventHandler Alarm;

//3.編寫引發事件的 函數,注意多了個參數;

public void OnAlarm(NumberOfThiefEventArgs e)
     {
      if(this.Alarm != null)
      {
         Console.WriteLine("\n狗報警: 有小偷進來了,汪汪~~~~~~~\n");
        this.Alarm(this, e);
      }
    }
  }

  //事件接收者
  class Host
  {

//4.編寫事件處理程序,參數中包 含著numberOfThief信息

void HostHandleAlarm(object sender, NumberOfThiefEventArgs e)
    {
      if (e.numberOfThief <= 1)
      {
         Console.WriteLine("主 人: 抓住了小偷!");
      }
       else
      {
        Console.WriteLine("主 人:打110報警 ,我家來了{0}個小偷!", e.numberOfThief);
      }
    }

//5.注冊事件處理程序

public Host(Dog dog)
    {
       dog.Alarm += new Dog.AlarmEventHandler(HostHandleAlarm);
    }
  }

//6.現在來觸發事件

class Program
  {
    static void Main(string[] args)
    {
      Dog dog = new Dog();
       Host host = new Host(dog);

      //當前時間,從2008年12月31日23:59:50開 始計時
      DateTime now = new DateTime(2008,12,31,23,59,50);
       DateTime midnight = new DateTime(2009, 1, 1, 0, 0, 0);

      //等待午夜的到 來
      Console.WriteLine("時間一秒一秒地流逝...");
       while (now < midnight)
      {
        Console.WriteLine("當 前

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved