https://blog.csdn.net/wnvalentin/article/details/81840339
◆ 定义委托:
[访问修饰符] delegate 返回值类型 委托名 (形参列表);
◆ 委托实例化:
1、委托类名 委托实例名 = new 委托类名(target);
2、委托类名 委托实例名 = Target ;
Target 是传入的方法名称,是方法的引用,不能带()。
◆ 委托实例调用:
1、使用反射的Invoke()方法调用委托实例;
2、直接在委托实例后加上()进行调用;
◆ 泛型委托:
Func<T>委托 、Action<T>委托 和 Predicate<t>委托。
◆ Func<T>委托
Func<T>委托代表着拥有返回值的泛型委托。
Func<T>有一系列的重载,形式如 Func<T1,T2, ... TResult>,其中TResult代表委托的返回值类型
其余均是参数类型。只有一个T时,即Func<TResult>,代表该委托是无参数的。
.NET封装了最多16个输入参数的Funct<>委托。
◆ Action<T>委托代表返回值为空 void 的委托,它也有一些列重载,最多拥有16个输入参数。用法与Func<T>相同。
◆ 匿名委托:
委托类名 委托实例名 = delegate(args){方法体代码};
◆ 表达式Lambda
委托类名 委托实例名 = (参数1,参数2...) => {方法体代码};
当匿名还是只有一行代码是,可采用这种形式。
CompareDelegate LambdaCompare = (s4,s5)=> s4.Age <= s5.Age;
其中 => 符号的左侧是参数,右侧是要返回或者执行的语句。参数需放在括号内,只有一个参数可省
略括号。
多行代码时:
CompareDelegate LambdaCompare = (s4,s5) =>
{
return s4.Age <= s5.Age; //不可省略return;
};
Func<int> fun1 = new Func<int>(FunWithNoPara); int result1= fun1(); Func<int> fun2 = delegate { return 19; }; int result2 = fun2(); Func<int> fun3 = () => { return 3; }; int result3 = fun3(); Func<int> fun3 = () => { return 3; }; int result3 = fun3(); // 使用委托 Func<int, string> fun5 = delegate (int i) { return i.ToString(); }; string result5 = fun5(5); // 使用匿名委托 Func<int, string> fun6 = (int i) => { return i.ToString(); }; string result6 = fun6(6); // 多个输入参数 Func<int, string, bool> fun7 = new Func<int, string, bool>(FunWithMultiPara); bool result7 = fun7(2, "2"); // 使用委托 Func<int, string, bool> fun8 = delegate (int i, string s) { return i.ToString().Equals(s) ? true : false; }; bool result8 = fun8(2, "abc"); // 使用匿名委托 Func<int, string, bool> fun9 = (int i, string s) => { return i.ToString().Equals(s) ? true : false; }; bool result9 = fun9(45, "ert");
事件使用
using System; namespace Test { static class Program { static void Main() { 刘备 lb = new 刘备(); 关羽 gy = new 关羽(lb); //可以理解为, 刘备与关羽约定好摔杯杀出, 然后关羽自己注册事件 张飞 zf = new 张飞(lb); //同上 //刘备摔杯 lb.摔杯方法(); } } public class 刘备 { public delegate bool 摔杯委托(string str); public event 摔杯委托 摔杯事件; public void 摔杯方法() { if (摔杯事件 != null) 摔杯事件("猛猛的摔杯 (只是示例个参数)"); } } public class 关羽 { public 关羽(刘备 lb) { lb.摔杯事件 += 杀出; } public bool 杀出(string str) { Console.WriteLine("关羽带300刀斧手从北门杀出!"); return true; } } public class 张飞 { public 张飞(刘备 lb) { lb.摔杯事件 += 杀出; } public bool 杀出(string str) { Console.WriteLine("张飞带300刀斧手从南门杀出!"); return true; } } }