有人可以将一个代表分解成一个简单,简洁和简洁的解释,包括目的和一般的好处吗?我试图绕过这个,但它并没有陷入其中.
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中减去它(从我脑中随机选择的数字).
在进一步检查,它好像只有部分SquareOf是DoSomethingRad关心的是,我们可以给它一个整数(numberToSquare),它给了我们一个long(因为我们把它的返回值y和y一个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)
见多么相似DoSomethingLeet是DoSomethingRad?如果只有一种传递行为(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表达式过滤列表.您可以让用户指定委托函数以用作过滤器来评估每个列表项.
| 归档时间: |
|
| 查看次数: |
871 次 |
| 最近记录: |