一、delegate到底是什么对象
孩子,C语言总学过吧,如果你学得不像我那么差的话,函数指针总用过吧,就算没用过总风闻过吧,嗯,斗胆的报告你,你完全可以把delegate理 解成C中的函数指针,它允许你通报一个类A的要领m给另一个类B的东西,使得类B的东西能够挪用这个要领m,说白了就是可以把要领看成参数通报。不过 delegate和函数指针还是有点区另外,delegate有许多函数指针不具备的长处。首先,函数指针只能指向静态函数,而delegate既可以引 用静态函数,又可以引用非静态成员函数。在引 用非静态成员函数时,delegate不单生存了对此函数入口指针的引用,而且还生存了挪用此函数的类实例的引用。其次,与函数指针相 比,delegate是面向东西、类型安适、可靠的受控(managed)东西。也就是说,runtime能够保证delegate指向一个有效的要领,, 你无须担忧delegate会指向无效地点或者越界地点。
有什么能比举个例子更能说明问题呢,代码才是硬原理,来吧,看几个例子吧:
第一个例子:
public class DelegateTest
{
// 声明delegate东西
public delegate void CompareDelegate(int a,int b);
// 欲通报的要领,它与CompareDelegate具有不异的参数和返回值类型
public static void Compare(int a,int b)
{
Console.WriteLine((a>b).ToString());
}
public static void Main()
{
// 创建delegate东西
CompareDelegate cd = new CompareDelegate(DelegateTest.Compare);
// 挪用delegate
cd(1,2);
}
}
public class DelegateTest { // 声明delegate东西 public delegate void CompareDelegate(int a,int b); // 欲通报的要领,它与CompareDelegate具有不异的参数和返回值类型 public static void Compare(int a,int b) { Console.WriteLine((a>b).ToString()); } public static void Main() { // 创建delegate东西 CompareDelegate cd = new CompareDelegate(DelegateTest.Compare); // 挪用delegate cd(1,2); } }再来一个例子:
public delegate void MyTestDelegate(int i);
public class Program
{
public static void Main()
{
//创建delegate
ReceiveDelegateArgsFunc(new MyTestDelegate(DelegateFunction));
}
//这个要领接收一个delegate类型的参数,也就是接收一个函数作为参数
public static void ReceiveDelegateArgsFunc(MyTestDelegate func)
{
func(21);
}
//欲通报的要领
public static void DelegateFunction(int i)
{
System.Console.WriteLine("传过来的参数为: {0}.", i);
}