探尋C#事件本質1

我最先在學習C#事件的時候,閱讀了許多書籍,但總是不能對事件建立起一個比較清晰的概念,對其內部機制和原理也是似是而非,因為這些書籍在描述事件的時候總是夾雜許多其他不能理解的抽象術語,相信許多初學者都有這樣的感覺。

同時,在利用IDE進行GUI編程時,IDE總是在內部幫助我們實現了事件必須的一些代碼,我們只需雙擊對象,編 事件處理函數就行了,而我們常常對內部的工作一無所知,或沒有去主動理解這些自動生成的代碼。

現在我試著回答學習時遇到的幾個問題,這將會有助于你理解到底什么是事件。

如何定義一個事件?

語法:修飾符 event關鍵字 委托類名 事件名;

比如:public event somedelegatename myeventname;

事件到底是什么類型(引用?值?)

事件其實就是一個特殊的委托。

MSDN中的C#參考里這樣描述:事件是特殊類型的 多路廣播委托,僅可從聲明它們的類或結構(發行者類)中調用。如果其他類或結構訂閱了該事件,則當發行者類引發該事件時,會調用其事件處理程序方法。

對于這一點,我們也可以從事件的定義中看出,不過就是在定義委托對象時加了event關鍵字表明這個委托現在叫事件。

何謂事件的訂閱(subscribe)?

我們用VS2005建立一個只有一個按鈕的winform程序,雙擊按鈕,設計器會在Form1.Designer.cs中自動生成一行代碼

this.button1.Click += new System.EventHandler(this.button1_Click);


這就是事件的訂閱! 其實就是用事件處理函數this.button1_Click來實例化一個委托System.EventHandler(這個函數與委托擁有同樣的簽名,為什么需要有同樣簽名,我理解就是要保證委托與函數的類型一致,這樣才能把函數句柄賦給一個委托對象,即所謂的用委托封裝方法或C++中把一個方法句柄賦給一個 函數指針),并把這個委托對象賦給事件Click(因這Click其實就是一個委托引用,所以可以這樣做,從C++的角度來理解,就是把事件處理函數賦給了一個函數指針變量,這樣就可以通過調用這個函數指針以執行事件處理函數)

一句話,訂閱事件就是將某個委托對象指向一個具體的方法。

什么是引發事件?

當程序中滿足某個條件時調用事件就是引發了事件,為什么可以調用事件呢?因為事件就是一個委托,而委托具有C++中 函數指針的作用,調用委托就是調用委托中封裝的 事件處理函數

為什么事件可以被多個對象訂閱?

知道了事件實際是一個多播委托后,這個問題不難理解,所謂被多個對象訂閱,就是事件被觸發后,可以導致多個對象做出反應,也就是多個對象的某個 事件處理函數被調用。為什么會這樣呢,因為事件是多播委托,即封裝了多個函數的委托,調用這個委托實際上就是在調用被封裝的這多個函數。



下面用一個最簡單的控制臺程序例子來說明事件的運作方式



using System;
namespace 最簡單的自定義事件
{/// <summary>/// 事件發送類,即調用事件的類/// </summary>class Class1{public delegate void mydelegate(object sender,EventArgs e); //定義委托public event mydelegate myevent; //定義一個委托類型的事件,即定義一個委托對象public void run(){//死循環,不停測試某個條件是否滿足,即所謂的監聽while(true){if(Console.ReadLine()=="a"){myevent(this,new EventArgs()); //調用事件}}}}/// <summary>/// 事件接收類,即事件處理的類/// </summary>class Class2{static void Main(string[] args){Class1 c1 = new Class1();c1.myevent+= new Class1.mydelegate(c1_myevent); //將委托對象指向具體的事件處理函數,即所謂的訂閱事件c1.run();//運行這個事件,因為此時委托已經指向了具體方法,可以運行了}private static void c1_myevent(object sender, EventArgs e){//事件處理方法Console.WriteLine(" 你觸發了事件!");}}
}


