借助委托实现方法嵌套
C# 并不支持方法嵌套,也就是说我们不能写出下面这样的代码。
void Test()
{
void Inner(int x)
{
}
Inner(123);
}
但某些时候,方法嵌套却非常有用,比如说方法内的某些局部代码会被多个 "不连续" 区域调用。当然,我们可以将这些 "公用代码" 提取为类私有方法成员。但这么做有些 "别扭",或者说是 "不好看"。毕竟这些代码的使用者只有当前这个方法,将其作用域提升,有 "污染" 的嫌疑。借助于委托,我们很容易 "模拟" 出方法嵌套。
试验原型
static void Test()
{
var a = new[] { 1, 3, 5 };
var b = new[] { 2, 4, 6 };
var listA = new List<int>();
foreach (var item in a)
{
listA.Add(item % 2);
}
var listB = new List<int>();
foreach (var item in b)
{
listB.Add(item % 2);
}
}
虽然这个演示方法很简单,但我们依然可以将其修改得更漂亮点。
static void Test()
{
var a = new[] { 1, 3, 5 };
var b = new[] { 2, 4, 6 };
Func<int[], List<int>> mod = array =>
{
var list = new List<int>();
foreach (var item in array)
{
list.Add(item % 2);
}
return list;
};
var listA = mod(a);
var listB = mod(b);
}
static void Test()
{
var a = new[] { 1, 3, 5 };
var b = new[] { 2, 4, 6 };
var mod = new Func<int[], List<int>>(array =>
{
var list = new List<int>();
foreach (var item in array)
{
list.Add(item % 2);
}
return list;
});
var listA = mod(a);
var listB = mod(b);
}
改写后的 mod 就类似一个嵌套方法,可以在方法内部多个地方 "重用"。当然,最终编译器会将其编译成一个 "类" 方法,但那已经超出我们要讨论的范围。
============ 欢迎各位老板打赏~ ===========
与本文相关的文章
- · The instance of entity type ‘Customer’ cannot be tracked because another instance with the same key value for {‘Id’} is already being tracked.
- · .NET8实时更新nginx ip地址归属地
- · 解决.NET Blazor子组件不刷新问题
- · .NET8如何在普通类库中引用 Microsoft.AspNetCore
- · .NET8 Mysql SSL error
- · ASP.NET Core MVC的Razor视图渲染中文乱码的问题
- · .NETCORE 依赖注入服务生命周期
- · asp.net zero改mysql
- · .NET5面试汇总
- · .Net连接Mysql数据库的Convert Zero Datetime日期问题
- · vue使用element-ui中的Message 、MessageBox 、Notification
- · Asp.Net Core Filter 深入浅出的那些事-AOP
