之前一直用的是delegate,最近看同事的代码,发现都是用的Action,所以学习了下Action。
Action 与delegate的区别:
delegate需要根据签名的不同,需要定义多次委托类型 而 Action本身已经定义好了委托类型。
delegate 可以是不提供返回类型,也可以提供返回类型 而Action 是不提供返回类型。
1. .xaml文件
<Window x:Class="ActionDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ActionDemo"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Button x:Name="ActionBtn" Content="ActionDemo" HorizontalAlignment="Left" Height="81" Margin="203,175,0,0" VerticalAlignment="Top" Width="151" Click="ActionBtn_Click"/>
</Grid>
</Window>
2. .cs 文件
namespace ActionDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public Action action_1; //不带参数的Action
public Action<int> action_2;// 带一个参数的Action
public Action<int, int> action_3; // 带两个参数的Action
public Action<List<int>> action_4; // 带一个列表的Action
public MainWindow()
{
InitializeComponent();
action_1 = Action1_func;
action_2 = Action2_func;
action_3 = Action3_func;
action_4 = Action4_func;
}
private void Action1_func()
{
Console.WriteLine("Action1_func");
}
private void Action2_func(int x)
{
Console.WriteLine("Action2_func : x = {0}",x);
}
private void Action3_func(int x,int y)
{
Console.WriteLine("Action3_func : {0}+{1}={2}", x,y,x+y);
}
private void Action4_func(List<int> list)
{
for(int i = 0;i<list.Count;i++)
{
Console.WriteLine("Action4_func : {0}:{1}", i+1,list[i]);
}
}
private void ActionBtn_Click(object sender, RoutedEventArgs e)
{
try
{
if(action_1!=null)
{
action_1();
}
if (action_2 != null)
{
action_2(3);
}
if (action_3 != null)
{
action_3(4,5);
}
if (action_4 != null)
{
List<int> m_list = new List<int>();
m_list.Add(1);
m_list.Add(2);
m_list.Add(3);
action_4(m_list);
}
}
catch(Exception error)
{
Console.WriteLine(error.Message);
}
}
}
}
3. 运行结果