使用简单的委托

时间:2011-04-05 07:59:35

标签: c#

一个简单的委托只是指向一个函数,稍后当我们调用委托时,则调用映射函数。

我几乎不使用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函数,并且不需要委托。

感谢

4 个答案:

答案 0 :(得分:3)

基本示例:

使用Sort()时,您可以将委托传递给比较功能 在这种情况下,您想要对一个集合进行排序,但还不知道它将如何排序(当然有一个默认值),但您希望能够使用将在未来日期决定的函数。

因此,使用委托将函数作为参数传递将非常有用。

List.Sort Method (Comparison)

答案 1 :(得分:1)

我建议您熟悉first-class functionsclosures。之后,如何在C#中使用events

此外,您可以通过将程序参数添加到main方法来访问它们。

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

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

    // ...

答案 2 :(得分: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而不进行空检查,你可以看到q=>q.Z是一个非常好用的简单代表。实际上它是Func<TInput, TResult> evaluator作为我的检查函数的输入。

编辑:这是一个带有一个扩展方法的扩展类,用于评估对象的成员。你可以找到完整的代码here

答案 3 :(得分:1)

在你非常简单的例子中,显然不需要代表,因为你已经意识到了

MSDN包含许多有关.NET框架的信息。在那里快速搜索可以经常找到大多数.net问题的答案。

我找了你,发现了这个......

http://msdn.microsoft.com/en-us/library/ms173171%28v=VS.100%29.aspx