博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 委托和Lambda---基础
阅读量:5840 次
发布时间:2019-06-18

本文共 5060 字,大约阅读时间需要 16 分钟。

【委托】是一个类

可以把一个方法当作另一个方法的参数使用。

声明委托:delegate string 委托名(参数列表);//跟定义方法一样,只是没有方法体,必须使用关键字delegate
使用委托的函数 返回值和参数列表与委托相同【必须记住】
使用委托: 委托名 委托变量名=new 委托(函数名); 委托变量名(参数列表);

1         public ActionResult Index() 2         { 3             de1 de = new de1(EN); 4             string str = de("liuph", 1);//str="liuph is 1 years old" 5             de1 de1 = CN; 6             string str1 = de1("liuph", 1);//str="liuph的年龄是1岁" 7             return View(); 8         } 9         delegate string de1(string name, int age);//定义10         static string CN(string name, int age)11         {12             return name + "的年龄是" + age + "岁";13         }14         static string EN(string name, int age)15         {16             return name + " is " + age + " years old";17         }
View Code

=========

多播委托

包含多个方法的委托;按顺序调用,返回值必须void(否则返回最后调用方法的值);其中一个发生异常,不再继续向下执行;

1         public ActionResult Index() 2         { 3             de1 de = new de1(CN);//使用 4             de += EN;//连续调用第二个 5             string str = de("liuph", 1);//str="liuph is 1 years old " 6             return View(); 7         } 8         delegate string de1(string name, int age);//定义 9         static string CN(string name, int age)10         {11             return name + "的年龄是" + age + "岁";12         }13         static string EN(string name, int age)14         {15             return name + " is " + age + " years old";16         }
View Code
1         static string str = ""; 2         public ActionResult Index() 3         { 4             de1 de = CN; 5             de += EN; 6             de("liuph", 1); 7             //str="liuph的年龄是1岁liuph is 1 years old "; 8             return View(); 9         }10         delegate void de1(string name, int age);11         static void CN(string name, int age)12         {13             str += name + "的年龄是" + age + "岁";14         }15         static void EN(string name, int age)16         {17             str += name + " is " + age + " years old";18         }
View Code

发生异常也向下执行 使用GetInvocationList()方法

1         public ActionResult Index() 2         { 3             de1 de = new de1(CN);//使用 4             de += EN;//连续调用第二个 5             Delegate[] des = de.GetInvocationList(); 6             string str = ""; 7             foreach (de1 item in des)//循环 8             { 9                 try10                 {11                     str += item("liu", 1);12                 }13                 catch (Exception)14                 {15                     str += "有错误";16                 }17             }18             //EN注释throw     结果 str="liu的年龄是1岁liu is 1 years old " 19             //EN注释return    结果 str="liu的年龄是1岁有错误 "20             return View();21         }22         delegate string de1(string name, int age);23         static string CN(string name, int age)24         {25             return name + "的年龄是" + age + "岁";26         }27         static string EN(string name, int age)28         {29             throw new Exception("");30             return name + " is " + age + " years old";31         }
View Code

==========

匿名方法的委托

1 public ActionResult Index() 2         { 3             de1 de = delegate(string name, int age) 4             { 5                 return name + "的年龄是" + age + "岁"; 6             }; 7             string str = de("liuph", 1);//str="liuph的年龄是1岁"; 8             return View(); 9         }10         delegate string de1(string name, int age);
View Code

==========

泛型Action<T>委托表示引用一个void返回类型的方法

1         static string str = ""; 2         public ActionResult Index() 3         { 4             Action
action; 5 action = de; 6 de(1); 7 //str="liuph的年龄是1岁 "; 8 return View(); 9 }10 public static void de(int i)11 {12 str = string.Format("liuph的年龄是{0}岁", i);13 }
View Code

泛型Func<in T,out TResult>允许调用带返回类型的方法

1 public ActionResult Index() 2         { 3             Func
action; 4 action = de; 5 string str = de(1);//str="liuph的年龄是1岁 "; 6 return View(); 7 } 8 public static string de(int i) 9 {10 return string.Format("liuph的年龄是{0}岁", i);11 }
View Code

 

【Lambda】(个人理解就是匿名委托的简单化)

运算符=>,左边是参数,多个参数用圆括号;右边是实现代码

1         public ActionResult Index() 2         { 3             del myDelegate = x => x * x; 4             int j = myDelegate(5); //j = 25 5             Func
de = (x, y) => qq(x, y); 6 string str = de(12, "你输入的数字是:");//str="你输入的数字是:12" 7 8 Func
de1 = (x, y) => { return x + y; }; 9 string str1 = de1("haha", "哈哈");//str1="haha哈哈"10 return View();11 }12 delegate int del(int i);13 public static string qq(int i, string str)14 {15 return str + i;16 }
View Code

 

Lambda语句

就是把Lambda表达式写在花括号中

Lambda可以使用外部变量(慎用)

例如:
int y = 12;
del myDelegate = x => x * y;//想获取12*x必须保证使用委托时y值不会变
y = 13;
int j = myDelegate(5); //j = 65

转载于:https://www.cnblogs.com/liuph/p/4325041.html

你可能感兴趣的文章
screen命令使用简单说明
查看>>
文件缓存(配合JSON数组)
查看>>
20141202
查看>>
20151128
查看>>
HTTP基础知识(六)
查看>>
Navicat远程连接不上mysql解决方案
查看>>
vs2015 xamarin 添加智能感知
查看>>
5月11日团队博客
查看>>
几种加密方式
查看>>
sizeof/strlen小论
查看>>
SQL嵌套子查询和相关子查询的执行过程有什么区别(推荐)
查看>>
使用乐视tv观看群晖ds218play中的视频
查看>>
java下拉框,滚动条
查看>>
TypeError: can't convert console.log(...) to primitive type
查看>>
关于静态库
查看>>
序列化和反序列化
查看>>
用拦截器截获异常并打印日志
查看>>
matplotlib 入门之Pyplot tutorial
查看>>
Pycharm快捷键
查看>>
搭建spring3.2+junit4单元测试
查看>>