Hello World
Spiga

标签:Lambda表达式

匿名类型的硬伤:围绕this的成员捕获策略

2011-06-15 09:27 by 老赵, 3722 visits
摘要:时不时听到一些C#程序员说,希望在C#里出现像Java匿名类一样的特性。以前我也觉得Java里的匿名类是个不错的特性,C#应该吸取进来。不过前段时间我仔细地理解了Java语言规范中关于内部类、匿名类的部分之后,一下子就被恶心到了。恶心过后,我忽然也意识到有些问题的确也是硬伤,也不能指责Java设计者的“品位”。例如,现在我想要谈的关于匿名类中this使用的问题——如果C#没法漂亮地实现这个特性,我宁愿它继续保持现状。 阅读全文

各种URL生成方式的性能对比(结论及分析)

2009-11-01 16:16 by 老赵, 16744 visits
摘要:上次我们设计了一个实验,比较三种不同URL生成方式的性能。您运行了吗?如果运行的话,有没有对结果进行一些的分析呢?现在我们就来详细观察及分析这次试验的结果,并给出我的分析。如果您有一些其他的看法,也请进行一些补充。从结果上看,Lambda表达式生成URL的性能令人难以接受,经过分析之后更发现,这是一个硬伤,必须根本性,方向性地进行改变。您对此有什么看法呢?我们不妨一起讨论一下如何做到“既美观,又高效”。如果您有更理想的做法也请告诉我。 阅读全文

统计一个表达式树拥有的节点数量

2009-10-31 13:05 by 老赵, 14753 visits
摘要:如果要统计表达式树的节点数量,我们可以编写一个Expression Visitor来完成这个任务。值得注意的是,由于ExpressionVisitor只负责“遍历”,因此在进行“统计”、“收集信息”等任务的时候,都需要在子类内部保存临时信息。因此,许多ExpressionVisitor的实现其实都不是线程安全的。一般说来,由于自动生成闭包等机制,一个Lambda表达式实际构造出的节点总比我们“看出”的要多一些。 阅读全文

各种URL生成方式的性能对比

2009-10-29 16:31 by 老赵, 17614 visits
摘要:在上一篇文章中我们列举了各种URL生成的方式,其中大致可以分为三类:1) 直接拼接字符串,2) 使用Route规则生成URL,3) 使用Lambda表达式生成URL。我们可以轻易得知,这3种作法可维护性依次增加,而性能依次减少。不过,我们还是有一个疑问,这个性能究竟相差多少?它是否的确真的可以被忽略?为此,我们还是来进行一次性能对比吧。您可以在这里下载文末的解决方案,亲自试验一下——不过在此之前,您不妨进行一个预测,猜猜看最后的结果究竟如何。 阅读全文

浅谈URL生成方式的演变

2009-10-28 16:29 by 老赵, 17468 visits
摘要:开发Web应用程序的时候,在页面上总会放置大量的链接,而链接的生成方式看似简单,也有许多不同的变化,且各有利弊。现在我们就来看看,在一个ASP.NET MVC应用程序的视图中如果要生成一个链接地址又有哪些做法,它们之间又是如何演变的。这个演变的过程,其实也是一步步发现缺点,再进行针对性改进的过程。我们虽然使用在ASP.NET MVC的视图作为演示载体,但是它的方式和思路并不仅限于此,它也可以用在ASP.NET MVC的其它方面(如在Controller中生成URL),或是其它模型(如WebForms),甚至与Web开发并无关联的应用程序开发上面。 阅读全文

使用Lambda表达式编写递归函数(性能测试)

2009-09-27 05:23 by 老赵, 10451 visits
摘要:为了补充引用资料,现在对之前Lambda表达式编写递归函数进行一番性能测试。测试的对象为辗转相除法求最大公约数,使用以下三种方式计算:普通递归,使用SelfApplicable及Fix进行计算。从执行时间上看,直接递归的性能最好,Self次之,但相差不大,但Fix方式消耗的时间就为前两者的7倍左右了。从GC压力上看,直接递归与Sel对GC都没有丝毫压力,但Fib由于构建了额外的委托对象,其压力也相对较大。 阅读全文

使用Lambda表达式编写递归函数

2009-08-30 17:40 by 老赵, 7609 visits
摘要:其实这从来不是一个很简单的事情,虽然有些朋友认为这很简单。如果您把委托变量的声明和Lambda表达式分开写为两行,那么其实这已经是一中“伪”递归了。可能已经有朋友知道“标准”的做法是什么样的,不过我这里还想谈一下我当时遇到这个问题时想到的一个做法。比较笨(非常符合我的特点),但是可以解决问题。但是装配脑袋很早给了我们更好的解决方法,希望在以后的某一天,我可以把这部分内容融会贯通地理解下来,并且可以详细地解释给大家听。在这之前,我还是听脑袋的话,把Fix强行记在脑袋里吧。 阅读全文

Fast Reflection Library

2009-02-01 01:25 by 老赵, 10267 visits
摘要:这是我在CodePlex上创建的一个项目,它的网址是http://www.codeplex.com/FastReflectionLib,使用Microsoft Public License (Ms-PL),您可以随意在自己的产品中使用它的全部或部分代码。这个项目用到了我在《方法的直接调用,反射调用与Lambda表达式调用》和《这下没理由嫌Eval的性能差了吧?》两篇文章里用到的做法,并加以提炼和扩展发布的项目——随便搞搞,留个印记,也供以后参考。 阅读全文

方法的直接调用,反射调用与……Lambda表达式调用

2008-11-24 01:59 by 老赵, 28825 visits
摘要:想调用一个方法很容易,直接代码调用就行,这人人都会。其次呢,还可以使用反射。不过通过反射调用的性能会远远低于直接调用——至少从绝对时间上来看的确是这样。因此,很多框架在必须利用到反射的场景中,都会设法使用一些较高级的替代方案来改善性能。例如,使用CodeDom生成代码并动态编译,或者使用Emit来直接编写IL。不过自从.NET 3.5发布了Expression相关的新特性,我们在以上的情况下又有了更方便并直观的解决方案。 阅读全文
1
使用Live Messenger联系我