.NET Framework 4.0 Beta1里的Expression Tree一例

既然装上了Visual Studio 2010 Beta 1,正好可以试试.NET Framework 4.0里的一些新东西。我比较关注的是Expression Tree的部分,到底哪些功能进到了.NET 4,哪些还得到CodePlex的DLR站上去找呢?试用一下找找感觉。

我暂时没试这个beta里的C#对dynamic的支持,是因为暂时还没想到啥有趣的场景能写点简单的代码来玩的。对.NET类型故意使用dynamic的玩法在之前CTP的时候就玩过了,不过瘾了。回头针对.NET 4来编译一个IronPython来看看,到时就能好好把玩一番dynamic了。

回到Expression Tree。在.NET Framework 4.0里它叫Expression Tree v2,简称ETv2。它兼容于.NET Framework 3.5里LINQ的Expression Tree,但实际上是从DLR的DLR tree发展而来的。时至今日DLR的代码仍在快速变化中,而ETv2作为LINQ与DLR的公共部分要放到标准库里,等不到DLR稳定下来。折中的解决方案就是在标准库里的版本砍掉一些DLR里还没定下来的东西和低优先级的东西。像是LoopExpression进入了标准库,但特化版本的ForEach、While等就只有CodePlex上的版本才有。

.NET Framework 4.0中,ETv2位于System.Core.dll程序集中,在System.Linq.Expressions命名空间下。CodePlex的DLR的ETv2则位于Microsoft.Scripting.Core.dll程序集中,Microsoft.Linq.Expressions命名空间下。CodePlex的DLR之所以要用不同的命名空间是为了避免与标准库冲突,但这样一来由编译器生成的ET就与CodePlex的DLR中的ET不兼容了。所以我才那么期待.NET 4.0赶紧出……为了能用上标准库里的ETv2。

昨天装好VS2010 Beta后写的代码如下。


就是先做了个简单的in-memory LINQ查询,然后用ETv2来构造出一个遍历并输出查询结果的函数,并调用之。

C#代码

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;

namespace ConsoleApplication1 {
    static class Program {
        static void Main(string[] args) {
            var list = from i in Enumerable.Range(0, 100)
                       where i % 9 == 0
                       orderby i descending
                       select i;
            var vIter    = Expression.Variable(typeof(IEnumerator<int>), "iter");
            var vI       = Expression.Variable(typeof(int), "i");
            var lBreak   = Expression.Label();
            var eForeach = Expression.Lambda<Action>(
                Expression.Block(
                    new[] { vIter, vI },       // IEnumerator<int> iter; int i;
                    Expression.Assign(         // iter = list.GetEnumerator();
                        vIter,
                        Expression.Call(
                            Expression.Constant(list),
                            typeof(IEnumerable<int>).GetMethod("GetEnumerator"))),
                    Expression.Loop(           // while (true)
                        Expression.IfThenElse(     // if
                            Expression.Call(           // (iter.MoveNext())
                                vIter,
                                typeof(IEnumerator).GetMethod("MoveNext")),
                            Expression.Block(          // {
                                Expression.Assign(         // i = iter.Current;
                                    vI,
                                    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()();
        }
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索net
, framework
, typeof
, system
, expression
, codeplex
, DLR 
expression tree
qq旋风4.0 beta安卓、守护女神4.0beta攻略、守护女神4.0beta、守护雅典娜4.0beta、ali213pk beta4.0.0.9,以便于您获取更多的相关知识。

时间: 2024-11-02 14:14:19

.NET Framework 4.0 Beta1里的Expression Tree一例的相关文章

(收藏)搭建.NET Framework 3.0开发环境 及SharePoint 2007/WSS 3环境

第一步:首先您必须安装.NET Framework 3.0,则可以下载其Redistributable Package  Microsoft .NET Framework 3.0 Redistributable Package  第二步:Microsoft Windows Software Development Kit for Windows Vista and .NET Framework 3.0 Runtime Components正式版 这是.NET 3.0程序开发的运行库,里面有你开发

.Net Framework 4.0 功能介绍

.Net Framework 4.0 功能介绍 微软发布了 Visual Studio 2010 和 .NET Framework 4.0 的Beta 2测试版,微软往Framework 4.0里又塞了很多新东西,有的确实不错,不过有的还是感觉有点粗糙,还在实验阶段,实用性不强. 简单回顾下历史,.Net Framework 1.1其实是个试验品,.Net Framework真正走向成熟其实从2.0开始的,之后的Framework 3,Framework 3.5其实都是基于Framework 2

Zend Framework 1.0正式版即将发布

星期一,Zend技术公司将为PHP的Web应用开发提供其开发架构的1.0版本,这个版本已经以预发布的形式吸引了超过100万的下载. Zend Framework 1.0将不是周围唯一的PHP开发框架,因为它将和像Cake和Prado这样的框架分享.但是Zend公司表示,Zend开发框架是第一个获得了像IBM和Google这样的大企业和大公司相关支持和贡献的框架. Zend公司的CTO和共同创始人Andi Gutmans说:"它是一个用PHP建立高效的Web应用和Web服务的应用框架."

C#中的泛型 (From dotNet SDK 2.0 Beta1)

泛型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性.泛型为.NET框架引入了类型参数(type parameters)的概念.类型参数使得设计类和方法时,不必确定一个或多个具体参数,其的具体参数可延迟到客户代码中声明.实现.这意味着使用泛型的类型参数T,写一个类MyList<T>,客户代码可以这样调用:MyList<int>, MyList<string>或 MyList<MyClass>.这避免了运行时类型转换或装箱操作的代价和风

WF 4.0 beta1活动概览(1):Procedural

相比于WF 3.5,WF 4.0 beta1提供了大量开箱即用的活动,我们可以使用这些活动来创作工作流或者创建自定义活动.本文将会对这些活动做一个简单快速的概览,并介绍它们的关键特性. 活动是工作流程序的工作单元.在WF 4.0中,活动由签名和正文组成.签名是活动的公共参数的术语化定义,这些公共参数定义了活动的输入和输出数据流.而正文则是指活动的执行逻辑,此逻辑可以用其他活动声明性地表示,也可以通过代码来表示. 下面按照WF 4.0 beta1在Visual Studio 2010工具栏中的分类

在IIS上重新注册.NET Framework 2.0的命令和参数详解_实用技巧

我们有时可能需要将 .Net 重新注册到 IIS 上面,可以用下面的命令行来操作. 如果您电脑已经安装了 IIS 然后再装.net 在安装过程中 .net 是会自动帮您注册的,反之则需要注册. 打开程序-运行-cmd:输入一下命令重新注册IIS 复制代码 代码如下: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i 注册成功就可以在IIS里看到: 以下是aspnet_regiis.exe参数的说明信息: -i –

Spring Framework 5.0 RC2 发布

Spring Framework 5.0 RC2 版本中正式将非空声明的 API 加入到标准包内,依照 JSR305 规范标准,可在注解内显示声明可空参数和返回值,在现有版本的 IntelliJ IDEA 和未来版本的 Kotlin 里都会与此保持高度兼容,各位一起来尝尝鲜吧. Spring Framework 5.0 RC2 版本更新问题清单: https://jira.spring.io/browse/SPR/fixforversion/15893/?selectedTab=com.atla

F4何去何从 --- 大视野观察Framework 4.0

Framework 4.0 CTP版发布一个多月了,在此期间稍有闲暇就打开来试试,尝试一下这个新东东.总体感觉微软现在技术大爆炸,一下子往F4里塞了好多东西,有的确实不错, 不过有的还是感觉有点粗糙,还经不起实战考验.那以下我会简单和大家过一遍这个新的框架,一起来聊聊F4的前景. 简单回顾下历史,F1.1其实是个试验品,.Net Framework真正走向成熟其实从F2开始的,之后的F3,F3.5其实都是基于F2的扩充,我个人感觉应该定义为F2.1,F2.2.没想到微软喜欢搞大跃进,随便加点东西

Framework 4.0 新关键字dynamic 之我见(一)

大家好,好久没有写博客了,最近一段时间工作也比较忙,不过我还是会在空余时间去学习一些东西. 微软在这个星期一,开放了VS2010和Framework4.0的Beta1版本的下载,所以我也花了1天的时间进行了下载和安装,因为系统现在是windows7,而且这次版本也是beta版本,所以把它安装在了虚拟机上,虽然只设置了1G的内存,不过跑起来还非常让人满意,没有像其他兄弟说的,很吃内存,很废cpu. 其实先前已经使用过CTP版本了,也一直对新特性在做研究,在第一时间下载了beta版本后,发现其实和C