我一直在浏览ASP.NET MVC源代码,并且我注意到在很多地方都有类型Func<T>
的函数参数,它们以后缀thunk命名。我一直在想为什么会这样?
据我所记得,在早期,我确实遇到过thunk一词,并将其理解为“从一个CPU架构到另一个CPU架构的端口”。因此,如果您有一个16位DLL,并且想在32位环境中使用它,则必须创建一个thunk来封送两个平台之间所有这些整数和双精度数。
但是用这些名字命名这些Funcs
的动机是什么?例如这是一种这样的方法。System.Web.Mvc.FormCollection
类的ctor。
internal FormCollection(ControllerBase controller,
Func<NameValueCollection> validatedValuesThunk,
Func<NameValueCollection> unvalidatedValuesThunk)
{
base.Add(((controller == null)
||
controller.ValidateRequest)
?
validatedValuesThunk()
:
unvalidatedValuesThunk());
}
这是另一个例子。这是
ControllerActionInvoker
类中的私有字段。private Func<ControllerContext, ActionDescriptor,
IEnumerable<Filter>> _getFiltersThunk;
MVC代码中有大量此类方法。
最佳答案
从wikipedia:
在计算机编程中,thunk是创建的子例程,
通常会自动执行,以协助调用另一个子例程。暴徒
主要用于表示附加计算,
子例程需要执行,或调用不执行的例程
支持通常的调用机制。
在FormCollection
方法中使用“ thunk”似乎符合此定义。