统计一个表达式树拥有的节点数量
2009-10-31 21:05 Jeffrey Zhao 阅读(17138) 评论(9) 编辑 收藏 举报如果要统计表达式树的节点数量,我们可以编写一个Expression Visitor来完成这个任务:
public class ExpressionNodeCounter : ExpressionVisitor { public int Calculate(Expression expr) { this.m_count = 0; this.Visit(expr); return this.m_count; } private int m_count; protected override Expression Visit(Expression exp) { this.m_count++; return base.Visit(exp); } }
我们将表达式树传递给Visit方法后,Visit方法会将参数分派给其它方法,而其它方法又会将子节点交还给Visit方法进行递归调用,因此我们可以得知其实这个表达式树的每个节点都会“经过”Visit方法处理。因此,我们只需要重载Visit方法,查看它调用了几次就行了。值得注意的是,由于ExpressionVisitor只负责“遍历”,因此在进行“统计”、“收集信息”等任务的时候,都需要在子类内部保存临时信息。因此,许多ExpressionVisitor的实现其实都不是线程安全的。这点在使用或设计的时候都值得注意,我在开发FastLambda项目时,也对这个问题疏忽了。因此,虽然我用了一些方式来保证了FastEvaluator的线程安全,但事实上在相当长的时间内其实它都有着严重的问题。
那么,我们现在便可以用ExpressionNodeCounter来统计上次使用不同方式生成URL时所用到的Lambda表达式:
var blog = new Blog(); var post = new Post(); Expression<Action<HomeController>> expr = c => c.Post(blog, post); Console.WriteLine(new ExpressionNodeCounter().Calculate(expr));
猜猜看结果如何?答案是7个节点,您是否能将它们一一指出?
其实,一般说来,由于自动生成闭包等机制,一个Lambda表达式实际构造出的节点总比我们“看出”的要多一些。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2007-10-31 微软的网络分析服务 - Gatineau Web Analytics Begins Beta Today!