“call”和“invoke”之间有什么区别?

我正在读Daniel M. Solis的一本名为“Illustrated C#2010”的书。 这本书说:

“当调用或调用方法时……”

这两个术语有什么区别?

正如Michael Taylor在2006年MSDN论坛上所述 :

最终他们是完全相同的。 不同之处在于性能和收益。 如果直接调用方法,则编译器将生成必要的代码以在对象的虚拟表中查找方法起始地址,将参数推送到堆栈并调用该方法。 运行时最终负责处理此问题,因为vtable可以根据所使用的对象而改变。 鉴于现代处理器,高度优化和快速。 这是理想的使用机制。 问题是您必须在编译时知道被引用的类型,方法名称及其签名。 这正式称为早期绑定。 如果方法信息发生更改,那么您的代码将无法编译。 通常这不是问题,但有时候很重要。 这是调用的地方。

Invoke通常用于UI代码中。 在UI代码中,Windows的基本规则是您只能与创建UI的线程上的UI进行交互。 因此,如果要在辅助线程(例如工作线程)上与UI通信,则必须封送对正确线程的调用。 请注意,这也适用于事件。 它们实际上只不过是方法调用。 所有WinForm控件都inheritance的Control.Invoke方法允许您在UI线程上调用任意方法。 该方法处理将请求编组到正确的线程然后在方法上调用Invoke的过程。 即使您事先知道要调用哪种方法,这仍然是迟到的。

函数调用是指您在程序中自己调用函数。 函数调用是在自动调用时。

例如,考虑这个程序:

 struct s { int a,b,s; s() { a=2; b=3; } void sum() { s=a+b; } }; void main() { struct s obj; //line 1 obj.sum(); // line 2 } 

这里,当执行第1行时,调用函数(构造函数,即s)。 执行第2行时,将调用函数sum。

来源:网络

根据我的研究(个人和无偿),看看这些术语在编程文献和“野外”中的常用方式,我发现这些定义似乎符合他们的用法。

执行是指运行代码的过程。 确切的方法没关系,可以编译与否,由计算机完成或不完成。

应用/应用程序是指参数与函数的绑定。 申请可以是部分和完整的。 从函数式编程世界来看,部分应用程序会生成另一个参数较少的函数,而完整的应用程 Thunks是没有参数的函数,可以帮助“延迟评估”。

调用/调用是指为了执行而调度具有完全绑定参数的函数所需的过程。 这样的系统包括将参数推送到堆栈并将PC传送到新地址,将消息/对象/函数/ thunks放在队列上以供稍后执行或各种其他RPC系统。 确切的机制并不重要。 调度未来执行的概念很重要。 调用需要will函数执行。

呼叫是最不明确的。 通常是指完全应用函数然后调用它的组合过程,通常使用添加的语义,代码将等待返回值。

还请注意,从正在编写的当前代码的角度来看,所有这些术语都是主观的。 通过RPC调用调用函数只是从客户端调用它。 如果函数在服务器端具有任何“含义”作为函数,则从服务器端请求具有不同的调用点。

方法Invokation是一个术语,通常指间接调用方法(函数),因为直接调用它时遇到问题或困难。

例如,在并行编程的上下文中:考虑一个应用程序空间内的两个线程并行运行。 调用驻留在另一个线程上的对象的公共方法会引发Cross Thread Invokation Exception,因为可能会发生种族争用。 解决方案是调用对象来执行该方法,并将剩余的作业提供给对象以管理并行请求。

另一个例子是当你有一个指向某个方法的委托时。 当您要求委托者调用该(未知)方法时,您调用该方法来运行。

也许他只是简单地认为术语“呼叫”和“调用”是同义词,并且只想提及这两个词,因为这两个词都可以在野外遇到。 是不是可以使用在那种情况下?