C# 委托实际上类似于C++中的函数指针,因为C#中不存在指针,所以用委托可以完成一些原来在C++中用函数指针完成的操作,例如传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,委托有许多函数指针不具备的优点。
1、函数指针只能指向静态函数,而委托既可以引用静态函数,又可以引用非静态成员函数。在引用非静态成员函数时,委托不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。
2、与函数指针相比,委托是 面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,无须担心delegate会指向无效地址或者越界地址。
实现一个委托是很简单的,通过以下3个步骤即可实现一个delegate:
1.声明一个delegate对象,它应当与你 想要传递的方法具有相同的参数和返回值类型。
声明一个代理的例子:
public delegate int MyDelegate(string message);
2.创建delegate 对象,并将你想 要传递的函数作为参数传入。
创建代理对象的方法:
1). MyDelegate myDelegate = new MyDelegate(实例名.方法名); // 重点
2). MyDelegate myDelegate = new MyDelegate(类名.方法名);
注:如果需要代理的方法是一个 static静态方法的话,采用第2种方式,否则采用第1种方式。
3.在要实现异步调用的地方,通过上一步创建的对象来调用方法。
可以直接使用代理调用代理所指向的方法:
myDelegate(向方法传递的参数);
1、函数指针只能指向静态函数,而委托既可以引用静态函数,又可以引用非静态成员函数。在引用非静态成员函数时,委托不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。
2、与函数指针相比,委托是 面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,无须担心delegate会指向无效地址或者越界地址。
实现一个委托是很简单的,通过以下3个步骤即可实现一个delegate:
1.声明一个delegate对象,它应当与你 想要传递的方法具有相同的参数和返回值类型。
声明一个代理的例子:
public delegate int MyDelegate(string message);
2.创建delegate 对象,并将你想 要传递的函数作为参数传入。
创建代理对象的方法:
1). MyDelegate myDelegate = new MyDelegate(实例名.方法名); // 重点
2). MyDelegate myDelegate = new MyDelegate(类名.方法名);
注:如果需要代理的方法是一个 static静态方法的话,采用第2种方式,否则采用第1种方式。
3.在要实现异步调用的地方,通过上一步创建的对象来调用方法。
可以直接使用代理调用代理所指向的方法:
myDelegate(向方法传递的参数);