请教C#回调函数的调用问题

如题所述

其实在C#语言中,如果不考虑unsafe编程的情况下,C#已经不存在指针了!但是有一种情况很特殊——我们需要实现将一个成员方法(函数是不规则的称呼,面向对象中只有成员方法,没有函数的概念了)做为一个参数传入到另一个方法。
当然,在C/CPP中我们存在指针,把函数(或成员方法,面向过程语言或支持面向过程语言中存在函数或过程的概念)指针做为参数传递即可——这是一种典型的“传址”引用的方式,在C#没有指针的情况下想完成一个传址引用,ref/out只能传递参数变量,并不能将方法转换成地址传入另一个方法的参数(方法参数化),怎么办——委托!
其实说白了,委托就是一种特殊的“代理”形式,把一个成员方法代理成一个变量(delegate变量),可以直接进行调用(根据委托形式,可以找到委托中代理的具体成员方法)!
回调就是一个委托的特殊形式,如果说委托着重于说明“代理”调用的话,而回调则是着重说明成员方法的参数化(指针特性)。
很多个认为一个完整的委托是要有委托(delegate声明)和代理的方法(真正执行的方法),然后要求其形式完全一致,但是,由于C#语法糖的存在,我们还种一种特殊形式的委托——匿名委托!很多人很奇怪,为什么方法名参做为一个参数呢?其实就是匿名委托,传入并非方法名,而是方法名的匿名委托(委托没有名字,所以只需要传入方法名即可)!
不要以为你回调函数你传入的是方法名——因为匿名委托的原因,这个方法名被自动包装成了一个没有名字的委托!看起来是传入方法名——其实原理根本不是那么回事!
当然即使你理解成方法名也可以,但只是一种错误的理解。因为他与常规的委托着重点不同,委托着重于代理执行,用于编译时确认成员方法。而回调则是运行时确定成员方法,着重于指针形式,所以匿名委托足以使用,能让你更容易理解回调函数(好象是被调用对象在执行期间又重新调用了调用对象的某个方法,所以叫回调——执行绪再次调用主体成员方法——就是A对象调用了B对象的BMethod方法,而BMethod方法需要再调用A对象的某个成员方法AMethod,那么传入Amethod方法的匿名委托就是回调,当然如果C对象是A对象的一个属性或成员时,调用C对象的方法也是回调——A的某个对象属性的成员方法)
回调如果你把CallBack参数当做一个成员方法时,那么,回调方法的理解也会变得超简单。
温馨提示:内容为网友见解,仅供参考
无其他回答

请教C#回调函数的调用问题
而回调则是运行时确定成员方法,着重于指针形式,所以匿名委托足以使用,能让你更容易理解回调函数(好象是被调用对象在执行期间又重新调用了调用对象的某个方法,所以叫回调——执行绪再次调用主体成员方法——就是A对象调用了B对象的BMethod方法,而BMethod方法需要再调用A对象的某个成员方法AMethod,那么传...

求助:C# 调用C++的dll的回调函数的结构体数组的问题,为什么只得到数组的...
关键是 lpOnRecvCardEvent 这个函数的第二个参数是个 C++ 指针。楼主在 C# 中声明这个导出函数时,使用了并不对应的 CardEvent[] C# 数组类型。正确的做法是: 在 C# 声明 lpOnRecvCardEvent 时,第二个参数应该是 IntPtr ,不是数组。由于楼主的这个 VC DLL 可能是自己写的,我没办法给出正确...

如何在C#写的dll 里调用回调函数?
2.使用TCP通信,监听端口获取消息,这是跨平台程序通信最常用也是最正统的方法。一般是跨操作系统编程常用的,比如windows和linux ubuntu server程序进行交互。你所述情况虽然不算跨操作系统通信,但是也是跨平台了。而且想想就知道C++作为先出现的语言而且是编译型语言,调用C#托管区的函数还要设回调,其难度...

c#调用sdk时,求教回调函数如何处理
回调函数用.NET中的委托处理 比如SDK中有个查找所有窗口的函数:[DllImport("user32")]private static extern bool EnumWindows(DelegateEnumWindow ew, int lParam);上面的参数ew就是一个委托(回调函数),再看这个参数的声明:delegate bool DelegateEnumWindow(IntPtr hWnd, int lParam);再看调用:DelegateEn...

C# 回调函数会出现错误的问题
这是因为你的回调委托作用域问题。在回调时,委托已经被回收了 所谓成员变量:class test{ public delegate a;public void foo(){ private delegate b;} } 像这种情况,b委托的作用域只在foo()函数里面,如果你让b被非托管代码回调,当foo执行完后,非托管代码回调时很可能b已被回收了。所以出现...

c#调用sdk时,求教回调函数如何处理
System.Runtime.InteropSerivces.Marshal类中有相关方法,能返回委托相对应的指针:IntPtr GetFunctionPointerForDelegate<T>(T targetDelegate);通过这个函数就能获取委托相对应的指针,再把指针传递给 SDK 函数即可。

求助:如何封装C++的中的回调函数供C#调用
首先用c++写一个带有回调函数的方法 Test,在此省略。接着,在c#中调用,如:[DllImport("Test.dll",ChartSet.Ansi,EntryPoint="ReadMyVideo",ExactSpelling=false,CallingConvertion=CallingConvertion.StdCall)]private static extern void Test(string fileName,CallbackDelegate callback);接下来我们再...

c# 异步回调的疑问
n.ToString();\/\/ 参数n就是异步回调返回的结果,} 异步回调需要编写代码才能支持,网络传输方面的类库一般都提供异步方法,如socket编程,web服务,ajax,wcf等,有些异步是同一个线程完成的,有些异步是不同的线程,所以回调函数里要更新控件都会提示跨线程访问控件的错误提示。该文章转自:站点基地 ...

c#-回调callback是什么原理,机制? C#
当被调函数所执行处理完毕时,被调函数反过来调用一个指定的函数(称为回调函数)向调用者返回处理结果或通知调用者处理结束。这个过程称为回调(Callback)。通常,调用者发出调用时,以函数参数方式将回调函数传递给被调函数。在C#中,回调过程与其他语言没有区别,只是回调函数是以委托方式传递的。

[100分]C# 如何向事件的回调函数中传递参数?
Click事件用户无法自主调用(都是由系统调用的),即便能传递参数,你又如何传进去呢?RoutedEventHandler委托已经第二个参数是事件参数,如果你需要自定义事件,可以用EventHandler<T>或扩展EventHandler重新定义事件,那要怎样取消匿名函数的订阅呢?匿名方法无法取消订阅,如果你需要取消订阅的功能,使用命名...

相似回答