有人可以提炼成适当的英语代表是什么吗?

Kei*_*ler 17 c# delegates

有人可以将一个代表分解成一个简单,简洁和简洁的解释,包括目的和一般的好处吗?我试图绕过这个,但它并没有陷入其中.

xof*_*ofz 30

我有一个功能:

public long GiveMeTwoTimesTwo()
{
    return 2 * 2;
}
Run Code Online (Sandbox Code Playgroud)

这个功能很糟糕.如果我想要3*3怎么办?

public long GiveMeThreeTimesThree()
{
    return 3 * 3;
}
Run Code Online (Sandbox Code Playgroud)

打字太多了.我很懒!

public long SquareOf(int n)
{
    return n * n;
}
Run Code Online (Sandbox Code Playgroud)

我的SquareOf功能并不关心是什么n.它将适用于n传入的任何内容.它不知道究竟是什么数字n,但它确实知道这n是一个整数.你无法"Haha not an integer"进入SquareOf.

这是另一个功能:

public void DoSomethingRad()
{
    int x = 4;
    long y = SquareOf(x);
    Console.WriteLine(y);
}
Run Code Online (Sandbox Code Playgroud)

与其名称相反,DoSomethingRad实际上并没有做任何事情.但是,它确实写了SquareOf(4)16,我们可以把它改成不那么无聊吗?

public void DoSomethingRad(int numberToSquare)
{
    long y = SquareOf(numberToSquare);
    Console.WriteLine(y);
}
Run Code Online (Sandbox Code Playgroud)

DoSomethingRad显然仍然很失败.但至少现在我们可以传入一个数字到正方形,所以每次都不会写入16.(它会写1,或4,或9,或16,或...... zzzz仍然有点无聊).

如果有一种方法可以改变传入的数字,那就太好了.也许我们不想把它放在一边; 也许我们想要将它立方体化,或者从69中减去它(从我脑中随机选择的数字).

在进一步检查,它好像只有部分SquareOfDoSomethingRad关心的是,我们可以给它一个整数(numberToSquare),它给了我们一个long(因为我们把它的返回值yy一个long).

public long CubeOf(int n)
{
    return n * n * n;
}

public void DoSomethingLeet(int numberToSquare)
{
    long y = CubeOf(numberToSquare);
    Console.WriteLine(y);
}
Run Code Online (Sandbox Code Playgroud)

见多么相似DoSomethingLeetDoSomethingRad?如果只有一种传递行为(DoX())而不仅仅是数据(int n)的方法......

所以现在如果我们想要写一个数字的正方形,我们可以DoSomethingRad并且如果我们想要写一个数字的立方体,我们就可以DoSomethingLeet.因此,如果我们要写出从69减去的数字,我们是否还要制作另一种方法,DoSomethingCool?不,因为这需要太多的打字(更重要的是,它阻碍了我们改变有趣行为的能力,只改变我们程序的一个方面).

所以我们到达:

public long Radlicious(int doSomethingToMe, Func<int, long> doSomething)
{
    long y = doSomething(doSomethingToMe);
    Console.WriteLine(y);
}
Run Code Online (Sandbox Code Playgroud)

我们可以通过写这个来调用这个方法:

Radlicious(77, SquareOf);
Run Code Online (Sandbox Code Playgroud)

Func<int, long>是一种特殊的代表.它存储接受整数并吐出longs的行为.我们不确定它指向的方法与我们传递的任何给定整数有关; 我们所知道的是,无论发生什么,我们都会long回来.

我们不必提供任何参数,SquareOf因为Func<int, long>描述了行为,而不是数据.调用Radlicious(77, SquareOf)只是给Radlicious一般行为SquareOf("我取一个数字并返回它的正方形"),而不是SquareOf对任何特定整数会做什么.

现在,如果你已经理解了我在说什么,那么你已经有了一个人,因为我自己并没有真正得到这些东西.

*结束答案,开始ID ID ID*

我的意思是,似乎ints可能被认为是非常无聊的行为:

static int Nine()
{
    return 9;
}
Run Code Online (Sandbox Code Playgroud)

也就是说,数据和行为之间的界限看似模糊,通常认为数据只是无聊的行为.

当然,人们可以想象超级"有趣"的行为,它采用各种抽象参数,但需要大量信息才能调用它.如果它要求我们提供它将为我们编译和运行的源代码怎么办?

好吧,那么我们的抽象似乎已经让我们一路回到原点.我们的行为如此抽象,需要我们程序的完整源代码来确定它将要做什么.这是完全不确定的行为:函数可以做任何事情,但必须提供一切来确定它的作用.另一方面,完全确定的行为,例如Nine(),不需要任何其他信息,但除了返回之外不能做任何其他事情9.

所以呢?我不知道.


wom*_*omp 21

在最简单的术语中,它本质上是指向方法的指针.

您可以拥有一个包含委托类型的变量(就像您拥有一个可以保存int类型的int变量一样).您只需像调用函数一样调用变量,就可以执行委托指向的方法.

这使您可以像拥有可变数据一样拥有变量函数.您的对象可以接受来自其他对象的委托并调用它们,而无需自己定义所有可能的函数.

当您希望对象根据用户指定的条件执行操作时,这非常方便.例如,根据用户定义的true/false表达式过滤列表.您可以让用户指定委托函数以用作过滤器来评估每个列表项.