Asp.net c#中委托的简单应用入门

Asp.net c#中委托的简单应用入门,asp.net,delegates,Asp.net,Delegates,我试图从这篇文章中学习C#中的委托 我能够稍微理解代码,但我无法理解开发人员希望在何处以及为什么使用委托。有人能给我一个简单的场景来帮助我从学员开始吗 更新 我到处都读过这条语句,“然后委托对象可以传递给可以调用引用方法的代码,而不必在编译时知道将调用哪个方法。” 但为什么我希望编译器不知道我传递的函数呢?我能闻到抽象的味道,但有什么用?任何实时场景都是必需的。看,在windows窗体中有按钮、图像、文本框等类。。。它们都有类似button.click、textbox.texchange等事件

我试图从这篇文章中学习C#中的委托

我能够稍微理解代码,但我无法理解开发人员希望在何处以及为什么使用委托。有人能给我一个简单的场景来帮助我从学员开始吗

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


但为什么我希望编译器不知道我传递的函数呢?我能闻到抽象的味道,但有什么用?任何实时场景都是必需的。

看,在windows窗体中有按钮、图像、文本框等类。。。它们都有类似button.click、textbox.texchange等事件处理程序。。。他们本身就是代表。 当您想在按钮上执行某些操作时,单击您编写的函数是无效的,它有两个属性:ofobjecttype和EventArgs。编写button类的人不知道在button click上做什么,但给了您一个委托:

public delegate EventHandler Click;
您定义的方法将在哪里,如:

public void mymethod(object s, EventArgs e)

或者每个方法都是无效的,并且都有参数,使用委托的一个好例子就是回调。想象一下你有一个类DbSearcher。该类具有方法搜索(字符串q),当您调用此方法时,需要1分钟才能返回。您希望最终显示搜索结果,但不希望让用户等待搜索结果出现,而无法再执行任何操作。您要做的是将方法更改为搜索(stringq,actiondisplayresults)并在单独的线程中启动它。这里的displayResults是一个委托,一旦从数据库检索到搜索结果,您将在搜索方法中调用它。

您可以在web上找到许多示例和代码片段。下面是我的示例,假设您的用户将在下面的步骤中决定要执行的操作

  • 加两个数字
  • 减去两个数字
  • 两个数的倍数
  • 把两个数字分开
  • 但你有一个共同的方法来完成这一切

    Operation(some delgate method)
    {
       // do some operation
    }
    
    u您可以根据用户选择在运行时传递委托


    这只是一个例子。

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

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

    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;
    }
    

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

    在这里,
    方法不知道列表中的对象的任何信息,它只获取一个方法的委托,该方法确定一个对象是否应该包含在结果中:

    IEnumerable<obj> older = listOfObj.Where(o => o.Age >= 18);
    
    IEnumerable older=listOfObj.Where(o=>o.Age>=18);
    
    可能与@MagnusJohansson重复我已经读过这篇文章,但我没有从中得到什么。我需要一个更基本的例子。我既不使用lambda表达式也不使用匿名函数。为什么我不能在获得用户选择后调用实际函数呢。只是一个想法,令人困惑!但是为什么我必须在这里传递一个代表?我不能只传递函数名吗!这就是我困惑的地方。我知道你说的是异步编程,也使用过异步编程,但我不明白为什么我们在这里传递委托而不仅仅是函数名。在这两种情况下,你都传递委托——内联委托或方法名。如果您从另一端(接收端的一端)查看这一点,您将看到上面示例中类型为Action(委托类型)的displayResults参数使您可以传入方法名称或内联委托。委托是一个值为函数的变量。
    IEnumerable<obj> older = listOfObj.Where(o => o.Age >= 18);