`
java-mans
  • 浏览: 11423487 次
文章分类
社区版块
存档分类
最新评论

C++ VS C#(7):指向函数的指针和委托

 
阅读更多

//=====================================================================
//TITLE:
// C++ VS C#(7):指向函数的指针和委托
//AUTHOR:
// norains
//DATE:
// Thursday 17-January-2011
//Environment:
// Visual Studio 2010
// Visual Studio 2005

//Modify
// AM,Thursday 17-January-2011 初稿
// PM,Thursday 17-January-2011 修改C++调用的方式
//=====================================================================

1. 指向函数的指针和委托

开篇点题,假设我有两个形参和返回类型都一样的两个函数,如:

现在我不想直接调用这两个函数,而是间接通过某种方式来进行调用。这话看起来似乎有点拗口,不直接,我们还是来换一种说法。假设我们有一个容器,而该容器能够获取函数的相关信息,但我们不必去关心调用函数是什么,只需要调用容器,让容器去选择相应的函数即可。

这个所谓的容器,无论是在C++还是在C#,都是存在的。那么,我们首先从C++开始。

在C++中,这个容器的名字叫做:指向函数的指针。没错,就是指针。指针绝对是C++的精髓,就像万金油一样,放到哪里都是真理。只不过这里的指针是指向函数的,所以声明起来似乎有点怪异,代码如下:


赋值好理解,和普通的赋值没什么区别;调用理解上也不算很难,简单点来看也就是相当于Multiply(a,b),复杂一点的加*也可当成是获取指针指向的函数来理解。而声明的这个语句:int (*pFunc)(int,int),怎么咋看咋别扭呢?没办法,这个我们也改变不了,因为标准是定死的。只不过,C++有趣就有趣在这里,你可以使用typedef来使得声明更清晰!不信,我们一起来看:


相对之前的直接声明,这样的声明是不是更加清楚?当然,代价就是多出一行typedef代码。

至此,C++的描述就暂时告一段落,我们接下来看看C#。在C#中,是不存在指针的,自然也不会有指向函数的指针这种玩意,取而代之的是委托。委托的声明非常类似于函数,但它不带函数体,并且需要使用delegate关键字。如果以C#来实现,那么代码如下:


C#中采用委托的方式,其实和C++的typedef非常相像,都是必须先定义一个类型,然后用该类型去声明一个变量。最大的不同在赋值阶段,C++只需要简单的将函数地址赋给指针,而C#必须用new声明一个对象,并且还要求相应的函数作为形参传入。在这个阶段,似乎C#显得更为复杂。到了调用阶段,C++和C#都可以容器后加个括号就能完成调用,但C++还多了一种*的方式。虽然这种方式有点鸡肋,但毕竟多了一种乐趣,何乐而不为呢?

分享到:
评论

相关推荐

    C# 调用C++DLL(函数参数包含指针)

    C#调用C++DLL,C++DLL中的函数参数包含指针。 绝对可用。

    C#中的委托类似C++中的函数的指针,功能强大,灵活

    在C#中,为了提供类似C++中函数指针的功能,微软提出了委托和事件的概念。这里有一个很奇怪的事情,那就是当牵涉到指针是,对于初学者而言,似乎很费解。鄙人对于C#中的委托和事件有一些见解,希望对那些要了解委托...

    C++ 使用STL和函数指针 实现的委托

    C++模拟实现的类似于C#的委托。 使用STL封装类名称的变化,使用函数指针封装函数名称的变化。 在Visual C++ 6.0下测试通过。 使用的时候只需要关注IFunctor和IDelegate两个接口即可。

    C# 调用c++ 库 参数为指针类型导出函数

    c# Csharp调用 c++库 参数为导入和导出指针两种 包含C++ DLL源码 如fun(cont char* A,char*B) A为输入参数,B为输出参数-C# CSharp call C++ DLL lib dll function param use export and import eg: fun(cont char*...

    调用示例.rar_C#调用c++ dll_C#调用函数指针_C#调用结构体_结构体_调用C dll

    C#调用C++ dll, 包括结构体, 数组, 函数指针, 字符串等等

    成员函数指针与高性能的C++委托

    成员函数指针与高性能的C++委托着重描述C++中如何实现其他面向对象语言如C#,JAVE中的委托功能

    C++实现C#事件机制

    C++ 模拟 C# 事件 函数指针 尾随参数

    C#调用CDLL带指针参数的函数

    C#调用CDLL带指针参数的函数的实例.

    C#中byte数组和c++结构体的转换

    在写C#TCP通信程序时,发送数据时,只能发送byte数组,处理起来比较麻烦不说,如果是和c++等写的程序通信的话,很多的都是传送结构体,在VC6.0中可以很方便的把...C#调用c++dll时也可以使用此函数来转换结构体或指针。

    C#高级编程_委托和事件

    C#高级编程 委托和事件: 回调(callback)函数是Windows 编程的一个重要部分。如果您具备C 或C++编程背景,应该就曾 在许多Windows API 中使用过回调。Visual Basic添加了AddressOf关键字后,开发人员就可以利用以 前...

    C++中实现委托(delegate)

    网上有很多关于C++ delegate机制的文章,但都讲的是函数指针的内容,上周就C++中实现C#的delegate机制的问题研究了好几天,查看了很多相关资料,才解决了问题,现将我写的C++ delegate测试程序贴出来,希望能帮到有...

    C#委托所蕴含的函数指针概念详细解析

    1、函数指针,实际上是函数编码后的指令在内存中的首地址,在C++/C中,这个地址可以用函数名直接使用 一个函数调用另一个函数的时候,就可以把被调用函数以函数指针的形式作为参数传入 2、回调函数callback使用的...

    基于C#调用c++Dll结构体数组指针的问题详解

    下面小编就为大家分享一篇基于C#调用c++Dll结构体数组指针的问题详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    才C#于C++的差别

    下表包含 C# 和本机 C++(它不使用 /clr)之间的重要比较信息。如果您是一位 C++ 程序员,此表将为您提供这两种语言的最重要差异。 1、继承:在 C++ 中,类和结构实际上是相同的,而在 C# 中,它们很不一样。C# 类...

    QT编写DLL调用示例 方法 参数 返回值 事件回调

    第二步:定义函数指针 以备调用; typedef int Add int ; 第三步:载入DLL 调用函数执行; QLibrary lib "qtdll dll" ; lib load ; Add add Add lib resolve "add" ; add 50 ; 3:C或C++ 第一步:...

    委托给了C#操作函数的灵活性

    委托给了C#操作函数的灵活性,我们可使用委托像操作变量一样来操作函数,其实这个功能并不是C#的首创,早在C++时代就有函数指针这一说法,而在我看来委托就是C#的函数指针,首先先简要的介绍一下委托的基本知识

    VS2008 C# 委托 事例

    C#委托可以看做是方法引用,或者叫方法指针,它和c++中使用的函数指针最大的区别就是委托是类型安全的。 委托声明时必须将方法的返回值和详细的参数列表列出来,这样在为委托指定方法时,可以进行类型安全的检查。

    C++中委托的实现方法

    C++模拟实现的类似于C#的委托。 相对于前一版本,此版本使用STL封装了参数列表的变化,支持包含0到9个参数的函数的委托形式,此外增加了对于全局函数(类静态函数)的委托的支持。 在Visual C++ 6.0下测试通过。

    C#调用C++编写的DLL函数各种参数传递

    C#调用C++编写的DLL函数各种参数传递

    c#委托与事件的关系

    c#用委托来实现事件通知机制。委托相当与c++函数指针。整个过程涉及一个呼叫者,一个被呼叫者,还有就是这个委托。

Global site tag (gtag.js) - Google Analytics