一、什么是委托
委托是一个类,它定义了方法的类型,使得可以将方法当作另外一个方法的参数来进行传递;调用委托的时候,委托包含的所有方法将被执行。
二、委托的定义
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.委托实现不通的国家输出不同的问候语
///
/// 定义无返回值带字符串参数的委托
///
///
delegate void ShowHiDelegate(stringname);
///
/// 输出问候语
///
///
///
static void SayHi(string name,ShowHiDelegate show)
{
show.Invoke(name);
}
///
/// 输出中文问候语
///
/// 名字
static void SayChina(string name)
{
Console.WriteLine("你好:" + name);
}
///
/// 输出英文问候语
///
/// 名字
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
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.带参无返回值委托
///
/// 输出问候语
///
///
///
staticvoid SayHi(string name, Action
{
show.Invoke(name);
}
///
/// 输出中文问候语
///
/// 名字
staticvoid SayChina(string name)
{
Console.WriteLine("你好:" +name);
}
///
/// 输出英文问候语
///
/// 名字
staticvoid SayEnglish(string name)
{
Console.WriteLine("Hi," + name);
}
staticvoid Main(string[] args)
{
#region 委托demo
Action
// 输出中文问候语
SayHi("张三", showChina);
Action
// 输出中文问候语
SayHi("Tony", showEnglish);
Console.WriteLine("----------------------------------------");
Console.WriteLine("多播委托实现打招呼");
//多播委托输出
Action
sd += SayEnglish;
SayHi("Tom", sd);
Console.ReadKey();
#endregion
}
2.带参带返回值委托(Func<>)
///
/// 输出问候语
///
///
///
publicstring SayHi(string name, Func
{
return show.Invoke(name);
}
///
/// 输出中文问候语
///
/// 名字
publicstring SayChina(string name)
{
return "你好:" + name;
}
///
/// 输出英文问候语
///
/// 名字
publicstring SayEnglish(string name)
{
return "Hi," + name;
}
staticvoid Main(string[] args)
{
#region 委托demo(Func实例)
FuncDemo fd = new FuncDemo();
Func
// 输出中文问候语
Console.WriteLine(fd.SayHi("张三",showChina));
Func
// 输出中文问候语
Console.WriteLine(fd.SayHi("Tony", showEnglish));
Console.WriteLine("----------------------------------------");
Console.WriteLine("多播委托实现打招呼");
//多播委托输出
Func
sd += fd.SayEnglish;
foreach (Func
{
Console.WriteLine(item.Invoke("Tom"));
}
Console.ReadKey();
#endregion
}
输出结果: