六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

.Net邊學邊講(3)

[摘要]談到event,就不能不先說一下callback和delegate如果你使用過C的話,你應該知道有一個函數叫qsort,是用來給數組排序的。但這個函數顯然不能承擔廣泛意義上的比較,因此你需要傳遞一個指針,他指向具有比較功能的函數。qsort在每次要比較數組元素時都要調用這個函數。這就是callba...
談到event,就不能不先說一下callback和delegate
如果你使用過C的話,你應該知道有一個函數叫qsort,是用來給數組排序的。但這個函數顯然不能承擔廣泛意義上的比較,因此你需要傳遞一個指針,他指向具有比較功能的函數。qsort在每次要比較數組元素時都要調用這個函數。這就是callback的概念,在.Net里也可以實現回調,方法是創建一個接口,實現他,傳遞一個實現此接口的對象的引用。delegate呢,你可以將他理解成一個安全的函數指針。
Notifications跟callback有點類似,但比簡單的回調要復雜的多。callback意味著要調用的callback方法被調用的同時要調用的建立callback的方法。這是一個很緊密的耦合。而Notification則要松散一些,你可以注冊將來某段時間會或者不會發生的Notification,只當他們發生時處理,否則不用。
你也許想讓你寫的組件當一些事情發生時通知其他組件,例如,你想寫一個按鈕組件,當你Click的時候你可能想通知其他組件,而其他組件將不得不準備向你請求Notification,你就要提供一個方法告訴他們你已經有一個可用的Notification。另一方面,你可能也是當其它組件的一些事情發生時希望被通知的人。這時你就需要找到那個特定組件可以提供什么Notification。
在.Net中event是一個你用來廣播、引發、處理Notification的機制。大致是這樣的,可以引發事件的組件聲明這一事件。而希望處理某一特定組件的某一特定事件的組件通過傳遞一個方法的delegate向引發事件的組件注冊。這樣,當事件發生時引發事件的組件就會調用每個已注冊的方法。通過delegate和event我們可以實現異步調用的功能。在C#中是這樣聲明一個代理的:public delegate void LogHandler(String message);代理在處理這種回調時已經是很強大了。但是當我們需要代理被存儲以便以后的Notification,就有一點麻煩了。比如說我們有一個對象Button,有一個Click事件。我們可以聲明一個ClickHandler 的代理類型用于處理Click事件,在我們的Button的Class中聲明一個ClickHandler的public實例,這樣其他組件希望Click發生時被通知,就可以簡單的把他的代理加到Click代理中去。myButton.Click += new ClickHandler(MyMethod);
看上去著好像沒什么問題。但是這里卻存在一個大問題,我們聲明Click代理是public,這違反了我們以前說過的data fields永遠不要聲明成public,這會有一系列麻煩。解決的辦法是聲明成private或protected,然后用屬性解決讀寫。這樣我們可以private聲明Click,在寫一對public方法去增加一個listener及減少一個listener。當然在.Net中,當你聲明一個event時,.Net已經為你做好這一切了。聲明一個事件:
class AlarmTimer {
public event EventHandler Alarm;
// ...
}
這段代碼說明AlarmTimer可以向所有其它對象廣播它可以引發一個叫Alarm的事件。Alarm事件用的是EventHandler代理類型。EventHandler:無返回值、接受兩個參數(Object:指向事件的發送者,EventArgs:包含關于事件的數據)
看一個例子:
class AlarmTimer {
public event EventHandler Alarm;
private Timer myTimer;
public AlarmTimer() {
myTimer = new Timer();
myTimer.Tick += new EventHandler(OnTick);
}
public void Set(Double seconds) {
myTimer.Interval = (Int32)(seconds * 1000);
myTimer.Start();
}
protected void OnTick(Object sender, EventArgs e) {
myTimer.Stop();
if (Alarm != null) Alarm(this, EventArgs.Empty);
}
public void ReEnable() {
myTimer.Enabled = true;
}
}
注意AlarmTimer既引發事件(Alarm)又處理事件(Timer中的Tick事件)
static AlarmTimer myAlarm = new AlarmTimer();
public static void TestEvent() {
myAlarm.Alarm += new EventHandler(TimerEventProcessor);
myAlarm.Set(2);
Console.WriteLine("Timer is set; alarm will go off in two seconds");
Application.Run();
}
//處理事件
private static void TimerEventProcessor(
Object myObject, EventArgs myEventArgs) {
if (MessageBox.Show("Wake up! Continue ringing?",
"Count is: " + alarmCounter,
MessageBox.YesNo) == DialogResult.Yes) {
alarmCounter += 1;
myAlarm.ReEnable();
}
else {
Application.Exit();
}
}
注意:Object和EventArgs不是必需的參數,只是這是一個好的寫法模式而已
關于event還有好多沒有說,留著以后慢慢說吧。





主站蜘蛛池模板: 日本在线观看永久免费网站 | 在线免费视频你懂的 | 污污小视频在线观看 | 色狠狠色综合久久8狠狠色 色狠狠色综合吹潮 | 婷婷开心激情网 | 欧美在线一级视频 | 日韩三级免费观看 | 四虎国产精品永免费 | 天天干天天玩天天操 | 亚洲丁香婷婷综合久久六月 | 亚洲成a人v欧美综合天堂下载 | 日本不卡在线一区二区三区视频 | 在线视频一区二区三区 | 日本人欧美xx | 三级韩国一区久久二区综合 | 日本爽爽爽爽爽爽在线观看免 | 在线播放亚洲视频 | 亚洲a在线观看 | 日不卡 | 青草视频在线观看完整版 | 日本精品一区 | 四虎澳门永久8848在线影院 | 中文字幕 一区 婷婷 在线 | 日韩欧美亚洲综合一区二区 | 四虎在线观看一区二区 | 色吊丝国产永久免费网址 | 日本一区二区三区中文字幕视频 | 青草久久影院 | 日本aⅴ在线不卡免费观看 日本aⅴ在线 | 四虎永久在线精品国产馆v视影院 | 中文字幕免费在线视频 | 日本道综合一本久久久88 | 日本精品高清一区二区2021 | 人人草97 | 日本免费网站在线观看 | 五月综合激情视频在线观看 | 在线视频第一页 | 亚洲免费看片 | 午夜爱爱爱爱爽爽爽网站免费 | 午夜视频久久久久一区 | 真实国产乱子伦精品一区二区三区 |