委托是用来处理其他语言(如 C++、Pascal 和 Modula)需用函数指针来处理的情况的。不过与 C++ 函数指针不同,委托是完全面对对象的;另外,C++ 指针仅指向成员函数,而委托同时封装了对象实例和方法。委托声明定义一个从 System.Delegate 类派生的类。委托实例封装一个调用列表,该列表列出一个或多个方法,其中每个方法均作为一个可调用实体来引用。对于实例方法,可调用实体由该方法和一个相关联的实例组成。对于静态方法,可调用实体仅由一个方法组成。用一个适当的参数集来调用一个委托实例,就是用此给定的参数集来调用该委托实例的每个可调用实体。委托实例的一个有趣且有用的属性是:它不知道也不关心它所封装的方法所属的类;它所关心的仅限于这些方法必须与委托的类型兼容
C#高级编程中有讲,C#是有指针的看看我临时的写的一个委托的例子 using System;namespace york { public delegate void ClassOver(); public class Clock { public ClassOver classOver;
public void TimeEnd() { if (classOver!=null) { classOver(); } } }
public class Student { public string studentname; public Student(string StudentName) { studentname = StudentName; } public void GoHome() { Console.WriteLine(studentname + " is going home!"); } }
public class MainEntryPoint { static void Main() { Clock clock = new Clock(); Student york = new Student("york"); clock.classOver = new ClassOver(york.GoHome); '此处相当于传入函数指针 clock.TimeEnd(); } } }
给你一个例子,通过API设置信息处理函数的入口:using System.Runtime.InteropServices;namespace WindowsApplication3 { public delegate int WndMessage(int hWnd , int Msg , int wp, int lp ); public class Form1 : System.Windows.Forms.Form { private const int GWL_WNDPROC = (-4);
[DllImport("user32")] private static extern IntPtr GetWindowLongA(IntPtr hWnd, int nIndex ); [DllImport("user32")] private static extern int SetWindowLongA(IntPtr hWnd, int nIndex , WndMessage dwNewLong );//用于设置 [DllImport("user32")] private static extern int SetWindowLongA(IntPtr hWnd, int nIndex , IntPtr dwNewLong );//用于恢复
[DllImport("user32")] private static extern int CallWindowProcA(IntPtr lpPrevWndFunc, IntPtr hWnd, int Msg , int wParam , int lParam ); private IntPtr m_Old_WndMessage;//旧的函数指针 private WndMessage m_New_WndMessage;//新的函数指针 private void button1_Click(object sender, System.EventArgs e) { //保存旧函数指针 this.m_Old_WndMessage =GetWindowLongA(this.Handle, GWL_WNDPROC); //设置新指针 this.m_New_WndMessage =new WndMessage(this.NewWndMessage); SetWindowLongA(this.Handle, GWL_WNDPROC, this.m_New_WndMessage); } private int NewWndMessage(IntPtr hWnd , int Msg , int wp, int lp ) { return CallWindowProcA(this.m_Old_WndMessage, hWnd, Msg, wp, lp); } private void button2_Click(object sender, System.EventArgs e) { //恢复原来的消息处理函数 SetWindowLongA(this.Handle, GWL_WNDPROC, this.m_Old_WndMessage ); } } }
C++才叫做函数指针
好像是这样 ,我也是刚学c#
using System;namespace york
{
public delegate void ClassOver();
public class Clock
{
public ClassOver classOver;
public void TimeEnd()
{
if (classOver!=null)
{
classOver();
}
}
}
public class Student
{
public string studentname;
public Student(string StudentName)
{
studentname = StudentName;
}
public void GoHome()
{
Console.WriteLine(studentname + " is going home!");
}
}
public class MainEntryPoint
{
static void Main()
{
Clock clock = new Clock();
Student york = new Student("york");
clock.classOver = new ClassOver(york.GoHome); '此处相当于传入函数指针
clock.TimeEnd();
}
}
}
{
public delegate int WndMessage(int hWnd , int Msg , int wp, int lp ); public class Form1 : System.Windows.Forms.Form
{
private const int GWL_WNDPROC = (-4);
[DllImport("user32")]
private static extern IntPtr GetWindowLongA(IntPtr hWnd, int nIndex ); [DllImport("user32")]
private static extern int SetWindowLongA(IntPtr hWnd, int nIndex , WndMessage dwNewLong );//用于设置
[DllImport("user32")]
private static extern int SetWindowLongA(IntPtr hWnd, int nIndex , IntPtr dwNewLong );//用于恢复
[DllImport("user32")]
private static extern int CallWindowProcA(IntPtr lpPrevWndFunc, IntPtr hWnd, int Msg , int wParam , int lParam ); private IntPtr m_Old_WndMessage;//旧的函数指针
private WndMessage m_New_WndMessage;//新的函数指针 private void button1_Click(object sender, System.EventArgs e)
{
//保存旧函数指针
this.m_Old_WndMessage =GetWindowLongA(this.Handle, GWL_WNDPROC);
//设置新指针
this.m_New_WndMessage =new WndMessage(this.NewWndMessage);
SetWindowLongA(this.Handle, GWL_WNDPROC, this.m_New_WndMessage);
} private int NewWndMessage(IntPtr hWnd , int Msg , int wp, int lp )
{
return CallWindowProcA(this.m_Old_WndMessage, hWnd, Msg, wp, lp);
} private void button2_Click(object sender, System.EventArgs e)
{
//恢复原来的消息处理函数
SetWindowLongA(this.Handle, GWL_WNDPROC, this.m_Old_WndMessage );
}
}
}