通俗讲,所谓委托就是将函数作为变量去使用。
一个类似的动作一直在做。但是还有细微的差别,比如:中国人问好是:"你好,XXX",而美国人问好是:“Hello,XXX”
将问好这个动作封装为函数的话,就会出现如下两个函数,这两个函数应该这么写:
public static void ChineseSayHi(string name){
Console.WriteLine("你好"+name);
}
public static void AmericanSayHi(string name){
Console.WriteLine("Hello"+name);
}
可见这两个函数是无法重载的,理由是:函数名和参数是一样的!
但是明显这样写效率是不高的,我们为了解决这个问题。可以用委托来解决!
使用委托法一:
//1、定义委托类型【与类是同一级别的】
public delegate void DelSayHi(string name);//注意:delete是小写,要和函数的签名一致,即方法名和参数要一致
//2、将方法指向委托
DelSayHi del = new DelSayHi(具体方法);//具体方法为:ChineseSayHi/AmericanSayHi
//3、传参
del("name");
使用委托法二:
//1、定义委托类型【与类是同一级别的】
public delegate void DelSayHi(string name);//注意:delete是小写,要和函数的签名一致,即方法名和参数要一致
//2、定义一个函数负责执行委托【将函数指向委托,传参】
public static void Test(string name,DelSayHi del)
{
del(name);
}
现给出完整的案例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 委托学习
{
//delete是小写,要和函数的签名一致,即方法名和参数要一直
public delegate void DelSayHi(string name);
class Program
{
static void Main(string[] args)
{
//--------调用委托的方法1-------------本法不用定义一个专门执行委托的方法,如Test
//将一个函数指向一个委托
DelSayHi del = new DelSayHi(SayEnglish);
//传参
del("王五");
//--------调用委托的方法1-------------
//--------调用委托的方法2-------------本法需要声明一个函数,负责指向委托,同时传参数
将不用的部分封装为一个方法传入【仅仅是将不同的那一部分封装为一个委托对象】
//Test("张三",SayChinese);
//--------调用委托的方法2-------------
Console.ReadKey();
}
/// <summary>
/// 调用委托的方法
/// </summary>
/// <param name="name"></param>
/// <param name="del"></param>
public static void Test(string name,DelSayHi del)
{
del(name);
}
/// <summary>
/// 汉语说你好
/// </summary>
/// <param name="name"></param>
public static void SayChinese(String name)
{
Console.WriteLine("你好,"+name);
}
/// <summary>
/// 英语说你好
/// </summary>
/// <param name="name"></param>
public static void SayEnglish(String name)
{
Console.WriteLine("Hello," + name);
}
}
}