我创建了一个示例应用程序。我真的很难理解为什么要使用委托,因为没有委托我们就可以实现一切。
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;
}
}
那么,我为什么要使用代表?
答案 0 :(得分:9)
在您的特定示例中,可能不重要。 (目前尚不清楚它正在努力实现的目标。)
但是假设你想让方法对几个不同的输入执行相同的MyFunc1
或MyFunc2
。例如,假设您正在实施Newton-Raphson method,以对一般功能进行操作。在这种情况下,您无法调用函数一次并将其传递给方法 - 您希望将实际函数传递给方法,以便该方法可以调用它需要任何输入。
类似的例子是排序。例如,使用LINQ可以编写如下内容:
var sorted = people.OrderBy(x => x.Age).ToList();
我们正在传递一个函数来将每个源元素投影到排序键。我们不必自己执行该功能 - OrderBy
将为我们(懒惰地)执行此功能。
当然,所有这些都可以通过单方法接口完成 - 委托和单方法接口有很多共同之处。但是,与单方法接口相比,代理具有以下优点:
当然,所有这些都可以通过单方法接口以不同的方式解决,但代表是一个方便的选择。
总之:代表们非常有用。仅仅因为你写了一些不特别需要它们的琐碎代码并不意味着它们没用。我强烈建议你研究一下LINQ,事件处理程序和TPL,所有这些都会大量使用代理。
答案 1 :(得分:4)
代表是传递函数的有用方法。
Func
和Action
也是代表。没有它们,您几乎无法使用所有LINQ方法,从C#3.0开始,您可以使用Lambda Expressions更快地创建它们。
想象一下,例如你有一个可枚举的整数:
var numbers = Enumerable.Range(0, 100);
通过使用代理,您可以创建高阶函数(http://en.wikipedia.org/wiki/Higher-order_function),它可以帮助您以多种方式过滤上述数字。 Where
就是其中一例。
您可能只想选择奇数:
var odd = numbers.Where(a => a % 2 == 0);
甚至是:
var even = numbers.Where(a => a % 2 != 0);
如果没有它们,则必须为每个过滤器创建一个方法(例如WhereOdd
或WhereEven
)