C#委托机制(2):Action
Action 是.NET类库从3.0开始新增的内置委托,⽤于实现对⽆返回函数的调⽤。以下⽰例定义了⼀个Action,在使⽤已经有函数Show赋值后,再进⾏调⽤。
public override void Test()
{
Action<string> fun = Show;
fun("hello");
}
public void Show(string s)
{
Console.WriteLine(s);
}
Action类
既然Action类是⽤于表⽰函数的,那么函数的参数列表和返回类型就很重要,关于这两点Action类规定如下:
1. 返回类型必需为void,即不返回任何值。这也是为什么这类函数被称之为Action(即运作)的原因了。
2. 参数列表类型不限制,长度最多为16。补充⼀句,这个数据是微软在调查了Windows底层代码得出的来的,即16个⾜够满⾜所有需
求(如果极端情况不够⽤,那么就是设计问题,因为部分参数⼀定可以合并为⼀个类,然后再进⾏调⽤)。以下是1-16个参数的Action定义。从定义来看,本质上也就是使⽤delegate关键字定义的普通委托。
public delegate void Action<T1>(T1 t1);
public delegate void Action<T1, T2>(T1 t1, T2 t2);
...
public delegate void Action<in T1,in T2,in T3,in T4,in T5,in T6,in T7,in T8,in T9,in T10,in T11,in T12,in T13,in T14,in T15,in T16>(T1 arg1, T2 arg2, T3 arg 3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16);
委托的初始化
委托的初始化有以下三种⽅式:
直接使⽤函数赋值
使⽤匿名函数定义
使⽤Lambda表达式
如下所⽰。
public override void Test()
{
// 1.通过函数赋值初始化
Action<string> act1 = Show;
// 2.通过匿名函数定义
Action<string> act2 =delegate(string s)
{
Console.WriteLine(s);
}
writeline函数
// 3.通过lambda
Action<string> act3 = s => Console.WriteLine(s);
}
public void Show(string s)
{
Console.WriteLine(s);
}
在直接使⽤函数名称赋值时,可以⾮常⽅便地直接将已经定义好的函数名称赋值给Action变量即可。对于⼀些基本不需要复⽤的操作,可以直接使⽤匿名函数来定义。
委托的调⽤
在完成了以上的定义以后,我们可以使⽤以下代码进⾏函数调⽤。
// 调⽤代码
act1("hello");
act2("hello");
我们可以看到,调⽤⽅式就是直接使⽤定义好的Action对象以函数名的⽅式进⾏参数调⽤。这个过程,就象是仅仅换了⼀个名称⼀样。本质上来说,这是两个不同的引⽤,指向相同的对象,可以理解为C++中的指针(事实上也确实如此)。
⼩结
本⽂介绍了Action类,⽤于对⽆参数的函数进⾏委托调⽤。它最多⽀持16个参数,可以满⾜所有的需求。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。