本地功能
區域性函式在方法中定義,不在其外部。他們可以訪問所有區域性變數並支援迭代器,async
/ await
和 lambda 語法。這樣,特定於函式的重複可以在不佔用類的情況下被功能化。作為副作用,這改善了智慧感知建議的表現。
例
double GetCylinderVolume(double radius, double height)
{
return getVolume();
double getVolume()
{
// You can declare inner-local functions in a local function
double GetCircleArea(double r) => Math.PI * r * r;
// ALL parents' variables are accessible even though parent doesn't have any input.
return GetCircleArea(radius) * height;
}
}
本地函式大大簡化了 LINQ 運算子的程式碼,在這些運算子中,你通常必須將引數檢查與實際邏輯分開,以使引數檢查立即進行,而不是在迭代開始之後延遲。
例
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 iterator();
IEnumerable<TSource> iterator()
{
foreach (TSource element in source)
if (predicate(element))
yield return element;
}
}
本地功能還支援 async
和 await
關鍵字。
例
async Task WriteEmailsAsync()
{
var emailRegex = new Regex(@"(?i)[a-z0-9_.+-]+@[a-z0-9-]+\.[a-z0-9-.]+");
IEnumerable<string> emails1 = await getEmailsFromFileAsync("input1.txt");
IEnumerable<string> emails2 = await getEmailsFromFileAsync("input2.txt");
await writeLinesToFileAsync(emails1.Concat(emails2), "output.txt");
async Task<IEnumerable<string>> getEmailsFromFileAsync(string fileName)
{
string text;
using (StreamReader reader = File.OpenText(fileName))
{
text = await reader.ReadToEndAsync();
}
return from Match emailMatch in emailRegex.Matches(text) select emailMatch.Value;
}
async Task writeLinesToFileAsync(IEnumerable<string> lines, string fileName)
{
using (StreamWriter writer = File.CreateText(fileName))
{
foreach (string line in lines)
{
await writer.WriteLineAsync(line);
}
}
}
}
你可能已經注意到一個重要的事情是,當地的功能可以在 return
宣告下定義,他們根本不會需要它上面進行定義。此外,本地函式通常遵循 lowerCamelCase
命名約定,以便更容易區分類範圍函式。