在C++下面,指针是一个让人欢喜让人忧的东西,其强大无比,个人经验来看,50%的BUG都是指针的问题,前不久用心看了一下C++下面的函数指针,感觉相当好用,尤其是对于类的封装而言,其作用类似MFC下面的消息响应,但消息响应似乎只是CWnd下面的东西,如果想将类A调用类B的函数,函数指针是个很正常的选择。
函数指针,个人而言,多数是当消息响应来用,这个思路可能是由于受Action Script的方法影响,至于好与坏,很难说清楚。在C#下面,由于泛型的存在,指针的概念并不十分明确,但很明显的,在C#下面实现C++的函数指针功能算挺简单的,使用的是delegate的方法,你说它是委托也好,说是代理也行。
delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的引用。它所实现的功能与C/C++中的函数指针十分相似。它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,delegate有许多函数指针不具备的优点。
下面直接贴代码好了,比较简单的例子,看注释都可以明白的了,纯粹是个人备忘用的而已。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Diagnostics; namespace JustTest { //声明函数指针的类型 public delegate void MsgHandler(string strMsg); //类A public class ClassA { //函数指针 private MsgHandler _msgHandler; //类A的构造函数 public ClassA() { } //设置函数指针的方法 public void SetHandler(MsgHandler h) { this._msgHandler = h; } //在类A内部调用函数指针并传递参量 public void DoSomething() { Debug.WriteLine("DoSomething..."); if (this._msgHandler != null) { this._msgHandler("Param"); } } } //使用一个WinForm的应用程序 public partial class Form1 : Form { //定义类A的变量 private ClassA a; public Form1() { InitializeComponent(); //实例化 a = new ClassA(); a.SetHandler(this.ForTest); a.DoSomething(); } //a内部通过函数指针调用的函数 public void ForTest(string s) { Debug.WriteLine("Process in the form , the in string is : " + s); } } }
执行的结果,在VS下的输出窗体:
DoSomething...
Process in the form , the in string is : Param
转载于:https://blog.51cto.com/joeyliu/1196450