2017-08-28 99 views
7

在下面的C#代碼中,我發現_()的用法很奇怪。誰能解釋這是什麼意思?語法的含義:return _(); IEnumerable <TSource> _()

public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, 
      Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer) 
{ 
    if (source == null) throw new ArgumentNullException(nameof(source)); 
    if (keySelector == null) throw new ArgumentNullException(nameof(keySelector)); 

    return _(); IEnumerable<TSource> _() 
    { 
     var knownKeys = new HashSet<TKey>(comparer); 
     foreach (var element in source) 
     { 
      if (knownKeys.Add(keySelector(element))) 
       yield return element; 
     } 
    } 
} 

回答

9

的代碼可能會被return語句後插入一個換行符可以更容易理解:

return _(); 

IEnumerable<TSource> _() 
{ 
    var knownKeys = new HashSet<TKey>(comparer); 
    foreach (var element in source) 
    { 
     if (knownKeys.Add(keySelector(element))) 
      yield return element; 
    } 
} 

在這種情況下,下劃線僅僅是一個local function任意名稱(這是一個新的功能在C#7.0中引入)。如果你願意,你可以通過一個更具描述性的名稱替換下劃線:

return DistinctByHelper(); 

IEnumerable<TSource> DistinctByHelper() 
{ 
    var knownKeys = new HashSet<TKey>(comparer); 
    foreach (var element in source) 
    { 
     if (knownKeys.Add(keySelector(element))) 
      yield return element; 
    } 
} 

作爲本地功能,_(或DistinctByHelper)方法可以訪問DistinctBy方法的所有變量。

順便說一句,這裏有兩種方法的原因是,在情況下,任何一個參數爲null,ArgumentNullException將立即在DistinctBy被調用時,結果被枚舉(而不是由於yield return的存在而拋出聲明)。

+4

我*真的*希望這種模式不趕上。這只是醜陋的。 –

+0

我從不喜歡本地函數如何缺少任何類型的標識關鍵字 - 例如,它們很容易被混淆爲本地代理或對象初始化列表。一個簡單的'func'關鍵字或強制lambda語法'=>'會有幫助)。 – Dai

+0

無論如何,本地功能似乎沒有必要。 –

相關問題