C 事件的傳送方和接收方(訂閱方)

2021-06-07 15:37:20 字數 3435 閱讀 7831

基於windows的應用程式也是基於訊息的,windows使用預定義訊息與應用程式通訊。

.net framework將windows訊息封裝在事件中,可以把事件作為物件之間的通訊介質。

事件傳送方:傳送事件的物件

事件接收方:捕獲事件並對其作出響應的物件(處理事件)

在事件通訊機制中,事件傳送方不知道哪個物件將接收到它引發的事件以及進行什麼樣的處理,事件

傳送方不知道誰將是事件接收方,它只是將"事件發生了"這個訊息廣播出去。

在c#中,事件機制是借助委託來實現的。乙個事件就相當於乙個委託例項。

使用事件:使用事件分為4步,與使用委託有一點小區別。

1.定義乙個委託型別。

這一步與使用委託沒有什麼不同,一般都使用 .net預定義的委託。

2.定義乙個事件名(在事件傳送方中)。

訪問控制符 event 委託型別名 事件名;

3.封裝事件,即將事件處理方法註冊到事件中(事件處理方法定義在事件接收方中)。

事件傳送方.事件名 += new 委託型別名(事件處理方法);

事件名即相當於委託例項名,事件處理方法即相當於委託例項的關聯方法。只不過,在事件機制中,將定義委託例項(使用委託的第二步)分為兩個步驟,分別由事件傳送方和接收方來進行: 定義乙個事件名 - 得到乙個委託例項名 (事件傳送方) ;封裝該事件 - 得到乙個關聯方法(將乙個事件處理方法與乙個事件關聯) (事件接收方)。

注:在事件傳送方定義事件名時,可以將事件名宣告為static的,以便事件接收方封裝事件

4.事件傳送方引發事件,事件接收方的事件處理方法捕獲並處理事件。

引發事件(相當於呼叫委託例項)即會導致事件處理方法的執行(相當於委託例項的關聯方法的執行)

事件可能由使用者的操作(比如單擊滑鼠)引發,也可能由某些其他的程式邏輯觸發;?

usingsystem;

namespaceeventexample

//定義事件處理方法,在事件被引發後執行

privatestaticvoidsend_calculatefinished(stringmsg)

}

//1.定義委託,指定返回型別和形參列表。與類定義一樣,同在命名空間下

delegatevoidmydelegate(stringmsg);

classclasssend//事件傳送方

}

publicvoidsquare(floatx)

的平方等於:", x, result);

//執行事件引發方法,將導致事件被引發

oncalculatefinished("平方");

}

publicvoidcube(floatx)

的立方等於:", x, result);

//執行事件引發方法,將導致事件被引發

oncalculatefinished("立方");

}

publicvoiddouble(floatx)

的倍數等於:", x, result);

//執行事件引發方法,將導致事件被引發

oncalculatefinished("倍數");

}

}

}

事件是多點委託,對事件只能使用 += 和 -= 運算,= 運算對於事件是無效的。

.net 提供了乙個預定義的用於事件的委託型別 - eventhandler

public delegate void eventhandler(object sender,eventargs e);

引數sender是引發事件的事件傳送方物件,e是事件的有關資料

在定義事件時,可以不必自定義委託型別,直接使用這個預定義的事件委託型別就可以了。

自定義事件時,應該遵守一些命名規範:

使用動詞命名事件,最好帶上現在、進行或完成時態來描述事件的觸發時效;

事件的委託型別的命名一般以"eventhandler"為字尾,事件引數類名稱以"eventargs"為字尾;

總是使用 sender 和 e 來命名事件中的兩個引數;

事件傳送方中,引發事件的方法的命名一般用 on + 事件名 eg:oncalaculatefinished(string msg);

在事件傳送方類中,定義引發事件的方法(其中包含呼叫事件的語句)時,必須先判斷事件是否為空,因為事件是在接收方中封裝的(定義事件處理方法),事件傳送方無法知曉是否存在有事件處理方法(傳送方不知道接收方的存在),所以在事件傳送方中引發事件的**處,必須先判斷事件是否為空。另外,往往是在事件接收方中,呼叫了事件傳送方的**,然後導致事件被引發,因而,在事件接收方中,封裝事件的**應該先於呼叫事件傳送方的**執行。

最土團購簡訊訂閱內容和簡訊傳送內容修改方法

如需修改訂閱時傳送認證碼的簡訊內容可以用editplus之類的文字編輯軟體開啟檔案inccrjzvswlude function sms.php,搜尋 content 您的手機號 簡訊功能認證碼 修改雙引號裡的內容即可。進入最土後程式設計客棧臺 設定 模板編輯,選擇manage tpl smscou...

jQ的select事件和trigger方法的小衝突

方法和事件都不難理解,分開用也都沒問題,但是一起用就有些小問題出現。直接上結論 使用trigger方法觸發乙個文字型別的 input 元素的select事件時,chrome瀏覽器會錯誤的觸發三次,firefox和ie11只會正常觸發一次 解決辦法也簡單,把trigger換成triggerhandle...

C 實現檔案的傳送和接收

為了把問題說清楚,把一些變數都直接附值了,並沒有通過輸入附值 private string path f artmovie.exe 要傳送的檔案 private socket s private void listen catch nullreferenceexception e e private...