2011-04-05 116 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