為什麼要使用Delegate?
下面是從CSDN摘取來的有助理解的回複
如樓主所說,有些地方可以直接調用對象的方法,而不用委託。
但有些時候這樣做不合適。
比如,在寫這個類的時候,根本就不能確定要調用哪個對象的方法:例如,你把自己的一個對象上的方法掛在微軟的textbox
的一個事件上。微軟在寫textbox時根本就不可能知道這個事件發生時,需要調用哪個對象的哪個方法,只有你自己去指定說需要調什麼方法,並且以委託的
方式掛在相應的事件上。
微軟在寫textbox的事件時,唯一能確定的是這個事件的格式,或者說這個事件需要調用的方法的格式,
類似於 button1_click(object sender, EnentArgs e) 等等。 只要是按照這個類型寫的方法,都能被掛在這個事件上,並且在事件發生時,方法會被調用。
而規定了事件方法格式,就確保了事件發生時被調用的方法都是合法的,不會出現方法類型不符等等。這就是所謂的委託是型別安全的。而c++下面用
void* 的函數指標實現事件處理缺少對函數格式的檢查。 所以C# 發明了委託這個怪東西,為的就是然被調用的函數格式正確。
這隻是基於訊息驅動的實現方式之一。
另一個普遍的方式,是使用介面。這是java的事件處理方式。 它以介面的形式規定了被呼叫者法的格式。這種方式更直接,更簡單,更容易理解。
兩種方式各有利弊,有各自的使用情境,但從效果上看是等效的。
------------------------------------------------------------
7樓給你說的是事件,我直接給你舉個委託的例子。
現在我要對一系列資料進行排序,而排序演算法可能比較複雜,我不會自己寫,我想調用Array.Sort方法,微軟為我們提供了快速排序演算法。
但是這裡有一個問題——我要實現自訂定序,比如對於字串,預設的是按字母順序,但現在我想這樣排序:
按字串長度排序,只有當長度不同時,再按字母排序。
顯然,微軟不可能提供這樣“個性”的排序方法,那是不是說,就必須讓我們自己去寫快速排序演算法呢?
不需要!
我們只需要使用委託,就能實現這個要求:
string[]strs="I like C# very much".Split();
Array.Sort(strs,Rule);
int void Rule(string first,string second)
{
return first.Length==second.Length?first.CompareTo(second):first.Length.CompareTo(second.Length);
}
顯然,我並不需要知道快速排序演算法的邏輯,我只需要告之定序,就實現了我的個性排序。
試問:如果沒有委託,你如何解決這個問題?
-------------------------------------------------------------------
也不是解決不了,定義一個介面,然後你自己繼承那個介面寫一個類,在介面函數裡把定序寫好.
然後給它傳個類執行個體,排序內部把那個執行個體當介面處理就可以了,java就是這樣解決的.
不過...
很顯然.對於新寫一個類來說我更願意使用委託一條函數解決問題.新寫一個類我要多敲多少次鍵盤呐...
而且在C#3.0裡我連新函數都懶得寫,一個Lambda運算式搞定
原貼:
http://topic.csdn.net/u/20090102/23/b26f5193-8eb1-4c57-a129-123ddbbe85a4.html