Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当同样的事情可以通过调用方法来完成时,为什么要使用回调呢_C#_.net_Callback - Fatal编程技术网

C# 当同样的事情可以通过调用方法来完成时,为什么要使用回调呢

C# 当同样的事情可以通过调用方法来完成时,为什么要使用回调呢,c#,.net,callback,C#,.net,Callback,我知道回调本身就是方法,并且作为参数传递给另一个方法 但为什么我们需要将方法作为参数传递,而我们只需调用该方法就可以直接传递呢 例如: private static void TakeAction(Action<String> action) { } TakeAction((s) => { Console.WriteLine(s); }); 那为什么要回电话呢?它解决了什么具体问题?您有一个对Fo1方法的编译时引用,所以只需调用它。如果在编译时不知道该方法怎么办?你怎么称

我知道回调本身就是方法,并且作为参数传递给另一个方法

但为什么我们需要将方法作为参数传递,而我们只需调用该方法就可以直接传递呢

例如:

private static void TakeAction(Action<String> action)
{

}

TakeAction((s) => { Console.WriteLine(s); });

那为什么要回电话呢?它解决了什么具体问题?

您有一个对
Fo1
方法的编译时引用,所以只需调用它。如果在编译时不知道该方法怎么办?你怎么称呼它?这就是为什么代表很有用

你能想象没有委托(或者你说的回调)的“Linq”吗。没有代表,林克什么都不是。Net framework如何调用您的方法(在您自己的程序集中定义)

嗯,有一个办法。我们可以使用接口,但这和java的方式没有什么不同。这是c#的做法。

通过定义委托,您是在对类的用户说 “请随意在此处和此处放置与此签名匹配的任何方法 每次调用我的代理时都会调用它“


我想这就足以让你知道为什么要使用回调,而同样的事情可以通过调用方法来完成

委托(你称它们为回调)是类型,它描述了它们可以存储在变量中的方法的类型。这使您可以选择动态选择程序使用的方法,而无需使用整个命令模式(您必须定义一个类,该类使用您选择的方法实现接口)。

这不是重点。只是告诉编译器方法的签名并不完全符合委托或回调的目的
private static void TakeAction()
{
    Fo1();
}

private static void Fo1(string s)
{
    Console.WriteLine(s);
}