【C#】委托中方法的简写演进
一、前提知识
委托、事件、匿名函数、Lambda、系统自带委托Func和Action
1、委托:
可以理解为方法的一个引用(代理),调用委托就相当于调用了方法;它实现了方法的解耦;一个委托实例可以绑定多个方法,通过+=来操作
//定义委托 delegate 返回类型 委托名字Delegate(参数列表); //如果委托是为了配合定义事件,命名如下 delegate 返回类型 事件名EventHandler(参数列表);
2、事件:
就是一个安全的委托,它的定义就是在委托的前面加event;为啥说事件是安全的委托,因为基本上事件的定义和调用都放在同一个类中
event 事件对应的委托 事件名
3、匿名函数:
没有名字的函数,主要配合委托和事件进行使用
//定义
delegate(参数列表){ //逻辑代码 }
4、Lambda表达式
它也是匿名函数,Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。
//无参一行逻辑的Lambda表达式 ()=>Console.WriteLine("This is a Lambda expression."); //无参一行逻辑的Lambda表达式 (a,b)=>{ Console.WriteLine(a); Console.WriteLine(b); };
5、Action
action是系统自带的没有返回值的泛型委托,它的方法参数默认最大16个
6、Func
func是系统定义的带返回值的泛型委托,它的方法参数默认最大也是支持16个,最有一个参数默认是返回参数
二、委托的写法演进
1、码代码
创建一个新类,名字随便取,测试代码如下
//定义委托 delegate void StudentDelegate(string name, int age); public class LambdaTest { public void Show() { //历史 //版本1 { StudentDelegate studentDelegate = new StudentDelegate(StudentDelegateHandler); studentDelegate.Invoke("bill",20); } //版本2 (这样写的好处,可以访问当前方法里面的局部变量) { string dt = DateTime.Now.ToString(); StudentDelegate studentDelegate = new StudentDelegate( delegate (string name, int age) { Console.WriteLine($"当前时间是:{dt}"); Console.WriteLine($"我的名字是:{name},我的年龄是:{age}"); } ); studentDelegate.Invoke("bill", 20); } //版本3 (=> 念成goes to) { string dt = DateTime.Now.ToString(); StudentDelegate studentDelegate = new StudentDelegate( (string name, int age)=> { Console.WriteLine($"当前时间是:{dt}"); Console.WriteLine($"我的名字是:{name},我的年龄是:{age}"); } ); studentDelegate.Invoke("bill", 20); } //版本4 { Action action = () => Console.WriteLine("Action无返回值,无参数的Lambda表达式方法"); Action<DateTime> action1 = d => { Console.WriteLine(d+ "Action带一个参数"); }; //带返回值的示例 Func<DateTime> func = () => { return DateTime.Now; }; //这个写法和下面的写法 是等价的 Func<DateTime> func1 =() => DateTime.Now; //带输入参数,带返回值的示例 Func<String, DateTime> func2 = (a) => { Console.WriteLine(a + "Func带一个参数,带返回值的"); return DateTime.Now; }; action(); action1(DateTime.Now); DateTime result = func1(); Console.WriteLine("Func只带返回值的写法,返回值是" + result); DateTime result2 = func2("输入参数a"); } } public void StudentDelegateHandler(string name, int age) { Console.WriteLine($"我的名字是:{name},我的年龄是:{age}"); } }
2、测试和调用
static void Main(string[] args) { LambdaTest lambdaTest = new LambdaTest(); lambdaTest.Show(); Console.ReadKey(); }