快速业务通道

.NET Framework 4.0 Beta1里的Expression Tree一例

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22
I, Expression.Property(vIter, "Current")), Expression.Call( // Console.WriteLine(i); typeof(Console).GetMethod("WriteLine", new[] { typeof(int) }), new[] { vI })), Expression.Break(lBreak)), // } else break; } lBreak)), new ParameterExpression[0]); eForeach.Compile()(); } } }

用ETv2构造出来的函数基本等价于一个含有普通foreach循环的lambda:

C#代码

() => {
    foreach (var i in list) {
        Console.WriteLine(i);
    }
}

注意到foreach循环可以被展开为while循环:

C#代码

() => {
    var iter = list.GetEnumerator();
    while (iter.MoveNext()) {
        var i = iter.Current;
        Console.WriteLine(i);
    }
}

我用ETv2实现的lambda实际上是这样的:

C#代码

() => {
    var iter = list.GetEnumerator();
    int i;
    while (true)
        if (iter.MoveNext()) {
            i = iter.Current;
            Console.WriteLine(i);
        } else
            break;
}

后来想了想,我应该把vI放在if里的block来声明的,会更符合foreach的语义。不过懒得开虚拟机去改了……

写成while (true)是因为ETv2里的LoopExpression就是代表一个无限循环,外加用户可自定义的条件分支及跳转目标(BreakTarget和ContinueTarget)。在C-like语言里,基本循环结构可以分为条件前置的while/for和条件后置的do...while两种。但总有些时候我们希望既不是在开头也不是在结尾,而是在循环体的中间来判断循环条件;在C-like语言里我们就只好用无限循环+条件语句来模拟这种半中腰的循环结构。ETv2为了提供最大的弹性,提供的基本循环结构就是这种代表无限循环的LoopExpression。但这样的基本结构用起来总让人嫌麻烦,还好CodePlex上的DLR里有特化版本的循环结构,只是没赶上.NET 4这趟车而已。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号