在C++下面,指针是一个让人欢喜让人忧的东西,其强大无比,个人经验来看,50%的BUG都是指针的问题,前不久用心看了一下C++下面的函数指针,感觉相当好用,尤其是对于类的封装而言,其作用类似MFC下面的消息响应,但消息响应似乎只是CWnd下面的东西,如果想将类A调用类B的函数,函数指针是个很正常的选择。


函数指针,个人而言,多数是当消息响应来用,这个思路可能是由于受Action Script的方法影响,至于好与坏,很难说清楚。在C#下面,由于泛型的存在,指针的概念并不十分明确,但很明显的,在C#下面实现C++的函数指针功能算挺简单的,使用的是delegate的方法,你说它是委托也好,说是代理也行。


delegateC#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,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