2011-04-05 112 views
2

簡單的委託只是指向一個函數,稍後當我們調用委託,然後映射函數被調用。使用簡單委託

我很難使用delegate.so我只想知道爲什麼應該使用簡單的委託。這裏我給出一個使用代表的示例代碼。

using System; 
using System.Windows.Forms; 

delegate void DisplayMessage(string message); 

public class TestCustomDelegate 
{ 
    public static void Main() 
    { 
     DisplayMessage messageTarget; 

     if (Environment.GetCommandLineArgs().Length > 1) 
      messageTarget = ShowWindowsMessage; 
     else 
      messageTarget = Console.WriteLine; 

     messageTarget("Hello, World!"); 
    } 

    private static void ShowWindowsMessage(string message) 
    { 
     MessageBox.Show(message); 
    } 
} 

在上面的例子中爲代表剛點的功能,並且當我們調用委託然後一個函數被調用,其被映射。這裏我們可以直接調用該函數,那麼爲什麼應該使用委託。請詳細說明代表的優勢。在我上面的程序中,我們可以直接調用ShowWindowsMessage函數,那裏不需要委託。

感謝

回答

3

基本示例:

使用Sort()時,可以將委託傳遞給比較函數。
在這種情況下,你想排序一個集合,但還不知道它將如何排序(當然有一個默認值),但是你希望能夠使用一個將來會被決定的函數日期。

所以使用委託來傳遞一個函數作爲參數將會很有用。

List.Sort Method (Comparison)

+1

這通常被稱爲策略模式 - 使用委託的完美例子:) – MattDavey 2011-04-05 08:18:07

1

我建議你熟悉first-class functionsclosures。之後,如何在C#中使用events

另外,您可以通過將程序參數添加到main方法來訪問程序參數。

public static void Main(string[] args) 
{ 
    DisplayMessage messageTarget; 

    if (args.Length > 1) 
     messageTarget = ShowWindowsMessage; 

    // ... 
1

例如,我有這樣的代碼:

public static class MemberEvaluator 
{ 
    public static TResult With<TInput, TResult>(this TInput o, 
               Func<TInput, TResult> evaluator) 
     where TResult : class 
     where TInput : class 
    { 
     if (o == null) return null; 
     return evaluator(o); 
    } 
} 

TInput o是空的情況下,它不會拋出異常,只是返回null,這有助於跳過空檢查,我可以在每個地方執行兩行代碼,但是當您在需要此項目的項目上工作時,最好有一個簡單的功能來執行此操作,可以通過x.With(q=>q.Z)調用它以獲得x.q.Z而不會檢查null可以看到q=>q.Z是一個非常好用法的簡單委託。實際上它是Func<TInput, TResult> evaluator作爲我的檢查功能的輸入。

編輯:這是一個具有一個擴展方法的擴展類,用於評估對象的成員。你可以找到完整的代碼here

+0

謝謝您的回答,但你的代碼是不是完整的代碼來了解你想說的,也非常艱難的理解。請給出完整的代碼。謝謝 – Thomas 2011-04-05 08:24:03

+0

@Thomas,我編輯了答案。 – 2011-04-05 09:25:05