對于這個例子,為了加深理解事件的本質,我們可以把事件訂閱c1.myevent+= new Class1.mydelegate(c1_myevent); 這句注釋掉,即事件沒有指向任何具體的方法,編譯,不會報錯,運行它,如果我們不輸入

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255647.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255647.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255647.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#圖解教程 第十二章 數組

數組數組定義重要細節數組的類型數組是對象一維數組和矩形數組實例化一維數組或矩形數組訪問數組元素初始化數組顯式初始化一維數組顯式初始化矩形數組快捷語法隱式類型數組綜合內容交錯數組聲明交錯數組快捷實例化實例化交錯數組比較矩形數組和交錯數組foreach語句迭代變量是只…

【數據庫學習】——windows、MySQL構建新聞管理系統(控制臺版)

學習記錄&#xff1a;【Python項目實戰】PythonMySQL開發新聞管理系統全集_嗶哩嗶哩_bilibilihttps://www.bilibili.com/video/BV1Qb4y1b75q?p2&spm_id_frompageDriver 目錄 一、項目介紹 1、項目結構 2、系統部分功能提前展示 3、項目流程圖 4、項目設計的數據庫以及…

matlab張量工具初步

最近從桑迪亞實驗室下載了張量工具包。但是不太會用。 很多網上的方法&#xff0c; addpath(pwd) cd met; addpath(pwd) savepath Mones(4,3,2); Xtensor(M); Xtensor(rand(5,1)) Ytensor(rand(4,3,1)) Xtenrand([4 3 2]) X.size %*************************** Rsptenrand([5 4…

微信紅包API接口(PHP)

發布時間&#xff1a;2015年2月25日 / 分類&#xff1a;WEB開發,PHP / 74,825 / 241 ℃ 根據微信高級紅包接口&#xff0c;開發PHP版本的API接口&#xff0c;現在進行主要代碼分析。 紅包接口調用請求代碼&#xff0c;所有請求參數為必填參數與文檔對應&#xff1a; 1234567891…

2016年個人技術總結(前端)

自我總結 參與項目 備注:[☆-表示比較吊的項目,-從頭開始做,^-中間加入項目] 神馬生活(微信公眾號商城)[^] 神馬學院[] <!------跳槽線--------> 大數據套件[☆][^] fable數據營銷平臺(加入新功能&#xff0c;交互)[^] fit問卷系統[] fit投放系統[] fit畫像[^] 理財通點擊…

淺談OpenCV[轉]

OpenCV是一個由Interl公司支持的開源機器視覺庫&#xff0c;關于它的介紹&#xff0c;網上隨便一搜就車載斗量。這里我不談OpenCV的主要內容&#xff0c;而是將這段時間來對它的使用心得作個簡單介紹&#xff0c;以啟發打算用這個庫的朋友的思路&#xff0c;與大家一起來分享。…

【pyqt5學習】——tablewidget控件學習

目錄 1、Table Widget 1.QTableWidget不能在mainwindow中隨主窗口的大小變化&#xff1f; 2.將表格變為禁止編輯&#xff1a; 3.設置表格為整行選擇 4.單個選中和多個選中的設置&#xff1a; 5.表格表頭的顯示與隱藏 6.對表頭文字的字體、顏色進行設置 7.在單元格里加入…

吳忠軍 - 如何理解馬云所說的月入兩三萬,三四萬的人最幸福?

這句話源于一段兩分鐘的視頻&#xff0c;馬云的一次阿里內部會議演講。 馬云坦承&#xff0c;自己從第一天起就沒想過當首富&#xff0c;還為此稀釋公司持股&#xff0c;“沒想到把自己的股份降到8%&#xff0c;還是有那么多&#xff0c;這是我沒有想到的。” 在馬云看來&#…

iOS小知識點(非UI部分)

1。 _cmd 表示當前方法的SEL指針&#xff0c; - (void)putString{} 對于這個函數_cmd 等效于selector(putString)轉載于:https://www.cnblogs.com/dongfangchun/p/5341599.html

jQuery 操作 CSS

jQuery 擁有若干進行 CSS 操作的方法。我們將學習下面這些&#xff1a; addClass() - 向被選元素添加一個或多個類removeClass() - 從被選元素刪除一個或多個類toggleClass() - 對被選元素進行添加/刪除類的切換操作css() - 設置或返回樣式屬性轉載于:https://www.cnblogs.com/…

彩色CCD相機工作原理

原理 黑白&#xff08;單色&#xff09;相機 CCD原理并不復雜。我們可以把它想象成一個頂部被打開的記憶芯片。因此光束可以射到記憶單元中。根據"光電效應”&#xff0c;這些光束在記憶單元中產生負電荷&#xff08;下圖中右上部分&#xff09;。 曝光后&…

Linux 系統常用命令匯總(二) vi 文本編輯

文本編輯vi命令作用文件名編輯文本文件&#xff0c;若文件不存在同時創建該文件Ctrlf向后翻一頁Ctrlb向前翻一頁Ctrld向后翻半頁Ctrlu向前翻半頁光標移動到下一行-光標移動到上一行數字空格光標向右移動n個字符0移動到本行首個字符處$ 移動到本行最后一個字符處H光標移動到屏幕…

圖像處理與計算機視覺:基礎,經典以及最近發展(2)圖像處理與計算機視覺相關的書籍

1. 數學 我們所說的圖像處理實際上就是數字圖像處理&#xff0c;是把真實世界中的連續三維隨機信號投影到傳感器的二維平面上&#xff0c;采樣并量化后得到二維矩陣。數字圖像處理就是二維矩陣的處理&#xff0c;而從二維圖像中恢復出三維場景就是計算機視覺的主要任務之一。這…

【HTML學習】——HTML常見標簽屬性和方法介紹

目錄 1、HTML分塊--------< div> 2、HTML段落--------< p> 3、HTML標題--------< h1>…< h6> 4、HTML鏈接--------< a> 1)< a href“http://www.baidu.com”>百度< /a>&#xff08;點擊百度&#xff0c;直接跳轉到網頁&#xf…

