一、委託部分
usingsystem;
using
system.collections.generic;
using
system.text;
namespace
private
static
void delmethod(delcout delcout,string
str)
private
static
void cout(string
str)
}}
關於委託的兩個主要作用,可能你明白事件要通過委託來實現,這是c#內部定義成這樣的,但不清楚為什麼**機制也要用委託。
在c\c++中,實現**是通過函式指標來實現的,函式指標其實就是個記憶體位址,由於該位址不會攜帶任何其他資訊,如函式期望的引數個數、引數型別、返回值型別等,所以這時的**函式是非型別安全的.c#為**函式提供了稱為委託的機制,其能提供所期望的引數個數、引數型別、返回值型別等資訊,因此委託是型別安全的.
二、事件
using system;using system.collections.generic;
using system.text;
namespace eventdemo}}
public class humanresource
public static void main()
}}
其實,從上面的**看來,事件就是**。所觸發的事件,就是**方法。
三、事件偽造
「事件」是指當物件發生某些事情時,向其它物件提供通知的一種方法。在c#中,事件是通過delegate來實現的。
事件有兩個角色:一是事件傳送方,一是事件接收方。事件傳送方是指觸發事件的物件,事件接收方是指註冊事件發生時被通知的物件。
這裡,我想重點說下事件偽造事件的解決方法。下面先看下什麼是偽造事件。
在乙個類中我們定義乙個委託,把它做公有型別。如下:
publicdelegate
void
deldbclick();
public deldbclick deldbclick;
那麼,外部的乙個類,可以做乙個方法,把這個委託設定成null(清除監聽),也可以主動觸發這個委託所關聯的事件(假冒事件)。這種時候就可以造成「偽造事件」。
這個時候,我們可以用事件來對它進行包裝,以消除上面的這兩種情況。
publicdelegate
void
deldbclick();
private
deldbclick deldbclick;
public
event
deldbclick addevent
remove
}
像這樣,把委託定義成私有的,然後定義乙個這個委託型別的事件來把它向外開放。那麼外部就既不能直接把委託設定成null,也不能直接呼叫委託了。
當然,我們可以直接寫乙個方法來做這種包裝,就象用屬性來包裝私有字段一樣,但這樣定起來更簡單。
四、事件與委託之間的關聯
這本來不應該單獨寫,但這個問題,被問得太多次了~~
首先應該明白,委託得一種型別(書上也說是一種資料結構),它與類平級,而事件是與方法屬性同級別的,事件是用委託來實現的。有人說事件是一種特殊的委託,我覺得這樣理解也可以。通過上面的例子,我們也知道,事件是對委託封裝,方便了事件註冊(多播委託),還可以消除誤操作(事件偽裝)。
五、為會麼執行緒交叉通訊要用委託
這是我一次面試的時候,被問到的。當時,面試官問我對於多執行緒了解多少。我確實不清楚,但也不能一點也不說。
說到時交叉通訊要用委託時,面試官問:為什麼要用委託,一下子懵了。
我現在的理解是:交叉通訊的時候,用到了乙個名為「invok」的方法,而這個方法中要求提供乙個委託過去。其實,這個地方就是乙個**。那麼,為什麼用委託就清楚了。因為在c#中不能向c/c++一樣,直接把方法作為引數傳遞。因為c/c++中傳遞方法名是乙個指標,c++中的指標不通過msil而是直接和記憶體打交道,這便是指標不安全的原因所在。而委託則不同。c#中的委託不與記憶體打交道,而是把這一工作交給clr去完成成。clr無法阻止將不安全的**呼叫到本機(非託管)**中或執行惡意操作。然而當**的型別安全時,clr的安全性強制機制將確保**不會訪問本機**,除非它有訪問本機**的許可權。此外,委託作為引數進行傳遞的時候,傳遞的資訊包括引數個數,引數型別,返回值型別等。因此委託是型別安全 。
我覺得這也就是為什麼要用委託的原因了。
委託與事件
1.建立乙個類,分別建立加 減 乘 除四個方法,通過委託和事件,實現 輸入兩個計算數,完成所有的四個方法的呼叫,計算出結果顯示。建立乙個警察 policeman 類,乙個小偷 thief 類,例項化兩個類的物件,當policeman類中警笛鳴響 alarm 方法執行時,觸發小偷逃跑 runaway ...
委託與事件
委託就是以方法做引數進行傳遞,它定義的是方法的框架,如果用這個委託,所宣告的方法就必須按照給定的引數及返滬型別進行處理。宣告委託的方式 delegate 返回值型別 委託型別名 引數 比如delegate void stringprocess string s 注意這裡的除了前面的delegate,...
委託與事件
委託與事件 一 委託 delegate 1 委託是一種可以把引用儲存為函式的型別。2 在定義了委託後,就可以宣告該委託型別的變數,接著把這個變數初始化為與委託有相同返回型別和引數類別的函式引用,之後,就可以使用委託變數呼叫這個函式,就像該變數是乙個函式一樣。如 double multiply dou...