我是對java了解相對較多,而對C#則是因工作需要才去看了一下,C#跟Java在語法上非常相似,而最初讓我比較困惑的就是委托、事件部分,相信大多數初學者也有類似的困惑。經過跟Java的對比學習,發現這其實跟Java的監聽、事件是等同的,只是表述上不同罷了。
委托+事件是觀察者模式的一個典型例子,所謂的委托其實就是觀察者,它會關心某種事件,一旦這種事件被觸發,這個觀察者就會行動。
下面是最近寫的一個例子,相信能夠加深大家對委托和事件的理解。
using System;using System.Collections.Generic;using System.Text;namespace Consoleapplication1{ //聲明一個委托 public delegate void TimeEventHandler(object obj, TimeEventArgs args); class PRogram { static void Main(string[] args) { Clock clock = new Clock(); //實例化一個時鐘 MyClassEventHandler tehc = new MyClassEventHandler(); //實例化一個觀察者類 //將事件跟我們定義的觀察者進行連接 //這樣,clock就會知道,每當TimeChanged事件被觸發,就會去通知這個觀察者 //注意我們連接的時候使用的并不是直接的觀察者類實例中的ShowTime()方法 //而是一個委托,并在這個委托中傳遞ShowTime()方法,這也是"委托"的真正意義所在: //我有一個方法,但我委托你來幫我關聯到事件,因為事件只會直接跟委托打交道, //而不是觀察者的具體某個方法 clock.TimeChanged += new TimeEventHandler(tehc.ShowTime); clock.go(); } } //TimeEventArgs是我們自己定義的一個類,用于保存事件中的參數.這里我們分別保存時間的時分秒 public class TimeEventArgs:EventArgs { private int hour; private int minute; private int second; public TimeEventArgs(int hour,int minute,int second) { this.hour = hour; this.minute = minute; this.second = second; } public int Hour{ get { return this.hour; } } public int Minute { get { return this.minute; } } public int Second { get { return this.second; } } } //觀察者類,它有一個符合我們上面定義的"委托"的方法 //也就是void ShowTime(object obj,TimeEventArgs args) //從這個方法的定義可以看到,我們只會關心返回類型和方法的參數,而方法名稱則無所謂 class MyClassEventHandler { public void ShowTime(object obj,TimeEventArgs args) { Console.WriteLine("現在時間:"+args.Hour+":" + args.Minute + ":" + args.Second); } } //時鐘類 class Clock { //我們在這個類中定義了一個"TimeChanged"事件,注意其前面有兩個關鍵字"event"和"TimeEventHandler" //其中event表示這是一個事件,而不是方法或屬性,TimeEventHandler則指出,誰要監聽TimeChanged事件,它就必須有一個符合TimeEventHandler(委托)的方法 public event TimeEventHandler TimeChanged; public Clock() { //注意,這里的null的含義是指TimeChanged事件當前還沒有觀察者關注它 //如果某個觀察者要關注TimeChanged事件,它必須要讓這個事件知道,方法是使用操作符"+="來借助委托將其加載到事件上 TimeChanged = null; } //時鐘開始走動,我們的目標是每秒鐘觸發一次TimeChanged事件 public void go() { DateTime initi = DateTime.Now; int h1 = initi.Hour; int m1 = initi.Minute; int s1 = initi.Second; while (true) { DateTime now = DateTime.Now; int h2 = now.Hour; int m2 = now.Minute; int s2 = now.Second; if (s2 != s1) { h1 = h2; m1 = m2; s1 = s2; //首先建立一個TimeEventArgs對象來保存相關參數,這里是時分秒 TimeEventArgs args = new TimeEventArgs(h2, m2, s2); //注意這種寫法,這一句是用來觸發事件,事件不是類,所以不用使用"new"關鍵字,而且我們看到,這里TimeChanged的兩個參數跟我們的委托(TimeEventHandler)是一致的 //其中第一個參數是觸發這個事件的對象,我們這里使用的是一個時鐘實例(this) TimeChanged(this, args); } } } }}

轉載自:http://ruizhinet.blog.163.com/blog/static/99213828200901110564999/
新聞熱點
疑難解答