開發者應警惕的七種糟糕職業規劃錯誤

那些心靈雞湯式的說辭總愛美化失敗&#xff1a;失敗是成功之母啦、失敗使人成長啦、別畏懼失敗等等。但事實上&#xff0c;這種思路在軟件開發領域也許并不適用——至少不完全適用。每位開發者在職業生涯中都不可避免會遭遇失敗&#xff0c;但為什么不從他人的經驗中汲取教訓來…

Splay模板

打LCT的時候發現Splay很不熟, 因此這里貼一下模板 洛谷P3369 https://www.luogu.org/problem/show?pid3369#sub /* 提一些要注意的點: 1. 注意判斷邊界, 不要訪問到空節點 2. 每一次操作或訪問完以后, 記得要splay到root 3. insert操作只要update當前節點和父親節點即可, 因為…

圖像處理與計算機視覺 基礎、經典以及最近發展

申明&#xff1a;本文非筆者原創&#xff0c;原文轉載自&#xff1a;http://blog.csdn.net/liuyue2046/article/details/12658441 ***************************************************************************************************************************************…

【HTML學習】——一個網頁HTML編程的構成

目錄 1、html網頁構成介紹 2、HTML標簽介紹 全部的html標簽&#xff1a; HTML: HyperText Markup Language | MDNhttps://developer.mozilla.org/en-US/docs/Web/HTML 一個網頁文件一般由.html結尾的文件組成&#xff0c;主要由不同的標簽對和內容組成&#xff0c;常見的html…

hbase里插入big int數據用Phoenix查看的報錯問題

Phoenix建表create table "test_big_int"("ROW" varchar primary key,"ci"."column1" bigint) 在hbase里put數據hbase 里面進行put: put test_big_int,001,ci:column1,1 在Phoenix里進行查看&#xff08;問題出現&#xff09;第二個嘗…

機器學習:利用卷積神經網絡實現圖像風格遷移 (一)

相信很多人都對之前大名鼎鼎的 Prisma 早有耳聞&#xff0c;Prisma 能夠將一張普通的圖像轉換成各種藝術風格的圖像&#xff0c;今天&#xff0c;我們將要介紹一下Prisma 這款軟件背后的算法原理。就是發表于 2016 CVPR 一篇文章&#xff0c; “ Image Style Transfer Using Co…