没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|其它|编辑:郝浩|2009-03-20 09:33:28.000|阅读 406 次
概述:表达式树(Expression Tree)是.NET 3.5中引入的一种表达方式。表达式树的运用十分广泛,可以直观地表现出各种“数据”,甚至“逻辑”和“行为”。再者,表达式树是强类型的,因此合理地使用这个新特性可以让代码编写变得优雅,方便。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
表达式树(Expression Tree)是.NET 3.5中引入的一种表达方式。表达式树的运用十分广泛,可以直观地表现出各种“数据”,甚至“逻辑”和“行为”。再者,表达式树是强类型的,因此合理地使用这个新特性可以让代码编写变得优雅,方便。一个最简单而常见的例子便是,某些朋友目前就已经喜欢使用表达式树来代替传统的ByXxx方法,尤其是在访问一些直接支持表达式树的数据源时(例如IEnumerable或LINQ to SQL)。如下:
public User GetUser(Expression<Func<User, bool>> predicate) { }
而不必写成:
public User GetUserByID(int id) { } public User GetUserByName(string name) { }
于是在调用时便可以:
var user1 = GetUser(u => u.UserID == 1); var user2 = GetUser(u => u.Name == "jeffz");
姑且不论这种设计方式是否合适(因为即使这个做法不合理,也不能代表所有的用法),我们先达成一个共识,那就是“表达式树很有用”——于是我们的接下去话题看上去才会比较有价值:P。那么就上面一个问题来说,在使用了表达式树的情况下,如何在方法中进行缓存?在ByID或ByName的情况下,我们可以轻易地构造一些字符串作为缓存的键,例如“GetUserByID_100”或“GetUserByName_jeffz”。但是现在呢?每次在调用时就会生成一个不同的Expression对象,就算大家“表现一致”,也无法被“识别为”同样的对象,而直接用作缓存的键,因此处理起来并不是那么直接了当的。
您可能会说,那么就在解析表达式树的时候,识别出它是ByID还是ByName,然后再拼接出之前的字符串。当然,您如果真的是要解决上面这个例子的问题,那么的确可以用这种方法。但是老赵现在希望可以找到一种较为通用的,能够根据表达式树进行缓存的解决方案——事实上老赵本来就是在设计一个通用的功能时才引发了这个需求,而这个功能也打算在详细谈完缓存问题后与大家共享。
这个缓存问题看上去简单,但是实际上在性能和功能进行权衡之后会有多种策略可以选择。老赵会在这里谈论5种缓存策略,它们各有千秋,有的方式资源很省,性能很好;而有的方式从性能上比较落后,资源占用也相对较高,但是在某些场景下它似乎还是唯一的解决方案。因此,至少我觉得讨论一下这个问题也是非常有意思的事情,而且从一定程度上说,这些思考能够在一定程度上体现出算法设计与数据结构的美妙之处(尽管相对来说它们其实非常简单)。
在这一系列文章中,老赵希望可以重现自己在思考这个问题的时候所形成的完整思考路径。相比最终解决方案,这可能才是更有价值的东西。文章有时也会将朋友们“引入歧途”,其目的也是为了让弟兄们一起经历一下老赵走过的弯路。到了最后,您可以会说“这死胖子真笨,怎么早没想到”(呵呵,大家莫怪)。此外,这5种缓存策略也并非是思考的全部,事实上老赵相信还会有更好的解决方案(至少理论上是这样的),而由于种种原因并没有在这里实现出来。因此,老赵也希望大家在看了文章之后可以一起思考,并谈出您的看法。:)
不过,表达式树的“构造”很简单,我们可以使用Lambda表达式轻松地生成一颗表达式树,但是在具体操作时就较为困难了。因此在理解这一系列文章之前,可能您还需要作一些准备,也就是一些基础的,操作表达式树的方式。在操作表达式树时,必不可少的东西便是一个ExpressionVisitor类,您可以在MSDN中找到其实现及相关示例,几乎任何操作表达式树的类都会继承于它。总体来说,ExpressionVisitor类提供了功能可以概括为:
以上是ExpressionVisitor类的功能描述,希望朋友们可以自行阅读一下它的代码。最好还可以自行实践一番——至少可以阅读一下MSDN中的示例。
最后,我们将实现几个类,它们都实现同一个接口IExpressionCache,如下:
public interface IExpressionCache<T> where T : class { T Get(Expression key, Func<Expression, T> creator); }
接口中只有一个Get方法,如果没有对应当前key的value,那么则会通过creator委托创建一个新的value并返回。
完整代码下载:http://code.msdn.microsoft.com/ExpressionCache
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:博客园面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号