詳解(一):大白話徹底搞懂事件到底是什么)
哈嘍各位小伙伴最近很多剛學(xué)C#的朋友問我委托和事件到底有啥區(qū)別事件總感覺虛無縹緲不知道什么時候用、到底是什么原理很多教程一上來就拋語法、講源碼、背概念越看越懵。所以我打算出一個C# 事件系列專欄從零基礎(chǔ)入門到實戰(zhàn)進階、源碼底層逐一拆解今天作為第一篇不講復(fù)雜代碼不聊底層IL只用大白話帶你吃透事件的核心本質(zhì)同時補齊必備專業(yè)術(shù)語做到通俗且專業(yè)。讀完本文你將徹底解決三個核心問題? 通俗理解C# 事件到底是個什么東西? 核心認知事件存在的意義是什么為什么要有事件? 專業(yè)落地搞懂事件、委托、方法的核心關(guān)系一、先拋通俗類比生活中的「事件」秒懂編程事件在學(xué)編程概念之前我們先跳出代碼看看生活里的事件這是理解C#事件的關(guān)鍵。舉個最經(jīng)典的例子門鈴事件我們梳理一下整個流程門口裝了一個門鈴事件主體/發(fā)布者門鈴本身不會自己響只有當有人按門鈴觸發(fā)條件時才會觸發(fā)動作家里的人聽到門鈴響會做出反應(yīng)主人開門、小狗吠叫、智能音箱播報響應(yīng)動作/訂閱方法這里有三個最核心的特征完全對應(yīng)C#事件的設(shè)計思想1. 被動觸發(fā)門鈴不會自己亂響必須由外部動作觸發(fā)不是主動執(zhí)行2. 一對多響應(yīng)一次按門鈴可以同時觸發(fā)開門、狗叫、播報多個動作3. 職責(zé)分離門鈴只負責(zé)「被觸發(fā)、發(fā)出信號」不關(guān)心誰來響應(yīng)、怎么響應(yīng)響應(yīng)的人只負責(zé)「聽到信號做事」不用管門鈴怎么工作這就是 C# 事件的底層設(shè)計邏輯。用一句大白話總結(jié)C# 事件就是一個「信號觸發(fā)器」當某個條件滿足時自動通知所有提前訂閱的方法去執(zhí)行。二、落地編程C# 事件的官方定義通俗翻譯版2.1 專業(yè)官方定義在C#中事件event是一種基于委托的特殊封裝機制用于實現(xiàn)發(fā)布-訂閱Publish-Subscribe設(shè)計模式是C#實現(xiàn)異步通知、解耦代碼的核心語法。2.2 大白話翻譯定義事件就是給委托加了一層「安全鎖和規(guī)范」專門用來做「發(fā)生事情后自動通知別人干活」的功能。這里必須先理清三個層層遞進的關(guān)系新手最容易混淆的點方法Method具體要干的活比如開門、彈窗、打印日志委托Delegate方法的「容器/模板」可以存放多個方法統(tǒng)一調(diào)用事件Event委托的「安全升級版」專門用于消息通知限制了非法調(diào)用規(guī)范了使用場景核心結(jié)論事件離不開委托所有事件的底層都是委托但事件 ≠ 委托。事件是為了彌補委托的設(shè)計缺陷而生的。三、為什么C#需要事件直接用委托不行嗎很多新手疑惑既然委托能存方法、能調(diào)用為什么微軟還要單獨設(shè)計 event 事件答案很簡單委托太自由、不安全事件是規(guī)范化、安全化的委托。3.1 普通委托的問題弊端如果直接使用公開的委托變量外部代碼可以隨意直接賦值覆蓋之前所有訂閱的方法強制調(diào)用不管條件是否滿足主動執(zhí)行清空所有方法這會導(dǎo)致代碼邏輯混亂、數(shù)據(jù)不安全完全違背了「通知機制」的設(shè)計初衷。3.2 事件的核心優(yōu)勢規(guī)范安全event 關(guān)鍵字對委托做了嚴格的權(quán)限封裝也是事件最核心的特性僅可內(nèi)部觸發(fā)事件只能在定義它的類內(nèi)部觸發(fā)執(zhí)行外部類只能訂閱/取消訂閱不能強行調(diào)用禁止直接賦值覆蓋外部只能通過訂閱、-取消訂閱操作不能用直接覆蓋所有方法職責(zé)徹底解耦發(fā)布者只負責(zé)觸發(fā)事件不依賴訂閱者訂閱者只負責(zé)響應(yīng)事件不干預(yù)發(fā)布者邏輯再用門鈴舉例只有門鈴本身能決定什么時候響內(nèi)部觸發(fā)路人只能選擇聽或不聽訂閱/取消不能強行讓門鈴響也不能一鍵廢掉門鈴所有功能。四、事件核心三要素必記專業(yè)知識點所有C#事件無論簡單還是復(fù)雜都離不開這三個核心角色也是后續(xù)所有實戰(zhàn)代碼的基礎(chǔ)1. 事件發(fā)布者Publisher定義事件、觸發(fā)事件的類。它只負責(zé)兩件事定義事件、滿足條件時觸發(fā)事件完全不知道誰會訂閱、訂閱后做什么。對應(yīng)例子門鈴2. 事件訂閱者Subscriber監(jiān)聽事件、綁定響應(yīng)方法的類。訂閱事件后一旦事件觸發(fā)綁定的方法會自動執(zhí)行??梢杂卸鄠€訂閱者。對應(yīng)例子主人、小狗、智能音箱3. 事件處理器Event Handler訂閱者綁定的具體方法也就是事件觸發(fā)后要執(zhí)行的業(yè)務(wù)邏輯。對應(yīng)例子開門動作、吠叫動作、播報動作五、通俗總結(jié)一句話吃透事件我用最精簡、最接地氣的話總結(jié)全文核心大家可以直接記下來1. 本質(zhì)事件是封裝后的、安全的委托是C#實現(xiàn)發(fā)布訂閱模式的專屬語法2. 作用實現(xiàn)代碼解耦實現(xiàn)「條件觸發(fā)、自動通知、一對多執(zhí)行」3. 特點被動觸發(fā)、權(quán)限安全、職責(zé)分離、多訂閱響應(yīng)4. 區(qū)別委托是工具事件是帶規(guī)則、帶安全鎖的工具使用規(guī)范六、本系列后續(xù)預(yù)告本篇作為C#事件入門第一篇我們搞定了事件的核心思想、專業(yè)概念和設(shè)計邏輯沒有寫一行復(fù)雜代碼。后續(xù)文章我會依次更新第二篇C#事件完整語法實戰(zhàn)手把手寫第一個自定義事件第三篇事件參數(shù)、標準事件模板詳解第四篇事件與委托的深度區(qū)別面試高頻考點第五篇Winform/WPF 原生事件底層原理實戰(zhàn)七、寫在最后很多人覺得事件難本質(zhì)是一開始就被專業(yè)術(shù)語勸退了。其實事件的邏輯非常簡單約定一個信號信號來了提前綁定的方法自動執(zhí)行。只要理解了本篇的核心思想后續(xù)的語法、實戰(zhàn)、底層源碼都是「錦上添花」。如果本文對你有幫助歡迎點贊、收藏、關(guān)注持續(xù)更新C#事件系列干貨有任何疑問歡迎評論區(qū)交流~