注意在代碼中如何和何處使用delegates

在最近有關.NET工程的一次技術採訪中,我被問到定義術語的問題。由於項目是採用C#的.NET平臺,所以問題就集中在C#。採訪的過程相當有趣,但有一個特別的問題卻是使我興致大減,這一問題是:我必須定義delegate (代表)。雖然我已經廣泛地使用delegates,但我還是很難從定義上回答。儘管我已經盡力回答,但我還是感到相當尷尬。事實上,一個MCSD.NET應該可以沒有任何疑問地回答了這樣的問題。

<script language="JavaScript1" src="http://ad.cn.doubleclick.net/adj/messagingplus.zdnet.com.cn/developer/code;sz=1x1;ord=1918391385?"> </script> <script language="VBScript"> on error resume next ShockMode = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.5"))) </script>  cn_336_280.swf cn_336_280.swf code;sz=1x1;ord=1918391385?

 

Delegate是什麼?

對微軟來說,一個delegate聲明指定了一個相關的類型,你可以使用這一類型來封裝一個含有特定標記的方法。一個delegate實例可以封裝一個靜態或一個實例方法。概略的說,Delegates就好象是C++中的函數指針;然而,delegates屬於安全和保護類型。

我的採訪是通過電話進行,所以我可以很容易和輕鬆地闡述這些定義。透明和詳盡的解釋是有必要的。然而,更貼切delegates的定義是,即使在沒有對目標對象(target object)有任何瞭解的情況下,也可以隨時使用一些方法,這樣的方法即爲delegates。很多開發人員通常將它們說成回調函數(callback functions)。現在讓我們看一個範例,以更好理解它的應用。

 

使用中的Delegates

我們的範例程序開始於兩個簡單的C#類,這兩個類包含一個方法以通過控制檯來顯示信息:

 

public class DelegateClass1 {

public void exampleMethod1(String passedString) {

Console.WriteLine(passedString); }

}

public class DelegateClass2 {

public void exampleMethod2(String passedString) {

Console.WriteLine(passedString); }

}

請注意到,這兩個類執行類似的方法。這些方法具有不同的名稱,但它們的標記和實體都相同。你可以使用一個delegate來結合這兩個方法,實現過程是通過定義一個從這兩個方法的通常特性中抽象出新的數據類型。也就是,它們都將一個簡單的字符作爲一個變量並返回void。C# delegate關鍵詞使得這些變成可能:

public delegate void example(String passedString);

例如,使用這一新的數據類型聲明,我們可以通過一個通常的抽象來調用這兩個方法。下面的C#控制檯程序利用了我們的delegate範例來調用這兩個類的方法:

public class TestExampleDelegate {

public delegate void example(String passedString);

public static void <?XML:NAMESPACE PREFIX = ST1 />Main(string[] args)  {

example[] items = new example[2];

items[0] = new example(new DelegateClass1().exampleMethod1);

items[1] = new example(new DelegateClass2().exampleMethod2);

for(int i = 0; i < items.Length; i++) {

items[i]("Builder.com Rules!");

} } }

以上代碼建立了一個數組的範例對象,並使用這些類中的方法實例化這些對象。由於忽略了括號,範例對象被一個調用方法處理。代碼的執行結果顯示了文本中。

(注意:Delegates不屬於C#的細節;它們是.NET Framework的標準部分,所以你可以使用其它的語言,比如VB.NET或者J#。)

在任何地方都可以使用Delegates

在這一點上,也許你只知道有這樣一回事,但卻沒有察覺它在你的程序中的應用。雖然你沒有建立自己的delegates,但如果經常使用事件時你會使用到它們。一個極好的例子就是ASP.NET中使用的事件。在後臺使用的Delegates圍繞着事件工作。事件使用一個標記,你也可以在一個線程結構中找到delegates。

 

接口(interface)

你必須注意的另一個點是一個delegate和一個接口之間的相似性,因爲它們都將規範和執行分離開來。它們允許開發人員建立與規範相符合的執行。除此之外,方法標記必須是被指定和相兼容。

所以,你什麼時候使用接口?以及你什麼時候使用delegates?微軟提供了以下的指導思想。

在以下情況下使用Delegates很有用:

調用一個單一方法。

一個類要進行方法規範(method specification)的多種執行。

使用一個靜態方法來執行規範。

想獲得類似事件設計的模式。

調用者沒有必要知道或獲得方法定義的對象。

執行的提供者想將規範的執行“分發”成一些選擇性的部分。

 

在以下情況下使用接口非常有好處:

規範指定一套即將被調用的方法。

特別的,一個類只執行規範一次。

接口的調用者想通過接口類型以獲得其它接口或類。
發佈了46 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章