Func 方法参数的首选命名约定是什么?

我承认这个问题是主观的,但我对社区的看法很感兴趣。 我有一个缓存类,它接受类型为Func的缓存加载器函数,它用于从数据库中检索值并将其存储在缓存中。

 public static class Cache { public TResult Get(string cacheKey, Func cacheLoader) { // Implementation } } 

我的问题是: 我应该如何命名函数参数?

  • 我应该将它命名为对象,例如cacheLoader吗?
  • 我应该将其命名为方法,例如loadResult
  • 我应该将它明确地称为函数,例如cacheLoadFunction吗? (我不喜欢这个。)

我对我应该命名这个特定的函数参数不感兴趣,并且对如何命名函数参数更感兴趣。 什么说你,Stack Overflow社区?

在框架中使用名词有先例,例如

 Enumerable.Average(this IEnumerable source, Func selector) Enumerable.Count(this IEnumerable source, Func predicate) Enumerable.GroupBy(this IEnumerable source, Func keySelector, Func elementSelector) ConcurrentDictionary.GetOrAdd(TKey key, Func valueFactory); 

名词通常是带有后缀的合适动词。

在你的例子中,我会使用像loader或者valueFactory这样的东西。 我个人不喜欢cacheLoader因为可能是调用者而不是代理人在缓存中插入工作。

我喜欢将其命名为方法,以便在调用它时,如下所示:

 loadResult(result); 

它看起来像普通的方法调用,但是shell表明它是一个变量,因此传递了两条信息。

您可以附加一个后缀,如MethodDelegateLambda但这些后缀通常只是在不增加清晰度的情况下使其变得冗长。 它可能取决于情况和您的编码标准,当然还有您的偏好。

我通常在命名中使用工作委托 ,以明确该参数正在接收委托。 例如,我可能会将上述名称命名为:

 public static class Cache { public TResult Get(string cacheKey, Func cacheLoadingDelegate) { // Implementation } } 

我这样做是为了避免与问题中建议的命名混淆。 cacheLoader听起来太像一个对象,而loadResult就像一个对象/类型(结果本身)。 我个人也不喜欢使用functionmethod ,因为委托实际上不是一个函数,而是一个委托 – 一个引用函数的类型。