【问题标题】:Simple application of delegates in c# to get startedc#中委托的简单应用上手
【发布时间】:2012-05-31 09:53:19
【问题描述】:

我正在尝试从这篇文章中学习 C# 中的委托 http://msdn.microsoft.com/en-us/library/aa288459(v=vs.71).aspx

我能够稍微理解代码,但我无法理解开发人员在哪里以及为什么要使用委托。有人可以提供一个简单的场景来帮助我从代表开始吗?

更新 我到处都读到这个语句,“然后可以将委托对象传递给可以调用引用方法的代码,而不必在编译时知道将调用哪个方法。”

但是为什么我想让编译器不知道我传递的函数呢?我可以在这里闻到抽象的味道,但有什么用?需要任何实时场景。

【问题讨论】:

  • @MagnusJohansson 我已经阅读了这个帖子,但我并没有从中得到太多。我需要一个更基本的例子。我没有使用 lambda 表达式,也没有使用匿名函数。

标签: asp.net delegates


【解决方案1】:

使用委托的一个很好的例子是回调。假设您有一个类DbSearcher。该类具有 Search(string q) 方法,当您调用此方法时,它需要 1 分钟才能返回。您希望最终显示搜索结果,但您不想让用户等待它们出现而无法做任何其他事情。您所做的是将您的方法更改为,例如,Search(string q, Action displayResults) 并在单独的线程中触发它。 displayResults 这是一个委托,一旦从数据库中检索到搜索结果,您将在 Search 方法中调用它。

【讨论】:

  • 但是为什么我必须在这里传递一个代表?我不能只传递函数名!这是我感到困惑的地方。我知道您在说的是异步编程并且也使用过它,但是为什么我们在这里传递委托而不仅仅是函数名是我感到困惑的。
  • 在任何一种情况下,您都必须传递一个委托——内联或作为方法的名称。如果你从另一端(接收端)看这个,你会看到上面示例中 Action 类型(这是一个委托类型)的 displayResults 参数使你可以传入你的方法的名称或内联委托。委托是一个变量,其值为一个函数。
【解决方案2】:

看,在 Windows 窗体中,有按钮、图像、文本框等类......它们都有事件处理程序,如 button.click、textbox.texchange ......它们本身就是委托。 当您想在按钮单击时执行某些操作时,您编写的函数是 void 并且有两个参数:object 类型和 EventArgs。编写该按钮类的人不知道单击按钮时该做什么,但给了您委托:

public delegate EventHandler Click;

您定义的方法在哪里,例如:

public void mymethod(object s, EventArgs e)

或者每个方法都是无效的并且有那个参数

【讨论】:

    【解决方案3】:

    您可以在网上找到很多示例和代码 sn-ps。这是我的示例,假设您的用户将在下面决定他/她要执行的操作,

    1. 添加两个数字
    2. 两个数字相减
    3. 两个数的复数
    4. 将两个数字相除。

    但是你有一个通用的方法来完成这一切

    Operation(some delgate method)
    {
       // do some operation
    }
    

    您可以在运行时根据用户选择传递委托。

    这只是一个例子。

    【讨论】:

    • 为什么我不能在获得用户选择后直接调用实际函数。只是一个想法,令人困惑!
    【解决方案4】:

    委托基本上是对方法的引用。

    例如,您可以使用不同的方法来更改字符串:

    public static string ChangeOne(string s) {
      return s.TrimStart();
    }
    
    public static string ChangeTwo(string s) {
      return s.TrimEnd();
    }
    

    根据某些标准,您可以在它们之间进行选择,并将选择放在委托中:

    Func<string, string> change;
    if (DateTime.Today.DayOfWeek == DayOfWeek.Sunday) {
      change = ChangeOne;
    } else {
      change = ChangeTwo;
    }
    

    然后你可以使用委托只是一个常规的方法。使用它的代码不必知道该方法的作用或原因:

    string x = "  asdf  ";
    x = change(x);
    

    例如,委托广泛用于泛型集合,其中库方法不必了解集合中的对象的任何信息。您只需为它提供一个委托给一个挑选相关信息的方法。

    这里的Where 方法对列表中的对象一无所知,它只获得一个方法的委托,该方法确定一个对象是否应该包含在结果中:

    IEnumerable<obj> older = listOfObj.Where(o => o.Age >= 18);
    

    【讨论】:

      猜你喜欢
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多