C#语法糖之第五篇: 泛型委托- Action<T>

  因为工作的原因(其实还是个人的惰性)昨天没有给大家分享文章,然后这几天也有很多园友也提出了他们报告的意见及指导,再次感谢这些兄弟们的照顾我 和支持,这个分类的文章我当时想的是把我的学习经验和工作中用到的语法给大家分享给大家,希望能起到帮助的作用,但是本人也是个菜鸟,不是什么大神,所以 学习中也有不足的地方和没有扫到的地方,这里对上次扩展方法语法糖的问题,扩展方法确实是3.0开始就有了,或许是我以前没有用到,也没有查询欠缺,若要给大家带来不便,请大家原谅,现在把标题也修改为C#语法糖了,这里给大家道歉,希望朋友们也一如既往的支持!下面就进入正题吧。

  Action<T>泛型委托:委托以参数形式传递方法,而不用显式声明自定义的委托。 封装的方法必须与此委托定义的方法签名相对应。 也就是说,封装的方法必须具有一个通过值传递给它的参数,并且不能返回值。

通常,这种方法用于执行某个操作。

我们先撇开这个概念,先看一下例子,我们自己写一下一个委托:

 1 public static class 泛型委托
 2 
 3     {
 4 
 5         public static void 打印学生信息(Student stu)
 6 
 7         {
 8 
 9             Console.WriteLine("学号:"+stu.StuNum+"姓名:"+stu.StuName+"年龄:"+stu.Age);
10 
11         }
12 
13         public static void 打印教师信息(Teacher teach)
14 
15         {
16 
17             Console.WriteLine("工号:" + teach.TeachNum + "姓名:" + teach.TeachName + "年龄:" + teach.Age);
18 
19         }
20 
21         public delegate void PrintMsg<T>(T t);
22 
23         public static void Teach<T>(this List<T> tList, PrintMsg<T> pt)
24 
25         {
26 
27             foreach (T t in tList)
28 
29             {
30 
31                 pt(t);
32 
33             }
34 
35         }
36 
37     }
38 
39     public class Student
40 
41     {
42 
43         public string StuNum { get; set; }
44 
45         public string StuName { get; set; }
46 
47         public int Age { get; set; }
48 
49     }
50 
51     public class Teacher
52 
53     {
54 
55         public string TeachNum { get; set; }
56 
57         public string TeachName { get; set; }
58 
59         public int Age { get; set; }
60 
61     }
View Code

以上为通过自己写的泛型委托的实现,在看看调用代码:

 1 List<Student> students=new List<Student>();
 2 
 3             students.Add(new Student{ StuNum = "001",StuName = "zhangsan",Age = 20});
 4 
 5             students.Add(new Student { StuNum = "002", StuName = "lisi", Age = 21 });
 6 
 7             students.Add(new Student { StuNum = "003", StuName = "wangwu", Age = 22 });
 8 
 9             List<Teacher> teacher=new List<Teacher>();
10 
11             teacher.Add(new Teacher{TeachNum = "004",TeachName = "teacher1",Age = 50});
12 
13             teacher.Add(new Teacher { TeachNum = "005", TeachName = "teacher2", Age = 51 });
14 
15             teacher.Add(new Teacher { TeachNum = "006", TeachName = "teacher3", Age = 52 });
16 
17             students.Teach(泛型委托.打印学生信息);
18 
19             teacher.Teach(泛型委托.打印教师信息);
20 
21             Console.ReadLine();
View Code

输出代码如下:

 

以上例子是自己写的list〈T〉的内容循环并输出代码,代码随少但表表现出来泛型委托。大家理解了上面的例子后其实就对Action〈T〉内置委托的实现方式有了基本的了解了。

我们把上面的代码改造为内置委托方式实现,这里我们用List<T>的ForEach()来举例子:

1 public void ForEach(Action<T> action);
View Code

这是微软定义的方法,其实这个跟上面的Teach<T>类似

 1 List<Student> students=new List<Student>();
 2 
 3             students.Add(new Student{ StuNum = "001",StuName = "zhangsan",Age = 20});
 4 
 5             students.Add(new Student { StuNum = "002", StuName = "lisi", Age = 21 });
 6 
 7             students.Add(new Student { StuNum = "003", StuName = "wangwu", Age = 22 });
 8 
 9             List<Teacher> teacher=new List<Teacher>();
10 
11             teacher.Add(new Teacher{TeachNum = "004",TeachName = "teacher1",Age = 50});
12 
13             teacher.Add(new Teacher { TeachNum = "005", TeachName = "teacher2", Age = 51 });
14 
15             teacher.Add(new Teacher { TeachNum = "006", TeachName = "teacher3", Age = 52 });
16 
17             students.Teach(泛型委托.打印学生信息);
18 
19             teacher.Teach(泛型委托.打印教师信息);
20 
21             Console.WriteLine("-------------------------------以下是系统内置委托打印");
22 
23             students.ForEach(泛型委托.打印学生信息);
24 
25             teacher.ForEach(泛型委托.打印教师信息);
26 
27             Console.ReadLine();
View Code

以上代码可以看出来整个调用方式都差不多,只是把Teach方式换成内部方法ForEach而已。

在上面方法中打印学生信息和打印教师信息只是就在这一个地方使用,所以我们结合上上篇文章中写的匿名方法来些这两个打印的方法。所以调用方法代码如下:

 1 teacher.ForEach(new Action<Teacher>(delegate(Teacher t)
 2 
 3                 {
 4 
 5                     Console.WriteLine("工号:" + t.TeachNum + "姓名:" + t.TeachName + "年龄:" + t.Age);
 6 
 7                 }));
 8 
 9             students.ForEach(new Action<Student>(delegate(Student s)
10 
11             {
12 
13                 Console.WriteLine("工号:" + s.StuNum + "姓名:" + s.StuName + "年龄:" + s.Age);
14 
15             }));
View Code

输出代码如下:

把上面代码简化写的话:

 1 teacher.ForEach(delegate(Teacher t)
 2 
 3             {
 4 
 5                 Console.WriteLine("工号:" + t.TeachNum + "姓名:" + t.TeachName + "年龄:" + t.Age);
 6 
 7             });
 8 
 9             students.ForEach(delegate(Student s)
10 
11             {
12 
13                 Console.WriteLine("工号:" + s.StuNum + "姓名:" + s.StuName + "年龄:" + s.Age);
14 
15             });
View Code

 输出代码如下:

在结合上篇讲的把匿名方法转换成Lambda表达式就变成如下代码:

 1 teacher.ForEach(t =>
 2 
 3             {
 4 
 5                 Console.WriteLine("工号:" + t.TeachNum + "姓名:" + t.TeachName + "年龄:" + t.Age);
 6 
 7             });
 8 
 9             students.ForEach(s =>
10 
11             {
12 
13                 Console.WriteLine("工号:" + s.StuNum + "姓名:" + s.StuName + "年龄:" + s.Age);
14 
15             });
View Code

输出代码如下:

 

  以上就是C#语法糖泛型委托Action<T>的一个分享,希望给大家学习上带来帮助。

本文原文网址 http://www.yaosutu.cn/archives/564

posted @ 2014-07-22 22:46  爱拼才会赢-Martin  阅读(2911)  评论(3编辑  收藏  举报