delegate是c#中的一種類型,它實際上是一個能夠持有對某個方法的引用的類。與其它的類不同,delegate類能夠擁有一個簽名(signature),並且它只能持有與它的簽名相匹配的方法的引用。它所實現的功能與c/c++中的函數指標十分相似。它允許你傳遞一個類a的方法m給另一個類b的對象,使得類b的對象能夠調用這個方法m。但與函數指標相比,delegate有許多函數指標不具備的優點。首先,函數指標只能指向靜態函數,而delegate既可以引用靜態函數,又可以引用非靜態成員函數。在引用非靜態成員函數時,delegate不但儲存了對此函數入口指標的引用,而且還儲存了調用此函數的類執行個體的引用。其次,與函數指標相比,delegate是物件導向、型別安全、可靠的受控(managed)對象。也就是說,runtime能夠保證delegate指向一個有效方法,你無須擔心delegate會指向無效地址或者越界地址。
.net 中的委託類似於 c 或 c++ 中的函數指標。使用委託使程式員可以將方法引用封裝在委派物件內。然後可以將該委派物件傳遞給可調用所引用方法的代碼,而不必在編譯時間知道將調用哪個方法。與 c 或 c++ 中的函數指標不同,委託是物件導向、型別安全的,並且是安全的。 委託聲明定義一種類型,它用一組特定的參數以及傳回型別封裝方法。對於靜態方法,委派物件封裝要調用的方法。對於執行個體方法,委派物件同時封裝一個執行個體和該執行個體上的一個方法。如果您有一個委派物件和一組適當的參數,則可以用這些參數調用該委託。 委託的一個有趣且有用的屬性是,它不知道或不關心自己引用的對象的類。任何對象都可以;只是方法的參數類型和傳回型別必須與委託的參數類型和傳回型別相匹配。這使得委託完全適合“匿名”調用。
[ <attrlist> ] [ accessmodifier ] _ [ shadows ] delegate [ sub | function ] name [( of typeparamlist )] [([ parameterlist ])] [ as type ]
實現一個delegate是很簡單的,通過以下3個步驟即可實現一個delegate:
1.聲明一個delegate對象,它應當與你想要傳遞的方法具有相同的參數和傳回值類型。
2.建立delegate對象,並將你想要傳遞的函數作為參數傳入。
3.在要實現非同步呼叫的地方,通過上一步建立的對象來調用方法。
下面是一個簡單的例子:
用delegate解決(非同步呼叫):
public void setscore(int value)
{
if (value > 100 || value < 0)
{
console.out.writeline("分數不對");
}
else
{
score = value;
if (advisedelegateinstance!= null)
{
advisedelegateinstance.begininvoke(score,null,null);
}
}
}
不過這樣我們失去了老師的返回結果,不知道有沒有及格了。
採用輪訊的方法去獲得結果:
public void setscore(int value)
{
if (value > 100 || value < 0)
{
console.out.writeline("分數不對");
}
else
{
score = value;
if (advisedelegateinstance!= null)
{
iasyncresult res = advisedelegateinstance.begininvoke(score,null, null);
while( !res.iscompleted ) system.threading.thread.sleep(1);
string result = advisedelegateinstance.endinvoke(res);
console.out.writeline("學生收到老師返回的結果t"+result);
}
}
}