您的位置:首页 > 其它

Lambda表达式学习(2)

2015-08-20 23:17 417 查看
在. net3. 5里面 , 委托的定义和实现被大大的简化了!使用关键字Func或Action就可以定义一个委托 , 使用拉姆达表达式就可以实现一个具体的委托.

Func关键字是用来定义一个有返回值的委托 , 它一共有五个重载 , 我们介绍其中的三个

1 public delegate TResult Func<TResult>();

这表示一个没有参数 , 只有一个返回值的委托 , 返回值的类型就是TResult(泛型)

代码
1  public class test
2     {
3         /// <summary>
4         /// 定义一个委托
5         /// </summary>
6         public Func<string> _GetName;
7         /// <summary>
8         /// 一个普通的没有参数 , 有返回值的方法
9         /// </summary>
10         /// <returns></returns>
11         public string GetName()
12         {
13             return "张三";
14         }
15         public void Main()
16         {
17             //3. 5以前的委托的实现 , 直接赋值
18             _GetName  =  GetName;
19
20             //拉姆达表达式的实现方法
21             _GetName  =  (
22                 ()          //因为这个委托没参数 , 所以参数列表没有东西
23                      = >      //拉姆达表达式的符号
24                 {           //大括号的代码段表示具体的委托的实现
25                     return "还是张三";
26                 });
27             //拉姆达表达式的简写 , 如果委托的实现代码段中只有一句return 则可以省略代码段最外面的大括号 , 和return关键字
28             _GetName  =  ()  = > "总是张三";
29             //调用
30             string MyName  =  _GetName();
31         }
32     }


2 public delegate TResult Func<T , TResult>(T arg);

这表示有且仅有一个参数 , 并且有返回值的委托.

代码
1  public class test
2     {
3         /// <summary>
4         /// 定义一个委托 , 有一个参数和一个返回值
5         /// </summary>
6         public Func<string ,  string> _GetName;
7         /// <summary>
8         /// 有一个参数的方法
9         /// </summary>
10         /// <param name = "strName">这是一个参数!</param>
11         /// <returns>这是一个返回值</returns>
12         public string GetName(string strName)
13         {
14             return strName;
15         }
16         public void Main()
17         {
18             //3. 5以前的委托的实现 , 直接赋值
19             _GetName  =  GetName;
20
21             //拉姆达表达式的实现方法
22             _GetName  =  (
23                 (S)          //有一个参数!所以参数列表里面有一个东西 , 这个东西随大家高兴叫个阿猫阿狗都行!只要符合规范
24                      = >      //拉姆达表达式的符号
25                 {           //大括号的代码段表示具体的委托的实现
26                     return "还是" + S;
27                 });
28             //拉姆达表达式的简写 , 如果委托的实现代码段中只有一句return 则可以省略代码段最外面的大括号 , 和return关键字
29             _GetName  =  (abc)  = > "总是" + abc;
30             //调用
31             string MyName  =  _GetName("张三");
32         }
33     }


3 public delegate TResult Func<T1 , T2 , TResult>(T1 arg1 , T2 arg2);

这表示有且仅有两个参数 , 并且有返回值的委托.

代码
1  public class test
2     {
3         /// <summary>
4         /// 定义一个委托 , 有一个参数和一个返回值
5         /// </summary>
6         public Func<string ,  int ,  string> _GetName;
7         /// <summary>
8         /// 这是一个有两个参数的方法 , 方法的参数类型的顺序必须和委托的参数类型顺序一致
9         /// </summary>
10         /// <param name = "strName">第一个是字符类型</param>
11         /// <param name = "intAGE">第二个是整形 , 请不要颠倒类型!</param>
12         /// <returns>返回一个字符串 , 对应委托的最后一个参数</returns>
13         public string GetName(string strName ,  int intAGE)
14         {
15             return string. Format("{0}的年龄是{1}岁" ,  strName ,  intAGE);
16         }
17         public void Main()
18         {
19             //3. 5以前的委托的实现 , 直接赋值
20             _GetName  =  GetName;
21
22             //拉姆达表达式的实现方法
23             _GetName  =  (
24                 (S ,  W)          //有一个参数!所以参数列表里面有一个东西 , 这个东西随大家高兴叫个阿猫阿狗都行!只要符合规范
25                      = >      //拉姆达表达式的符号
26                 {           //大括号的代码段表示具体的委托的实现
27                     return string. Format("{0}的年龄是{1}岁" ,  S ,  W);
28                 });
29             //拉姆达表达式的简写 , 如果委托的实现代码段中只有一句return 则可以省略代码段最外面的大括号 , 和return关键字
30             _GetName  =  (abc ,  efd)  = > string. Format("{0}的年龄是{1}岁" ,  abc ,  efd);
31             //调用
32             string MyName  =  _GetName("张三" ,  33);
33         }
34     }


Action关键字用来定义一个没有返回值的方法 , 它有一个非泛型方法 , 和四个泛型方法 , 一共五种. Action和func的区别就在于一个没有返回值 , 一个有返回值!其他的都一样!就好像VB的sub和function一样!

1 public delegate void Action();没有参数也没有返回值

代码
1 public class test
2     {
3         /// <summary>
4         /// 定义一个委托 , 没有返回值也没有参数
5         /// </summary>
6         public Action _GetName;
7
8         public void GetName()
9         {
10             System. Windows. Forms. MessageBox. Show("没有参数也没有返回值 , 我只要自己显示了!");
11         }
12         public void Main()
13         {
14             //3. 5以前的委托的实现 , 直接赋值
15             _GetName  =  GetName;
16
17             //拉姆达表达式的实现方法
18             _GetName  =  (
19                 ()
20                      = >      //拉姆达表达式的符号
21                 {           //大括号的代码段表示具体的委托的实现
22                     System. Windows. Forms. MessageBox. Show("没有参数也没有返回值 , 我只要自己显示了!");
23                 });
24             //因为action没有返回值 , 所以下面的简写方式是错误的
25             //_GetName  =  ()  = > System. Windows. Forms. MessageBox. Show("没有参数也没有返回值 , 我只要自己显示了!");
26             //调用
27             _GetName();
28         }
29     }


2 public delegate void Action<T>(T obj);

代码
1 public class test
2     {
3         /// <summary>
4         /// 定义一个委托 , 没有返回值也没有参数
5         /// </summary>
6         public Action<bool> _GetName;
7
8         public void GetName(bool blnShow)
9         {
10             if (blnShow)
11             {
12                 System. Windows. Forms. MessageBox. Show("要我显示就显示 , 多没面子");
13             }
14             else
15             {
16                 System. Windows. Forms. MessageBox. Show("不要我显示 , 我偏要显示");
17             }
18         }
19         public void Main()
20         {
21             //3. 5以前的委托的实现 , 直接赋值
22             _GetName  =  GetName;
23
24             //拉姆达表达式的实现方法
25             _GetName  =  (
26                 (b)
27                      = >      //拉姆达表达式的符号
28                 {           //大括号的代码段表示具体的委托的实现
29                     if (b)
30                     {
31                         System. Windows. Forms. MessageBox. Show("要我显示就显示 , 多没面子");
32                     }
33                     else
34                     {
35                         System. Windows. Forms. MessageBox. Show("不要我显示 , 我偏要显示");
36                     }
37                 });
38
39             _GetName(true);
40         }
41     }


有一个参数但没有返回值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: