Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Func的首选命名约定是什么<;TResult>;方法参数?_C#_Lambda_Naming Conventions - Fatal编程技术网

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

C# Func的首选命名约定是什么<;TResult>;方法参数?,c#,lambda,naming-conventions,C#,Lambda,Naming Conventions,我承认这个问题是主观的,但我对社会的观点感兴趣。我有一个cache类,它接受类型为Func的缓存加载程序函数,它使用该函数从数据库中检索一个值并将其存储在缓存中 public static class Cache { public TResult Get<TResult>(string cacheKey, Func<TResult> cacheLoader) { // Implementation } } 公共静态类缓存 { p

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

public static class Cache
{
    public TResult Get<TResult>(string cacheKey, Func<TResult> cacheLoader) 
    {
        // Implementation
    }
}
公共静态类缓存
{
public TResult Get(字符串cacheKey,Func cacheLoader)
{
//实施
}
}
我的问题是:如何命名函数参数?

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

我对这个特定函数参数的命名不太感兴趣,而对函数参数的一般命名方式更感兴趣。ye,Stack Overflow community怎么说?

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

public static class Cache
{
    public TResult Get<TResult>(string cacheKey, Func<TResult> cacheLoadingDelegate) 
    {
        // Implementation
    }
}
公共静态类缓存
{
public TResult Get(字符串cacheKey,Func cacheLoadingDelegate)
{
//实施
}
}

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

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

loadResult(result);
它看起来像一个普通的方法调用,但大小写表明它是一个变量,因此两条信息都被传递


您可以附加一个后缀,如
Method
Delegate
Lambda
,但这些后缀通常只会使其冗长而不清晰。这取决于具体情况和您的编码标准,当然也取决于您的偏好。

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

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);
Enumerable.Average(此IEnumerable源,Func选择器)
Enumerable.Count(此IEnumerable源,Func谓词)
可枚举.GroupBy(此IEnumerable源、Func键选择器、Func元素选择器)
ConcurrentDictionary.GetOrAdd(TKey,
Func valueFactory);
这个名词通常是一个适当的动词


在您的示例中,我将使用类似于
loader
或可能的
valueFactory
。我个人不喜欢
cacheLoader
,因为大概是调用方而不是委托方在缓存中插入内容。

我有点喜欢这种逻辑,除了一件事。参数名称的选择应该让调用者,而不一定是方法的实现者,明白其目的…@Reed:你说得对,这是一种有利于调用者的利益冲突。如果库公开了公共API,那么参数的命名是神圣的。这是编码标准的一个例子。是的,似乎参数名应该与调用者通信“传入一个将执行此操作的方法”。无论调用方是实现该方法还是找到该方法,他都需要知道它应该做什么。它是一个函数,因此我可以将其命名为与任何其他函数一样。@codymanix它也是一个使情况更糟的变量;)我更喜欢Joe的答案。虽然我喜欢@Reed将其命名为一种方法的想法,这样称呼它看起来更自然,但在我看来,框架先例是王牌。答案是MS反对这种惯例。