借助委托实现方法嵌套
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