c#中事件基於委託,要理解事件要先理解委託,如果覺得自己關於委託不是很了解可以看看我前面寫委託的文章
使用委託時,一般會出現兩種角色:廣播者(發布者)和訂閱者,這是乙個非常常見的模型
using system;
class program
}// 定義「發布」委託
public delegate void publishhandler();
}class 使用者
}
訂閱者是使用者類,只有乙個方法
然後使用+=將訂閱者的方法註冊到事件中(事件只能使用+=和-=註冊和撤銷訂閱,後面會講)
最後是廣播者呼叫了觸發事件的方法,向所有訂閱者廣播(由事件委託執行訂閱者註冊到事件中的方法)
.net framwork為事件程式設計定義了乙個標準模式,目的是保持框架和使用者**的一致性,核心是system.eventargs
類,但是在.net core中並不再要求system.eventargs
類,這個下一節講
在.net framework的標準事件模式中,需要
乙個protected
的虛方法來觸發事件,方法名必須和事件名稱一致,以on
為字首,並接受唯一的eventargs
引數
下面我們來看前面的例子改寫成標準模式的樣子
// 帶引數的標準模式
using system;
class program
}// 定義需要傳遞的額外資訊類
class messageeventargs : eventargs
public string message
}// 定義事件的委託,這個委託.net framework定義好了的,其實不必再定義,在後面遷移到.net core時也改動更少
// public delegate void eventhandler(object sender, teventargs e) where teventargs : eventargs;
public void publish(string content)
}
class 使用者
"); console.writeline(e.message);
}}
// 不需要額外資訊的標準模式
using system;
class program
}// 不需要用以傳遞資訊的額外資訊類
// 定義事件的委託,這個委託.net framework定義好了的,其實不必再定義,在後面遷移到.net core時也改動更少
// public delegate void eventhandler(object sender, teventargs e) where teventargs : eventargs;
public void publish(string content)
}
class 使用者
"); }
}
.net core 的標準事件模式較為寬鬆。 在此版本中,eventhandler
定義不再要求teventargs
必須是派生自system.eventargs
的類
這個可以看一下官方文件,後面有機會我再更新
事件是一種功能受限的委託,具體受限的地方是事件只能使用+=
和-=
,相比於委託少了=
(這是其中之一,還理解得不是很透徹,後面再補)
拿前面的**actionnet.published += m.receivemessage;
這一句是新增訂閱,如果不需要了可以使用-=
刪除訂閱,但是不能使用actionnet.published = null
,這樣的**更加健壯
C 談一談this指標
當你進入乙個 房子 後,你可以看見桌子 椅子 地板等,但是房子你是看不到全貌了。對於乙個類的例項來說,你可以看到它的 成員函式 成員變數 但是例項本身呢?this是乙個 指標 它時時刻刻指向你這個 例項 本身class date void printdate 結果如下 進過反彙編,我們知道了 ecx...
談一談教育
今晚和研究生的師兄聊了會天,突然就說到教育的問題,有點感想,就寫下來,算是我對中國教育的一點看法吧。毫無疑問,中國的教育體制存在不少問題。在高中的時候或許還不是那麼明顯 對比起大學來說 上了大學,我才看清了我們教育的一些弊端。我覺得,最大的弊端,在於價值觀的引導問題上。不知道大家有沒和我一樣覺得當今...
談一談裁員
資本寒冬,經濟不景氣,要保持公司運作,可能會涉及到裁員。另外,有些員工的價值觀已經與公司不符,再留用可能會影響團隊和公司的和諧,此時也可能會涉及到裁員。裁員,不是說想裁就能裁的,需要考慮幾個方面 為什麼要裁?是否可以不裁?裁員是否會影響業務程序?裁員是否會付出經濟代價 賠償 裁員是否會負一定的法律責...