在 C# 7 本地方法中重新引入新的泛型参数是一种好习惯吗?

Is it a good practice to reintroduce new generic parameters in C# 7 Local Methods?

我正在试验 C# 7 的新功能,尤其是本地方法。我写了 Linq Where 运算符。

我将迭代器块实现为本地方法(事实上,我读过文章说本地方法是异步方法和迭代器的完美解决方案)。

我想知道这两种实现方式之间是否存在差异,如果不同,哪一种是最好的?

第一次执行:

在这里我为本地方法引入了新的泛型类型参数,参数的新名称...

public static  IEnumerable<TSource> Where<TSource> (this IEnumerable<TSource> source,  Func<TSource, bool> predicate) {
    if(source == null) throw new ArgumentNullException(nameof(source));
    if(predicate == null) throw new ArgumentNullException(nameof(predicate));
    return WhereIterator(source,  predicate);

    IEnumerable<TSequence> WhereIterator<TSequence> (IEnumerable<TSequence> localSource,  Func<TSequence, bool>  localPredicat) {
        foreach(TSequence item in localSource) {
            if(localPredicat(item)) {
                yield return item;
            }
        }
    }
}

第二次执行:

没有新的泛型参数,没有新参数,因为本地方法可以捕获封闭方法的变量。

public static  IEnumerable<TSource> Where<TSource> (this IEnumerable<TSource> source,  Func<TSource, bool> predicate) {
    if(source == null) throw new ArgumentNullException(nameof(source));
    if(predicate == null) throw new ArgumentNullException(nameof(predicate));
    return  WhereIterator();

    IEnumerable<TSource> WhereIterator () {
        foreach(TSource item in source) {
            if(predicate(item))
                yield return item;
            }
        }
    }
}

你的第二个实现更好。主要区别在于第二个实现隐式捕获其参数,使您免于重复自己:

  • 指定参数类型时,
  • 指定参数名称时,
  • 向函数传递参数时。

避免重复是一个非常重要的编程习惯,因此您应该更喜欢第二个实现。