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

Hi,大家好,随着大家对VS2010的深入了解,对dynamic已经是越来越了解了,何时该用,何时不用已经非常熟悉了,原本不打算再写下去的,但感觉还有点东西需要说说,就简单再说一下吧。

原先以为dynamic实在runtime时确定的,后来看了一下,这个runtime是在微软新出的一个运行时DLR上的,动态的为你判断该使用何种类型,而不是原先的CLR,具体的大家可以参考微软的MSDN,因为英文不太好,以免误导大家,也就不写详细了。

这几天一直在考虑何时去用这个关键字,如果对于一般的程序在没有与其他COM,API交互的情况下,使用dynamic会大大影响到程序性能,但如果与反射相比较的话,性能其实是在一个级别,也许更快,代码也会简单明了些。如果遇到与其他COM,API交互的情况下,dynamic就充分显示了它的优势,而且在某些时候,你在无交互程序中,使用dynamic也会给你带来不一样的体验。以下分两部分来说,都是些简单应用,一部分是与IronPython的交互,还有一部分是在无交互程序中,dynamic的用处。

 

  1. 以前我们与IronPython交互的话,需要如此写:

     

    先定义一个py文件:helloworld.py


 

def welcome(name):

 

 

    return "Hello '" + name + "' from IronPython"

 

 

然后我们使用IronPython.Net 来调用这个文件中的这个方法(为了方便测试性能,我将定义两个方法)


static
void StaticUseIronPythonMethod()

{

var runtime = Python.CreateRuntime();

var scope = runtime.UseFile("helloworld.py");

Func<object, object> func = scope.GetVariable<Func<object, object>>("welcome");

 

func("StaticUseIronPythonMethod");

}

 

上面的代码其实很简单,创建一个Python的Rumtime,然后是调用我们先前写好的py文件,随后获取一下welcome这个方法,然后执行。

我们再来看看用dynamic改写后的代码(注:一定要使用IronPython CTP 2.6 for VS2010,否则无法使用):

 


static
void DynamicIronPythonMethod()

{

var runtim = Python.CreateRuntime();

dynamic hello = runtim.UseFile("helloworld.py");

hello.welcome("asdf");

}

 

看到吗?代码变得简单明了,就像在自己代码中定义了webclome方法,然后调用,非常的简单。这就是dynamic的神奇之处了,使我们代码跟美观,因为所有的一切,我们都交给DLR去完成了。

可能大家会想到性能方面,经过测试,与IronPython交互的编写,如果用以往的方式写,一样会很慢,如果用dynamic的话,性能还会有小幅度的提高。我改写了老赵和b0b0的性能计数器,代码和结果如下:


using (CodeTimer timer = new
CodeTimer("DynamicIronPythonMethod"))

{

DynamicIronPythonMethod();

}

 

using (CodeTimer timer = new
CodeTimer("StaticUseIronPythonMethod"))

{

StaticUseIronPythonMethod();

}

结果:


 

大家看到了吧,其实两个是在同一级别的,但我们的代码却优雅了很多,至于多个方法,我没有测试,大家有空可以试试。

原本打算今天把dynamic在一般应用中的有趣用法也写一下,不过发觉需要准备很多代码,因为没有好好准备,暂时先放一下,明后天再放上来。不过大概的场景如下:

我通过一个入口,搜索一些内容,比如:商品,但是根据不同的商品类型,他们有不同的搜索条件,但是返回的东西都是相同的内容。如果你的解决方案是拼接字符串,进出据库查询的话,那你可以略过下一篇内容,因为我这里会很"时尚"的使用OO。

大体如下:

我有手机、书籍两种商品,我定义了这2个类,这两个类同时继承了商品类,我在搜索页面,可以根据不同条件进行搜索,但是页面显示的信息,其实都是商品类的一些属性。

场景大概就是这样,原本以为会很快写好,但越来越发觉,这个应该详细说说,因为实际中我们已经遇到过,写的详细点,希望对大家也有帮助。

好了,今天就写到这里了,经过了6天的小长工作日,终于可以放松一下了,大家晚安~

 

PS:米想到进入有道第二轮了,有进入的可以加我,大家多多探讨一下,嘿嘿

相关文章:“Framework 4.0 新关键字dynamic之我见(一)”

时间: 2024-11-05 18:44:50

Framework 4.0 新关键字dynamic 之我见(二)的相关文章

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

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

C# 4.0新特性dynamic有何用?

这两天看到园子里面有几篇关于dynamic怎么用的文章,咋一看搞不明白这个 dynamic到底有啥用,反而让我多了两个问题: 写程序时少了智能感知: 运行程序时速度变慢(反射). 今天看完New features in CSharp 4.docx才恍然明白,趁着没事,把东西整 理一下,希望能对暂时还不明白dynamic有什么用的朋友提供一些参考.当然,由 于本人才疏学浅,不保证所有的观点都是正确的,希望大家用辩证的眼光来看这 篇文章,如有错误之处,请大伙批评指正. 言归正传,dynamic关键字

c# 4.0新特性一览

终于静下心来仔细听了一遍Anders Hejlsberg(Visual Studio组的TECHNICAL FELLOW,C#的设计者之 一)在PDC08上讲的"The Future of C#"(http://channel9.msdn.com/pdc2008/TL16/). 回顾C#发展的历史,C#1.0完全是模仿Java,并保留了C/C++的一些特性如struct,新学者很容易上手 :C#2.0加入了泛型,也与Java1.5的泛型如出一辙:C#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

C# 3.0 新特性:扩展方法初探

C#3.0中一个激动人心的特性就是扩展方法:你可以使用实例方法的语法来调用静态方法.本文仔细阐述了这一新特性并且给出了几个相应的例子. 声明扩展方法 扩展方法的行为和静态方法是非常类似的,你只能在静态类中声明它们.为声明一个扩展方法,你需要给该方法的第一个参数指定this关键字,如下例: // Program.cspublic static class EMClass{ public static int ToInt32Ext(this string s) { return Int32.Pars

.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来编译一个Iro

c# 6.0新特性(一)

写在前面 接近年底了,基本上没什么活了,就学点新东西,就想着了解下c# 6.0的新特性.在code project上看到了一篇不错的文章,就准备翻译一下,顺便照着学习学习.废话不多说,直奔主题. 原文地址:http://www.codeproject.com/Articles/1070659/All-About-Csharp-New-Features 简介 众所周知,c# 6.0 是在visual studio 2015中引入的.在其他的几个版本中同样引入一些特性,比如在c# 3.0中引入了li

C# 3.0 新特性----扩展方法

转自 http://www.cnblogs.com/jiejie_peng/archive/2010/04/08/1707195.html C# 3.0 新特性----扩展方法 主要目的掌握对一个已经编译的类的方法的扩展 特别注意a. 扩展某个类时,新建的类要使用 public static 修饰,因为默认的类是 internal 访问修饰符b. 这个类要有文件作用域,即不能作为嵌套类使用c. 扩展方法要声明为静态的d. 扩展方法的第一个参数类型即是要扩展的类,且该参数前要加 this 关键字e

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

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