代表是干什么的

本文关键字:干什么 | 更新日期: 2023-09-27 18:26:44

可能重复:
代表的优势是什么?

我已经创建了一个示例应用程序。我真的很难理解为什么要使用代表,因为没有代表,我们可以实现一切。

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

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

代表是干什么的

在您的特定示例中,这可能并不重要。(目前还不清楚它试图实现什么。)

但假设您想让该方法对几个不同的输入执行相同的MyFunc1MyFunc2。例如,假设您正在实现Newton-Raphson方法,以便对通用函数进行运算。在这种情况下,您不能调用函数一次并将其传递到方法中-您希望将实际函数传递到方法,以便方法可以使用所需的任何输入来调用它。

排序就是一个类似的例子。例如,使用LINQ,您可以编写以下内容:

var sorted = people.OrderBy(x => x.Age).ToList();

在那里,我们传递一个函数,将每个源元素投影到排序键。我们不必自己执行这个函数——OrderBy会(懒洋洋地)为我们执行。

当然,所有这些都可以通过单个方法接口来完成——委托和单个方法接口有很多共同点。然而,与单一方法接口相比,委托具有以下优势:

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

当然,使用单一方法接口可以以不同的方式解决所有这些问题,但委托是一个方便的替代方案。

最后:代表们非常有用。仅仅因为您编写了一些不特别需要它们的琐碎代码,并不意味着它们没有用处。我强烈建议您研究LINQ、事件处理程序和TPL,它们都大量使用委托。

委托是传递函数的一种有用方法

CCD_ 4和CCD_。如果没有它们,你就无法使用几乎所有的LINQ方法,而且从C#3.0开始,你可以使用Lambda表达式更快地创建它们。

例如,假设您有一个可枚举的整数:

var numbers = Enumerable.Range(0, 100);

通过使用委托,您可以创建高阶函数(http://en.wikipedia.org/wiki/Higher-order_function)这可以帮助您以多种方式过滤,例如,上面的数字。CCD_ 6就是其中之一。

您可能只想选择奇数:

var odd = numbers.Where(a => a % 2 == 0);

甚至还有:

var even = numbers.Where(a => a % 2 != 0);

如果没有它们,您将不得不为每个过滤器(例如WhereOddWhereEven)创建一个方法

相关文章: