2011-06-16 34 views
8

我看到委託用於自定義事件。據例如代理的使用

delegate string FuncRef(string Val); 

FuncRef fValue = GetFieldName; 

fValue("hello"); 

我做什麼,這裏只是申報委託,並指定一個函數名委託,每當需要調用它像fValue("hello");

而不是通過委託調用GetFieldName()我可以直接調用它。所以我只想知道爲什麼我應該使用委託來調用函數,因爲我們可以直接調用函數....通過委託調用任何函數的優點是什麼。

所以請告訴我什麼樣的場景委託使用是必需的,除了事件處理。請引導示例代碼並模擬一種情況,我需要通過委託調用函數,除了事件處理。請告訴我一些真實的場景,我們必須通過委託調用函數。

+1

http://msdn.microsoft.com/en-us/netframework/aa904594 – asawyer 2011-06-16 12:39:57

+0

代表是LINQ to objects的基礎部分。如果(條件1) GetFieldName1();如果(條件1) – spender 2011-06-16 12:40:46

回答

2
delegate string FuncRef(string Val); 

FuncRef fValue; // class member 

if (condition1) 
    fValue = GetFieldName1; 
else if (condition2) 
    fValue = GetFieldName2; 
else 
    fValue = GetFieldName3; 

// Another function 
fValue("hello"); 
+1

沒有使用委託,我可以在button_click() else if(condition2) GetFieldName2(); else GetFieldName3();在這我可以根據條件調用不同的功能,那麼爲什麼我應該使用委託來調用函數的方式,你說... plzz回覆並告訴我什麼時候需要通過委託調用函數的確切情況.....謝謝 – Mou 2011-06-16 17:48:08

0

基本上你希望能夠在運行時指定哪個函數應該被調用的任何地方。

異步BeginInvoke/EndInvoke模式就是一個很好的例子;回調是通過委託來指定的。

5

使用,而不是函數直接調用代表的原因是一樣的道理,你做

var taxRate = 0.15; 
var taxAmount = income * taxRate; 

,而不是

var taxAmount = income * 0.15; 

換句話說:使用一個變量來保存到一個參考調用實體(委託正是)允許你寫的代碼,可以根據傳遞給它的參數改變其行爲(價值,我們「再傳入delagate的)。這意味着更靈活的代碼。

對於使用代表的代碼示例,您可以查看LINQ(當然),但也有與任何語言相關的「代表101」示例:filtering a list

+0

msdn沒有鏈接代表101.我搜索谷歌,但沒有發現從msdn .....如果你知道可以üplzz給我的MSDN鏈接從哪裏我可以下載代表101例子和可以讀取它。謝謝 – Mou 2011-06-16 17:49:06

0

不久:您可以使用委託和事件成員組合能夠例如將事件處理程序分配給哪個不知道以前是一類,按鈕類知道什麼時候它觸發點擊事件,並且不在內部,你還可以將mybutton_Click處理函數綁定到它。

+1

你說我無法想象。所以你可以提供一個小樣本,因爲我可以理解你想說什麼。 – Mou 2011-06-16 13:40:18

0

LINQ到對象廣泛使用代表:

myAnimals.Where(animal => animal.CanSwim) 

供應到哪裏方法(animal => animal.CanSwim)的參數是λ表達式轉換爲被施加到在myAnimals所有元素的委託。

0

一個地方我使用委託是我的輸入處理程序(C#,XNA)

我有public void OnKeyboardPress()委託,這是我結合各種功能時被按下某些鍵。

輸入是一個很好的例子;而不是輪詢它(即你每次更新'它準備好了嗎?'等待它給你打電話)..例如GUI。 WPF事件是委託。

+0

你可以向我展示小樣本的代表用法嗎? – Mou 2011-06-16 17:50:02

1

C#代表微軟的教程代碼提供了另一個有趣的用例。在他們的例子中,一個名爲Bookstore的對象具有一個ProcessPaperbackBooks方法,該方法需要一本書處理委託並將其應用於該類中的每個項目。

最酷的是,如果你需要說的話,一種方法是收集商店中所有書籍的所有ISBN,你不需要改變書店類中的任何東西,而只需要定義一個函數它作用於書籍並將其傳遞給ProcessPaperbackBooks方法。委託善良將發生,並且您的新功能將應用於書店中的每個項目。時髦,不?

http://msdn.microsoft.com/en-us/library/aa288459(v=vs.71).aspx

0

代表是第一類對象。 IOW你可以參考他們,重新分配他們,等等,就像任何其他對象一樣。