如您所知,在 C# 7.0 中添加了一些新功能,其中之一是本地函数。我查看了一些使用局部函数的示例和用例,发现使用它们的两个原因:
1) 隐藏函数或方法。原因是:如果该函数不是本地函数,它可能会被其他成员意外直接使用
2) 使用“父”函数的变量
在重构代码的调试过程中,我在 Visual Studio 中找不到对本地函数的引用。有对私有函数的引用:
当我调试或重构代码时,它会有所帮助。在本地函数中我找不到它们:
那么,第一个问题是为什么本地函数不显示摘要注释和引用?
一些程序员喜欢使用本地函数,但有些人不喜欢。这是一个示例(来自C# 7.0 中的新增功能 | .NET 博客):
public IEnumerable<T> Filter<T>(IEnumerable<T> source, Func<T, bool> filter)
{
if (source == null) throw new ArgumentNullException(nameof(source));
if (filter == null) throw new ArgumentNullException(nameof(filter));
return Iterator();
IEnumerable<T> Iterator()
{
foreach (var element in source)
{
if (filter(element)) { yield return element; }
}
}
}
在这种情况下,使用本地函数的原因是:
如果Iterator
是旁边的私有方法Filter
,其他成员可以直接使用它(无需检查参数)。此外,它需要采用所有相同的参数,Filter
而不是让它们只在范围内
第二个问题是为什么要使用局部函数?在这种情况下,我们可以删除本地方法,因为它只使用了一次。如果我们担心代码大小或代码责任,我们可以使用region:
public IEnumerable<T> Filter<T>(IEnumerable<T> source, Func<T, bool> filter)
{
if (source == null) throw new ArgumentNullException(nameof(source));
if (filter == null) throw new ArgumentNullException(nameof(filter));
#region Iterating
foreach (var element in source)
{
if (filter(element)) { yield return element; }
}
#endregion
}