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:米想到进入有道第二轮了,有进入的可以加我,大家多多探讨一下,嘿嘿

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏崔庆才的专栏

使用requests+正则表达式爬取猫眼电影排行

本节中,我们利用requests库和正则表达式来抓取猫眼电影TOP100的相关内容。requests比urllib使用更加方便,而且目前我们还没有系统学习HTM...

7387
来自专栏淡定的专栏

《实现模式》读书总结

导语 这是一本关于如何写好代码的书,是一本关于“如何编写别人能看懂的代码”的书。从价值观、原则、模式三个层面解读如何优化代码结构,减少代码维护成本。 关于这本书...

1978
来自专栏python3

python介绍

python是一门优秀的综合语言,python的宗旨是简明,优雅,强大,在人工智能,云计算,金融分析,大数据开发,web开发,自动化运维,测试等方向应用广泛,已...

2101
来自专栏互联网杂技

如何去了解JavaScript引擎的工作原理

1. 什么是JavaScript解析引擎? 简单地说,JavaScript解析引擎就是能够“读懂”JavaScript代码,并准确地给出代码运行结果的一段程序。...

3867
来自专栏BeJavaGod

BeJavaGod - 如何正确使用数据字典进行分类统一操作(一)

先说说什么是数据字典,这个玩意一般不太会解释,举个栗子吧~ 每个系统都会有用户表,性别:男(1)女(0) 另外我们做物流的会涉及到车型:卡车(1),轿车(2),...

3447
来自专栏吉浦迅科技

DAY50:阅读Warp Vote Functions

Deprecation notice: __any, __all, and __ballot have been deprecated as of CUDA 9...

831
来自专栏Crossin的编程教室

【我问 Crossin】英语不好能不能学编程?

“我问 Crossin” 栏目会整理一些读者经常会问到的问题,统一作答。有比较具体的编程细节,也会有一些方向的建议,以及学习经验、编程小技巧的分享。 大家有想问...

3399
来自专栏AI科技大本营的专栏

精选26个Python实用技巧,想秀技能先Get这份技术列表!

【导读】Python 虽然是脚本语言,但是因为其易学,迅速成为科学家的工具,从而积累了大量的工具库、架构,人工智能涉及大量的数据科学,用 Python 是很自然...

1415
来自专栏MelonTeam专栏

《实现模式》读书总结

导语 这是一本关于如何写好代码的书,是一本关于“如何编写别人能看懂的代码”的书。从价值观、原则、模式三个层面解读如何优化代码结构,减少代码维护成本。 ...

2888
来自专栏机器学习算法与Python学习

精选26个Python实用技巧,想秀技能先Get这份技术列表!

Python 虽然是脚本语言,但是因为其易学,迅速成为科学家的工具,从而积累了大量的工具库、架构,人工智能涉及大量的数据科学,用 Python 是很自然的事。磨...

1392

扫码关注云+社区

领取腾讯云代金券