C#語法糖之第五篇: 泛型委托- Action


  因為工作的原因(其實還是個人的惰性)昨天沒有給大家分享文章,然后這幾天也有很多園友也提出了他們報告的意見及指導,再次感謝這些兄弟們的照顧我 和支持,這個分類的文章我當時想的是把我的學習經驗和工作中用到的語法給大家分享給大家,希望能起到幫助的作用,但是本人也是個菜鳥,不是什么大神,所以 學習中也有不足的地方和沒有掃到的地方,這里對上次擴展方法語法糖的問題,擴展方法確實是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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM