我一直在浏览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”似乎符合此定义。

10-08 20:00