当前位置: 代码迷 >> C# >> C#小白回提问(7):委托疑问
  详细解决方案

C#小白回提问(7):委托疑问

热度:187   发布时间:2016-04-28 08:35:23.0
C#小白来提问(7):委托疑问

public delegate void ThreadStart();

然后

ThreadStart ts = new ThreadStart(obj.Foo);

从原理上来说,ThreadStart还应该接受this指针参数。因为成员方法Foo里面可能用到了obj的字段。


C++的回调函数,传成员方法时是一定要带上this指针的。

为什么C#不用传,而C++为什么没有按C#的方式来做。
------解决思路----------------------
为什么C#不用传
因为Delegate里已经包含了,可以用Delegate.Target获得

而C++为什么没有按C#的方式来做
因为C++出现的早,而且和微软没什么关系
------解决思路----------------------
C++出现的早,可Anders probably knows c++ as well as pascal。

没看懂楼主说的“C++的回调函数,传成员方法时是一定要带上this指针的”说的是啥意思。你指的是function object中的binder吗?

non-static member function需要一个instance来invoke,所以那个member function pointer里保存的只是一个offset,depending on it's virtual or not, you may be able to pass this pointer across address space。

所以, “传成员方法”是不需要this的!但当使用".*"或者"->*" operator来调用成员函数指针指向的函数时,的确需要一个class instance。

当然,c++ member function的实现,肯定是将this当作成员函数的参数的,只不过这是由编译器替你完成的。至于c#,一切都在class里,连global function都木有,你觉得它的函数引用:
为什么C#不用传
因为Delegate里已经包含了,可以用Delegate.Target获得

而C++为什么没有按C#的方式来做
因为C++出现的早,而且和微软没什么关系
  相关解决方案