談一談C 的事件

2022-06-20 08:00:14 字數 1981 閱讀 5789

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...

談一談教育

今晚和研究生的師兄聊了會天,突然就說到教育的問題,有點感想,就寫下來,算是我對中國教育的一點看法吧。毫無疑問,中國的教育體制存在不少問題。在高中的時候或許還不是那麼明顯 對比起大學來說 上了大學,我才看清了我們教育的一些弊端。我覺得,最大的弊端,在於價值觀的引導問題上。不知道大家有沒和我一樣覺得當今...

談一談裁員

資本寒冬,經濟不景氣,要保持公司運作,可能會涉及到裁員。另外,有些員工的價值觀已經與公司不符,再留用可能會影響團隊和公司的和諧,此時也可能會涉及到裁員。裁員,不是說想裁就能裁的,需要考慮幾個方面 為什麼要裁?是否可以不裁?裁員是否會影響業務程序?裁員是否會付出經濟代價 賠償 裁員是否會負一定的法律責...