代表们是为了什么?

Ulh*_*ano 1 .net c#

可能重复:
代表有什么好处?

我创建了一个示例应用程序.我真的很难理解为什么要使用委托,因为没有委托我们就可以实现一切.

class Program
{
    public delegate double Integrand(double x);
    static double MyFunc1(double x) { return x + 10; }
    static double MyFunc2(double x) { return x + 20; }

    public static double Gauss3DelMethod(Integrand f)
    {
        double a = f(1);
        return a;
    }

    public static double Gauss3SimpleMethod(double x)
    {
        double a = x;
        return a;
    }

    static void Main(string[] args)
    {
        //with delegates
        double res = Gauss3DelMethod(MyFunc1);
        double res1 = Gauss3DelMethod(MyFunc2);

        //without delegates
        double res2 = Gauss3SimpleMethod(MyFunc1(1));
        double res3 = Gauss3SimpleMethod(MyFunc2(1));

        int i = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,我为什么要使用代表呢?

Jon*_*eet 9

在你的特定例子中,也许它并不重要.(目前尚不清楚它正在努力实现的目标.)

但是假设您想要使方法执行相同MyFunc1MyFunc2几个不同的输入.例如,假设您正在实现Newton-Raphson方法,以对一般函数进行操作.在这种情况下,您无法调用该函数一次并将其传递给方法 - 您希望将实际函数传递给方法,以便该方法可以使用它需要的任何输入来调用它.

类似的例子是排序.例如,使用LINQ可以编写如下内容:

var sorted = people.OrderBy(x => x.Age).ToList();
Run Code Online (Sandbox Code Playgroud)

在那里,我们传递一个函数来将每个源元素投影到排序键.我们不必自己执行该功能 - OrderBy将为我们(懒惰地)执行.

当然,所有这些都可以通过单方法接口完成 - 委托和单方法接口有很多共同之处.但是,与单方法接口相比,代理具有以下优点:

  • 代表是多方的 - 他们可以合并/删除,通常是为了事件
  • 您可以使用BeginInvoke/EndInvoke异步执行它们
  • 您可以使用匿名方法和lambda表达式构建它们
  • 您可以使用lambda表达式通过表达式树将逻辑表示为数据; 然后可以将这些编译成代理
  • 您可以使用适当的签名从任何方法构建委托 - 例如,单个类可以有多个方法"实现"相同的委托类型,而您不能在一个类中多次实现接口
  • 同样,委托实现方法可以是私有的,而接口方法必须是公共的(或通过显式接口实现在某种程度上公开)

当然,所有这些都可以使用单方法接口以不同的方式解决,但代表是一个方便的替代方案.

总之:代表们非常有用.仅仅因为你写了一些不特别需要它们的琐碎代码并不意味着它们没用.我强烈建议您查看LINQ,事件处理程序和TPL,所有这些都会大量使用委托.

  • @UlhasTuscano:我用语言而不是代码给你一个例子 - 然后在LINQ中用代码提供一个例子.但也许作为练习你应该尝试自己实施Newton-Raphson.你会通过*做*而不仅仅是*阅读*来了解更多. (4认同)