一、什么是委托
委托是一个类,它定义了方法的类型,使得可以将方法当作另外一个方法的参数来进行传递;调用委托的时候,委托包含的所有方法将被执行。
二、委托的定义
public delegate void MyDel(int x);
public delegate string MyDel2(string msg);
三、声明委托变量
MyDel md;
四、初始化委托
md = new MyDel(方法名(intx));
五、委托赋值
md = 方法名(int x);
六、多播委托
MyDelmd = new MyDel(M1);
md += M1; // 增加方法
md += M1; // 增加方法
md 1= M1; // 减少方法
七、委托的调用
if(md !=null)
md.Invoke();
八、匿名方法
delegate int MyDel (int x); //定义一个委托
MyDeldel = delegate( int x){ return x; };
九、Lambda表达式
delegate int MyDel (int x); //定义一个委托
MyDeldel2 = (int x) => {return x;};//Lambda表达式
MyDel del3 = x => {return x};//简写的Lambda表达式
十、委托示例
1.委托实现不通的国家输出不同的问候语
/// <summary>
/// 定义无返回值带字符串参数的委托
/// </summary>
/// <paramname="name"></param>
delegate void ShowHiDelegate(stringname);
/// <summary>
/// 输出问候语
/// </summary>
/// <paramname="name"></param>
/// <paramname="show"></param>
static void SayHi(string name,ShowHiDelegate show)
{
show.Invoke(name);
}
/// <summary>
/// 输出中文问候语
/// </summary>
/// <param name="name">名字</param>
static void SayChina(string name)
{
Console.WriteLine("你好:" + name);
}
/// <summary>
/// 输出英文问候语
/// </summary>
/// <param name="name">名字</param>
static void SayEnglish(string name)
{
Console.WriteLine("Hi," +name);
}
static void Main(string[] args)
{
ShowHiDelegate showChina = newShowHiDelegate(SayChina);
// 输出中文问候语
SayHi("张三", showChina);
ShowHiDelegate showEnglish = newShowHiDelegate(SayEnglish);
// 输出中文问候语
SayHi("Tony",showEnglish);
Console.WriteLine("----------------------------------------");
Console.WriteLine("多播委托实现打招呼");
//多播委托输出
ShowHiDelegate sd = newShowHiDelegate(SayChina);
sd += SayEnglish;
SayHi("Tom", sd);
Console.ReadKey();
}
输出结果:
十一、Lamdba表达式在实际中的应用
List<int> list = newList<int>() { 1, 3, 2, 4, 6, 5, 8, 7, 9 };
list.Sort();
Console.WriteLine("操作源数组");
foreach (int item in list)
{
Console.Write(item +"\0");
}
Console.WriteLine();
Console.WriteLine("找出大于4的所有数");
// 找出大于4的数
System.Collections.IEnumerableenumerable = list.Where(x => x > 4);
foreach (int item in enumerable)
{
Console.Write(item+"\0");
}
Console.WriteLine();
Console.ReadKey();
输出结果:
十二、C#中已定义好的委托(泛型委托Action<>)
1.带参无返回值委托
///<summary>
/// 输出问候语
///</summary>
///<param name="name"></param>
///<param name="show"></param>
staticvoid SayHi(string name, Action<string> show)
{
show.Invoke(name);
}
///<summary>
/// 输出中文问候语
///</summary>
/// <param name="name">名字</param>
staticvoid SayChina(string name)
{
Console.WriteLine("你好:" +name);
}
///<summary>
/// 输出英文问候语
///</summary>
/// <param name="name">名字</param>
staticvoid SayEnglish(string name)
{
Console.WriteLine("Hi," + name);
}
staticvoid Main(string[] args)
{
#region 委托demo
Action<string> showChina = newAction<string>(SayChina);
// 输出中文问候语
SayHi("张三", showChina);
Action<string> showEnglish = newAction<string>(SayEnglish);
// 输出中文问候语
SayHi("Tony", showEnglish);
Console.WriteLine("----------------------------------------");
Console.WriteLine("多播委托实现打招呼");
//多播委托输出
Action<string> sd = newAction<string>(SayChina);
sd += SayEnglish;
SayHi("Tom", sd);
Console.ReadKey();
#endregion
}
2.带参带返回值委托(Func<>)
///<summary>
/// 输出问候语
///</summary>
///<param name="name"></param>
///<param name="show"></param>
publicstring SayHi(string name, Func<string, string> show)
{
return show.Invoke(name);
}
///<summary>
/// 输出中文问候语
///</summary>
/// <param name="name">名字</param>
publicstring SayChina(string name)
{
return "你好:" + name;
}
///<summary>
/// 输出英文问候语
///</summary>
/// <param name="name">名字</param>
publicstring SayEnglish(string name)
{
return "Hi," + name;
}
staticvoid Main(string[] args)
{
#region 委托demo(Func实例)
FuncDemo fd = new FuncDemo();
Func<string, string> showChina = newFunc<string, string>(fd.SayChina);
// 输出中文问候语
Console.WriteLine(fd.SayHi("张三",showChina));
Func<string, string> showEnglish =new Func<string, string>(fd.SayEnglish);
// 输出中文问候语
Console.WriteLine(fd.SayHi("Tony", showEnglish));
Console.WriteLine("----------------------------------------");
Console.WriteLine("多播委托实现打招呼");
//多播委托输出
Func<string, string> sd = newFunc<string, string>(fd.SayChina);
sd += fd.SayEnglish;
foreach (Func<string, string> item insd.GetInvocationList())
{
Console.WriteLine(item.Invoke("Tom"));
}
Console.ReadKey();
#endregion
}
输出结果: