概念
委托:是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
指针和委托的区别
委托可以引用实例和静态(在 Visual Basic中为Shared)方法,而函数指针只能引用静态(在 Visual Basic 中为 Shared)方法。其实它们是有区别的,在非托管C/C++中,函数的地址就是一个内存地址。该地址不会携带任何额外的信息,例如函数期望的参数个数、参数类型、函数的返回值类型及函数的调用约定。总之,非托管C/C++中函数指针是非类型安全的。.NET中的委托是类型安全的,委托会检测它所保存的函数引用是否和声明的委托匹配。
指针的只是一个引用地址,而这个地址中,没有任何除地址之外的信息,这样就不能验证是否有权访问该地址下的方法。
委托,在引用地址中可以存放参数,参数类型,返回值类型及函数调用约定等信息。
总结:
1.委托的关键就是解决了怎么确定作为参数的方法的类型。也就是说,当我们声明一个委托方法的时候,我们可以将任何方法以该委托为类型在另一方法中使用。
2.委托不同于string的一个特性:可以将多个方法赋给同一个委托,或者叫将多个方法绑定到同一个委托,当调用这个委托的时候,将依次调用其所绑定的方法。
3.使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。
下面是关于委托的一个demo,仅供参考:
public delegate void GreetingDelegate(string name);
public class GreetingManager
{
public event GreetingDelegate MakeGreet;
//事件其实没什么不好理解的,声明一个事件不过类似于声明一个进行了封装的委托类型的变量而已。
public void GreetPeople(string name)
{
MakeGreet(name);
}
}
public class Program
{
#region 方法
private static void EnglishGreeting(string name)
{
Console.WriteLine("Morning ," + name);
}
private static void ChineseGreeting(string name)
{
Console.WriteLine("早上好," + name);
}
//private static void GreetPeople(string name, GreetingDelegate MakeGreeting) //传入委托类型的方法的参数
//{
// MakeGreeting(name);
//}
#endregion
static void Main(string[] args)
{
GreetingManager gm = new GreetingManager();
//GreetingDelegate delegate1;
//delegate1 = EnglishGreeting;
//delegate1 += ChineseGreeting; //可以给一个委托绑定多个方法。
// delegate1("yang");
gm.MakeGreet += EnglishGreeting;
gm.MakeGreet += ChineseGreeting;
gm.GreetPeople("LCY");
Console.ReadKey();
#region 注释
//gm.GreetPeople("LCY",delegate1 );
//GreetPeople("LCY", delegate1 );
//GreetPeople("Lee", ChineseGreeting);
#endregion
}