Hi,大家好,随着大家对VS2010的深入了解,对dynamic已经是越来越了解了,何时该用,何时不用已经非常熟悉了,原本不打算再写下去的,但感觉还有点东西需要说说,就简单再说一下吧。
原先以为dynamic实在runtime时确定的,后来看了一下,这个runtime是在微软新出的一个运行时DLR上的,动态的为你判断该使用何种类型,而不是原先的CLR,具体的大家可以参考微软的MSDN,因为英文不太好,以免误导大家,也就不写详细了。
这几天一直在考虑何时去用这个关键字,如果对于一般的程序在没有与其他COM,API交互的情况下,使用dynamic会大大影响到程序性能,但如果与反射相比较的话,性能其实是在一个级别,也许更快,代码也会简单明了些。如果遇到与其他COM,API交互的情况下,dynamic就充分显示了它的优势,而且在某些时候,你在无交互程序中,使用dynamic也会给你带来不一样的体验。以下分两部分来说,都是些简单应用,一部分是与IronPython的交互,还有一部分是在无交互程序中,dynamic的用处。
-
以前我们与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:米想到进入有道第二轮了,有进入的可以加我,大家多多探讨一下,嘿嘿