C#內(nèi)置泛型委托之Action委托
1、什么是Action泛型委托
Action<T>是.NET Framework內(nèi)置的泛型委托,可以使用Action<T>委托以參數(shù)形式傳遞方法,而不用顯示聲明自定義的委托。封裝的方法必須與此委托定義的方法簽名相對(duì)應(yīng)。也就是說(shuō),封裝的方法必須具有一個(gè)通過(guò)值傳遞給它的參數(shù),并且不能有返回值。
2、Action委托定義
查看Action的定義:
using System.Runtime.CompilerServices; namespace System { // // 摘要: // 封裝一個(gè)方法,該方法不具有參數(shù)且不返回值。 [TypeForwardedFrom("System.Core, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")] public delegate void Action(); }
你會(huì)發(fā)現(xiàn),Action其實(shí)就是沒(méi)有返回值的delegate。
3、示例
Action委托至少0個(gè)參數(shù),至多16個(gè)參數(shù),無(wú)返回值。
Action 表示無(wú)參,無(wú)返回值的委托。
Action<int,string> 表示有傳入?yún)?shù)int,string無(wú)返回值的委托。
Action<int,string,bool> 表示有傳入?yún)?shù)int,string,bool無(wú)返回值的委托。
Action<int,int,int,int> 表示有傳入4個(gè)int型參數(shù),無(wú)返回值的委托。
代碼示例如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ActionDemo { class Program { static void Main(string[] args) { // 無(wú)參數(shù)無(wú)返回值的委托 Action action1 = new Action(ActionWithNoParaNoReturn); action1(); Console.WriteLine("----------------------------"); // 使用delegate Action action2 = delegate { Console.WriteLine("這里是使用delegate"); }; // 執(zhí)行 action2(); Console.WriteLine("----------------------------"); // 使用匿名委托 Action action3 = () => { Console.WriteLine("這里是匿名委托"); }; action3(); Console.WriteLine("----------------------------"); // 有參數(shù)無(wú)返回值的委托 Action<int> action4 = new Action<int>(ActionWithPara); action4(23); Console.WriteLine("----------------------------"); // 使用delegate Action<int> action5 = delegate (int i) { Console.WriteLine($"這里是使用delegate的委托,參數(shù)值是:{i}"); }; action5(45); Console.WriteLine("----------------------------"); // 使用匿名委托 Action<string> action6 = (string s) => { Console.WriteLine($"這里是使用匿名委托,參數(shù)值是:{s}"); }; action6("345"); Console.WriteLine("----------------------------"); // 多個(gè)參數(shù)無(wú)返回值的委托 Action<int, string> action7 = new Action<int, string>(ActionWithMulitPara); action7(7, "abc"); Console.WriteLine("----------------------------"); // 使用delegate Action<int, int, string> action8 = delegate (int i1, int i2, string s) { Console.WriteLine($"這里是三個(gè)參數(shù)的Action委托,參數(shù)1的值是:{i1},參數(shù)2的值是:{i2},參數(shù)3的值是:{s}"); }; action8(12, 34, "abc"); Console.WriteLine("----------------------------"); Action<int,int,string, string> action9 = (int i1,int i2, string s1,string s2) => { Console.WriteLine($"這里是使用四個(gè)參數(shù)的委托,參數(shù)1的值是:{i1},參數(shù)2的值是:{i2},參數(shù)3的值是:{s1},參數(shù)4的值是:{s2}"); }; // 執(zhí)行委托 action9(34,56, "abc","def"); Console.ReadKey(); } static void ActionWithNoParaNoReturn() { Console.WriteLine("這是無(wú)參數(shù)無(wú)返回值的Action委托"); } static void ActionWithPara(int i) { Console.WriteLine($"這里是有參數(shù)無(wú)返回值的委托,參數(shù)值是:{i}"); } static void ActionWithMulitPara(int i,string s) { Console.WriteLine($"這里是有兩個(gè)參數(shù)無(wú)返回值的委托,參數(shù)1的值是:{i},參數(shù)2的值是:{s}"); } } }
運(yùn)行結(jié)果:
4、真實(shí)示例
先看下面一張截圖:
從截圖中可以看出:ForEach()方法的參數(shù)是一個(gè)參數(shù)類型是T的無(wú)返回值的Action委托,下面的示例中利用Action委托作為參數(shù)傳遞給ForEach()方法。
1、定義Student實(shí)體類
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ActionDemo { public class Student { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public int Sex { get; set; } } }
2、利用ForEach()方法輸出集合內(nèi)容
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ActionDemo { public class ActionTest { public static void Test() { List<Student> list = new List<Student>() { new Student(){Id=1,Name="張三",Age=19,Sex=1}, new Student(){Id=2,Name="李四",Age=20,Sex=2}, new Student(){Id=3,Name="王五",Age=23,Sex=1}, new Student(){Id=4,Name="趙六",Age=18,Sex=1} }; // Action<Student>委托作為參數(shù)傳遞給ForEach()方法 list.ForEach(student => { Console.WriteLine($"姓名:{student.Name},年齡:{student.Age}"); }); } } }
3、在Main()方法中調(diào)用
ActionTest.Test();
4、結(jié)果
到此這篇關(guān)于C#內(nèi)置泛型委托之Action委托的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#訪問(wèn)SQLServer增刪改查代碼實(shí)例
這篇文章主要為大家詳細(xì)介紹了C#訪問(wèn)SQLServer增刪改查代碼實(shí)例,感興趣的小伙伴們可以參考一下2016-08-08C# 使用匿名函數(shù)解決EventHandler參數(shù)傳遞的難題
C#動(dòng)態(tài)生成PictureBox并綁定右鍵菜單,實(shí)現(xiàn)刪除圖片2009-05-05unity通過(guò)Mesh網(wǎng)格繪制圖形球體
這篇文章主要為大家詳細(xì)介紹了unity通過(guò)Mesh網(wǎng)格繪制圖形球體,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11c# Winform 程序自動(dòng)更新實(shí)現(xiàn)方法
Winform程序自動(dòng)更新我也是第一次做,網(wǎng)上找了自動(dòng)更新的源碼,后來(lái)又根據(jù)在網(wǎng)上看到的一些方法,自己試了很久,最終還是有寫(xiě)錯(cuò)誤,所以花了錢(qián)讓別人幫忙調(diào)試成功的,下面是我自己搗騰出來(lái)的,方便大家借鑒,如果有什么錯(cuò)誤的地方歡迎指正2017-02-02