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

时间:2011-05-19 16:04:17

标签: c# lambda naming-conventions

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

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

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

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

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

3 个答案:

答案 0 :(得分:22)

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

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);

名词通常是an agentive suffix的适当动词。

在您的示例中,我会使用loadervalueFactory之类的内容。我个人不喜欢cacheLoader,因为可能是调用者而不是代理人在缓存中插入工作。

答案 1 :(得分:6)

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

loadResult(result);

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

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

答案 2 :(得分:2)

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

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

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