程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 事件的標准模式,事件標准模式

事件的標准模式,事件標准模式

編輯:C#入門知識

事件的標准模式,事件標准模式


摘自http://www.cnblogs.com/willick/p/4172174.html,僅供參考學習

.NET框架為事件編程定義了一個標准模式,設定這個標准是為了讓.NET框架和用戶代碼保持一致。System.EventArgs是標准模式的核心,它是一個沒有任何成員,用於傳遞事件參數的基類,首先定義EventArgs:

1  public class PriceChangeEventArgs : System.EventArgs {
2         public readonly decimal oldPrice;
3         public readonly decimal newPrice;
4         public PriceChangeEventArgs(decimal oldPrice, decimal newPrice) {
5 
6             this.oldPrice = oldPrice;
7             this.newPrice = newPrice;
8         }
9     }

然後為事件定義委托,必須滿足以下條件:

  • 必須是 void 返回類型;
  • 必須有兩個參數,且第一個是object類型,第二個是EventArgs類型(的子類);
  • 它的名稱必須以EventHandler結尾。

由於考慮到每個事件都要定義自己的委托很麻煩,.NET 框架為我們預定義好一個通用委托System.EventHandler<TEventArgs>:

public delegate void EventHandler<TEventArgs> (object source, TEventArgs e) where TEventArgs : EventArgs;

如果不使用框架的EventHandler<TEventArgs>,我們需要自己定義一個:

public delegate void PriceChangedEventHandler (object sender, PriceChangedEventArgs e);

如果不需要參數,可以直接使用EventHandler(不需要<TEventArgs>)。有了EventHandler<TEventArgs>,我們就可以這樣定義示例中的事件:

public class IPhone6 {
    ...
    public event EventHandler<PriceChangedEventArgs> PriceChanged;
    ...
}

最後,事件標准模式還需要寫一個受保護的虛方法來觸發事件,這個方法必須以On為前綴,加上事件名(PriceChanged),還要接受一個EventArgs參數,如下:

1 public class IPhone6 {
2     ...
3     public event EventHandler<PriceChangedEventArgs> PriceChanged;
4     protected virtual void OnPriceChanged(PriceChangedEventArgs e) {
5         if (PriceChanged != null) PriceChanged(this, e);
6     }
7     ...
8 }

下面給出完整示例:

public class PriceChangedEventArgs : System.EventArgs {
    public readonly decimal OldPrice;
    public readonly decimal NewPrice;
    public PriceChangedEventArgs(decimal oldPrice, decimal newPrice) {
        OldPrice = oldPrice;
        NewPrice = newPrice;
    }
}

public class IPhone6 {
    decimal price;
    public event EventHandler<PriceChangedEventArgs> PriceChanged;

    protected virtual void OnPriceChanged(PriceChangedEventArgs e) {
        if (PriceChanged != null) PriceChanged(this, e);
    }

    public decimal Price {
        get { return price; }
        set {
            if (price == value) return;
            decimal oldPrice = price;
            price = value;
            // 如果調用列表不為空,則觸發。
            if (PriceChanged != null)
                OnPriceChanged(new PriceChangedEventArgs(oldPrice, price));
        }
    }
}

class Program {
    static void Main() {
        IPhone6 iphone6 = new IPhone6() { Price = 5288M };
        // 訂閱事件
        iphone6.PriceChanged +=iphone6_PriceChanged;

        // 調整價格(事件發生)
        iphone6.Price = 3999;
        Console.ReadKey();
    }

    static void iphone6_PriceChanged(object sender, PriceChangedEventArgs e) {
        Console.WriteLine("年終大促銷,iPhone 6 只賣 " + e.NewPrice + " 元, 原價 " + e.OldPrice + " 元,快來搶!");
    }
}

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