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

Joh*_*soe 20 c# lambda naming-conventions

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

public static class Cache
{
    public TResult Get<TResult>(string cacheKey, Func<TResult> cacheLoader) 
    {
        // Implementation
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我应该像对象一样命名,例如cacheLoader
  • 我应该把它命名为一种方法,例如loadResult
  • 我应该明确地将其称为功能,例如cacheLoadFunction?(我不喜欢这个.)

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

Joe*_*Joe 23

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

Enumerable.Average<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector)

Enumerable.Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)

Enumerable.GroupBy<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)

ConcurrentDictionary<TKey,TValue>.GetOrAdd(TKey key, 
            Func<TKey, TValue> valueFactory);
Run Code Online (Sandbox Code Playgroud)

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

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


Ric*_*key 7

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

loadResult(result);
Run Code Online (Sandbox Code Playgroud)

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

您可以添加类似Method或者后缀的后缀Delegate,Lambda但通常只是在不增加清晰度的情况下使其变得冗长.它可能取决于情况和您的编码标准,当然还有您的偏好.


Ree*_*sey 6

我通常在命名中使用“委托”一词,以表明该参数正在接收委托。例如,我可能会将上面的名称命名为:

public static class Cache
{
    public TResult Get<TResult>(string cacheKey, Func<TResult> cacheLoadingDelegate) 
    {
        // Implementation
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • [此处](http://stackoverflow.com/a/25993838/661933) 的答案表示 MS 反对该约定。 (2认同)