本文轉自:https://www.cnblogs.com/dotnet261010/p/10108791.html
1、什么是Action泛型委托
Action<T>是.NET Framework內置的泛型委托,可以使用Action<T>委托以引數形式傳遞方法,而不用顯示宣告自定義的委托,封裝的方法必須與此委托定義的方法簽名相對應,也就是說,封裝的方法必須具有一個通過值傳遞給它的引數,并且不能有回傳值,
2、Action委托定義
查看Action的定義:
using System.Runtime.CompilerServices;
namespace System
{
//
// 摘要:
// 封裝一個方法,該方法不具有引數且不回傳值,
[TypeForwardedFrom("System.Core, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")]
public delegate void Action();
}
你會發現,Action其實就是沒有回傳值的delegate,
3、示例
Action委托至少0個引數,至多16個引數,無回傳值,
Action 表示無參,無回傳值的委托,
Action<int,string> 表示有傳入引數int,string無回傳值的委托,
Action<int,string,bool> 表示有傳入引數int,string,bool無回傳值的委托,
Action<int,int,int,int> 表示有傳入4個int型引數,無回傳值的委托,

代碼示例如下:
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)
{
// 無引數無回傳值的委托
Action action1 = new Action(ActionWithNoParaNoReturn);
action1();
Console.WriteLine("----------------------------");
// 使用delegate
Action action2 = delegate { Console.WriteLine("這里是使用delegate"); };
// 執行
action2();
Console.WriteLine("----------------------------");
// 使用匿名委托
Action action3 = () => { Console.WriteLine("這里是匿名委托"); };
action3();
Console.WriteLine("----------------------------");
// 有引數無回傳值的委托
Action<int> action4 = new Action<int>(ActionWithPara);
action4(23);
Console.WriteLine("----------------------------");
// 使用delegate
Action<int> action5 = delegate (int i) { Console.WriteLine($"這里是使用delegate的委托,引數值是:{i}"); };
action5(45);
Console.WriteLine("----------------------------");
// 使用匿名委托
Action<string> action6 = (string s) => { Console.WriteLine($"這里是使用匿名委托,引數值是:{s}"); };
action6("345");
Console.WriteLine("----------------------------");
// 多個引數無回傳值的委托
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($"這里是三個引數的Action委托,引數1的值是:{i1},引數2的值是:{i2},引數3的值是:{s}");
};
action8(12, 34, "abc");
Console.WriteLine("----------------------------");
Action<int,int,string, string> action9 = (int i1,int i2, string s1,string s2) =>
{
Console.WriteLine($"這里是使用四個引數的委托,引數1的值是:{i1},引數2的值是:{i2},引數3的值是:{s1},引數4的值是:{s2}");
};
// 執行委托
action9(34,56, "abc","def");
Console.ReadKey();
}
static void ActionWithNoParaNoReturn()
{
Console.WriteLine("這是無引數無回傳值的Action委托");
}
static void ActionWithPara(int i)
{
Console.WriteLine($"這里是有引數無回傳值的委托,引數值是:{i}");
}
static void ActionWithMulitPara(int i,string s)
{
Console.WriteLine($"這里是有兩個引數無回傳值的委托,引數1的值是:{i},引數2的值是:{s}");
}
}
}
運行結果:

4、真實示例
先看下面一張截圖:

從截圖中可以看出:ForEach()方法的引數是一個引數型別是T的無回傳值的Action委托,下面的示例中利用Action委托作為引數傳遞給ForEach()方法,
1、定義Student物體類
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()方法輸出集合內容
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>委托作為引數傳遞給ForEach()方法
list.ForEach(student =>
{
Console.WriteLine($"姓名:{student.Name},年齡:{student.Age}");
});
}
}
}
3、在Main()方法中呼叫
ActionTest.Test();
4、結果

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/68915.html
標籤:C#
下一篇:LINQ入門
