c# 委托
一、委托的两个最主要的作用:
1、委托是对方法或者方法列表的引用,实例化后的委托对象会将给定的参数传递给它所回调的方法,并去执行方法。
2、委托可以将某一个方法当作另一个方法的参数来进行传递,利用这种方法便可以动态的给方法赋值,避免了在程序中大量的使用If-Else(Switch)语句,使得程序具有更好的可扩展性。
二、委托的具体实现步骤
1、声明一个委托,其返回值和参数形式一定要和想要包含的方法的返回值与参数形式一致。
public delegate void DelegateGreeting(string name);
2、提供要处理的方法
private static void GreetPeople(string name)
{
Console.WriteLine("Hello,"+name);
Console.ReadLine();
}
3、创建委托对象并将所希望的方法包含在委托对象中。
DelegateGreeting MyDelegateGreeting=new DelegateGreeting(GreetPeople);
4、通过委托对象调用包含在其中的各个方法。
MyDelegateGreeting("Darren liu”);
完整代码如下:
namespace 委托
{
class 委托1
{
public delegate void DelegateGreeting(string name);
static void Main(string[] args)
{
DelegateGreeting MyDelegateGreeting=new DelegateGreeting(GreetPeople);
MyDelegateGreeting("Darren liu");
}
private static void GreetPeople(string name)
{
Console.WriteLine("Hello,"+name);
Console.ReadLine();
}
}
}
通过上述代码,我们可以看到,所谓的委托就是一个可以保存方法的变量。委托的最终目的就是把一个类的某个方法传递到另一个类中去调用而无需传递前一个类的对象。
三、委托链
委托链就是将多个方法捆绑到同一个委托对象上。当调用这个委托对象时,将会依次调用委托链中的方法。
完整代码如下:
namespace 委托
{
class Delegate2
{
public delegate void DelegateGreeting(string name);
static void Main(string[] args)
{
DelegateGreeting MyDelegateGreeting = new DelegateGreeting(ChineseGreeting.CGreeting);
MyDelegateGreeting += EnglishGreeting.EGreeting;
// MyDelegateGreeting -= ChineseGreeting.CGreeting;
MyDelegateGreeting("Darren liu");
}
}
class EnglishGreeting
{
public static void EGreeting(string name)
{
Console.WriteLine("Morning," + name);
Console.ReadLine();
}
}
class ChineseGreeting
{
public static void CGreeting(string name)
{
Console.WriteLine("早上好," + name);
Console.ReadLine();
}
}
四、委托可以将某一个方法当作另一个方法的参数来进行传递,代码如下:
public delegate void GreetingDelegate(string name);
class Delegate2
{
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);
}
static void Main(string[] args)
{
GreetPeople(“Darren liu ", EnglishGreeting);
GreetPeople(“Darren liu", ChineseGreeting);
Console.ReadKey();
}
}
我们可以分析以上代码,把一个委托对象GreetingDelegate MakeGreeting当作一个方法GreetPeople的参数传入该方法中。当传入的方法是EnglishGreeting时,也就是说该委托对象MakeGreeting所指定的方法就是EnglishGreeting。因此在Main中执行GreetPeople(“Darren liu ", EnglishGreeting)时,也就是执行的EnglishGreeting方法。