委托:委托别人去帮我完成某件事情。
自定义委托
AddDelegate AD = new AddDelegate(Add); //获取需要委托的方法详细,参数返回值和定义委托参数返回值都必须一样。 string str = AD.Invoke(5, 2); //执行委托:Invoke或者不写,可以直接使用 AD(5,2) Console.WriteLine(str); //Add方法委托AddDelegate对象帮忙执行,实际上运行的是Add方法内容。 string Add(int a,int b) { return $"两个参数有返回值的普通方法:{a + b}"; } delegate string AddDelegate(int a, int b);//定义委托delegate
泛型委托
AddDelegate<string> AD = A.Add; //简写不需要new,给方法就可以 string str = AD("1", "3"); //调用委托简写,不需要Invoke方法。 Console.WriteLine(str); class A { public static string Add(string a, string b) { return $"两个参数有返回值的普通方法:{a + b}"; } public static string Add(int a, int b) { return a + b +""; } } delegate string AddDelegate<T>(T a, T b);//泛型委托,返回值不能定义泛型,只能定义参数
“协变:out”->”和谐的变”->”很自然的变化”->string->object 小到大
“逆变:in”->”逆常的变”->”不正常的变化”->object->string 大转小
直白的说:out: 输出(作为返回值结果),in:输入(作为参数)
delegate M AddDelegate<in T, in T1,out M>(T a, T1 b);//out协变,输出做返回值,in逆变,输入做参数,默认in可以不写
系统委托(系统定义好的两个):Action无返回值委托---Func有返回值委托。最后一个参数是返回值,两个委托最多参数只有16种重载
Action<int> a = A.Add;//Action无返回值委托,最多16个参数,无参不写<> a(22);//参数22 Func<int, int ,string> AD = A.Add;//Func有返回值委托,最多16个参数+最后一个是返回值 = 17个参数 string str = AD(1, 3); //返回值是最后一个参数string Console.WriteLine(str); class A { public static void Add(int a) { Console.WriteLine("Action有参无返回值委托"); } public static string Add(int a, int b) { return $"Func有参数有返回值委托的普通方法:{a + b}"; } }
匿名方法的委托
Action<string> AD = new Action<string>(delegate(string str) { Console.WriteLine(str); }); AD("这是一个匿名方法的委托");
Lambda表达式:本质也是一个匿名方法
Action<string> AD = new Action<string>(str => Console.WriteLine(str)); AD("一个参数单个语句的简写,lambda表达式");
Action AD = new Action(() => Console.WriteLine("无参无返回值委托")); AD();
Func<string> AD = () => "无参有返回值委托"; AD();
Func<int,int,string> AD = (int i ,int a) => { Console.WriteLine("如果是一个参数,可以不需要括号,不需要数据类型。"); return $"有参有返回值的委托:{i + a}"; }; Console.WriteLine(AD(5, 2));
标签:AD,委托,C#,int,Add,delegate,返回值,string,Lambda From: https://www.cnblogs.com/longxinyv/p/16826694.html