簡體   English   中英

在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;
            }
        }
    }
}

您的第二個實現更好。 主要區別在於第二種實現隱式捕獲其參數,使您不必重復自己的工作:

  • 指定參數類型時,
  • 指定參數名稱時,以及
  • 將參數傳遞給函數時。

避免重復是非常重要的編程習慣,因此您應該選擇第二種實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM