【译】Reflection.Emit vs. CodeDOM
原文:http://ayende.com/blog/1606/reflection-emit-vs-codedom
Both technologies allow you to generate executable code at runtime (even though CodeDOM may not have been originally intended for this). This opens up some interesting possibilities (Rhino Mocks and NHibernate, for instnace, uses Dynamic Proxy, which uses Reflection.Emit to generate proxies for object at runtime).
(这两种技术允许你在运行时生成的可执行代码,这开辟了一些有趣的可能性)
Reflection.Emit gives you complete control of the generated IL, while CodeDOM leaves you creating source code dynamically.(Reflection.Emit让你能完全控制IL生成,而CodeDOM让你动态创建源代码)
Reflection.Emit has the following advantages(Reflection.Emit有以下优点):
- You can generate new classes directly into an existing assembly, this helps reduce memory consumtion.(你可以生成新类,直接放到现有的程序集中,这有助于减少内存消耗)
- You can generate new methods in a class (.Net 2.0, dynamic methods).(你可以在类中生成新的方法)
- Significanty faster than any other alternative.(比其他方式要快)
And disadvantages:(Reflection.Emit的缺点)
- It is rocket science mixed with the black arts. The common path is merely hard, but try doing something like support out/ref values, or handling sealed methods, and you are thrown into a mire of special cases. That is completely ignoring the new stuff in .Net 2.0, like generics, which are such a fun to try to support.(这是科学与巫术的混合。很难用,但是尝试做一些事情,比如支持out/ref值,或者处理密封的方法。完全忽略了.NET 2中的新东西,比如泛型。)
- It is not debuggable, at all.(几乎不能调试)
- It is very easy to produce invalid code, and there isn't much information about what is wrong, nor is there much information about how you should go about it.(容易产生无效代码,而且没有太多的错误信息,也没有太多关于你应该如何处理的信息)
- Side note: Even the C# Compiler can be presuded to produce invalid code in certain instances, just to give you an idea about how hard this thing is.(注意:即便在某些情况下,可以让C#编译器生产无效代码,但这只是让你了解这件事本身有多难)
CodeDOM has the following advantages:(CodeDOM有以下优点)
- Very easy to understand and use.(简单易用)
- The generated code is debuggable.(生产的代码可调试)
- You get a lot more information about the errors, often with how to fix them.(你会得到更多关于错误的信息,通常是关于如何修复它们的)
And disadvantages:(CodeDOM的缺点)
- You can't incremently add classes to assembly (important for things like Dynamic Proxy). Every time you generate code, it has its own own assembly.(你不能再现有程序集中添加类,每次生成代码,它都有它自己的程序集)
- You are limited to what you can do within the langauge. There are things you just can't do in code, which are easily possible in Reflection.Emit. There are usually other ways around it, though.(你只能做开发语言支持的事情,有些事情CodeDOM无法实现,但是可以很容易的使用Reflection.Emit来实现,不过这里通常有其他方式解决)
- Slower than Reflection.Emit, because we are generating the code and then compiling it on the fly. This is usually very little code, so it doesn't really matter, and caching helps quite a bit.(比Reflection.Emit慢,因为我们在程序运行时生产代码并编译代码。如果是少量代码就没什么性能影响,并且使用缓存会有很大帮助)
Given that caching is going to be used anyway, I think that I can ignore most of the performance benefits of using Reflection.Emit, in favor of a much simpler programming model offered by CodeDOM. The only thing that really needs Reflection.Emit is dynamically adding methods to a class, and that is not something that you often need.
(因为可以使用缓存,所以,我们完全可以忽略Reflection.Emit的性能优势,而倾向于CodeDOM的简单实用。只有当你需要向类中动态添加方法,或者向程序集添加类时,才需要考虑使用Reflection.Emit)
【译】Reflection.Emit vs. CodeDOM的更多相关文章
- [读行者][学习LinqExpression和Reflection(Emit)]阅读TypeBuilderSample之ExampleFromTheArticle
前言 关于”读行者“ 俗语有云:"读万卷书,行万里路“.多读一些优秀代码,不仅可以锻炼我们读代码的能力(便于维护或相互交流),还可以吸取很多我们成长所需的知识点.多读,才能开阔我们的眼界,才 ...
- System.Reflection.Emit学习
C#反射发出System.Reflection.Emit学习 分享: 1 一.System.Reflection.Emit概述 Emit,可以称为发出或者产生.与Emit相关的类基本都存在于Syste ...
- System.Reflection.Emit摘记
动态类型在.net中都是用什么类型来表示的.程序集:System.Reflection.Emit.AssemblyBuilder(定义并表示动态程序集)构造函数:System.Reflection.E ...
- C#反射发出System.Reflection.Emit学习
一.System.Reflection.Emit概述 Emit,可以称为发出或者产生.与Emit相关的类基本都存在于System.Reflection.Emit命名空间下.反射,我们可以取得形如程序集 ...
- [EF] - 动态创建模型:System.Reflection.Emit + Code First
动态创建Entity Framework模型并且创建数据库 使用System.Reflection.Emit+Code First model创建以下的一个实体类和DbContext并且创建数据库: ...
- ulua、tolua原理解析
在聊ulua.tolua之前,我们先来看看Unity热更新相关知识. 什么是热更新 举例来说: 游戏上线后,玩家下载第一个版本(70M左右或者更大),在运营的过程中,如果需要更换UI显示,或者修改游戏 ...
- 如何快速编写和调试 Emit 生成 IL 的代码
.NET Core/.NET Framework 的 System.Reflection.Emit 命名空间为我们提供了动态生成 IL 代码的能力.利用这项能力,我们能够在运行时生成一段代码/一个方法 ...
- 再谈使用Emit把Datatable转换为对象集合(List<T>)
一.前因和存在的问题 前面我写了一篇<使用Emit把Datatable转换为对象集合(List<T>)>的博文,其实起源于我自己编写的一个orm工具(见前面几篇博文有介绍),里 ...
- DataTable转Entity(Emit版)
public static List<T> ToList<T>(DataTable dt) { List<T> list = n ...
随机推荐
- openlayers应用“三”:百度地图纠偏
前两篇文章介绍了openlayers3加载百度在线和离线瓦片地图,页面上能够正常显示.地图加载后在地图上显示一条GPS轨迹,发现离实际位置相差太远,如下图所示: 轨迹形状和实际形状相同,但是位移太远, ...
- 写具有良好风格的ABAP代码
编程风格是一个经久不衰的话题,大家所公认的事实是:一个良好的编程风格会带来很多的好处.而对于“良好”的标准,则众说纷纭,莫衷一是.编程风格在ABAP程序中当然也有着重要的意义,因为很少看到专门针对AB ...
- vue视频学习笔记07
video 7 vue问题:论坛http://bbs.zhinengshe.com------------------------------------------------UI组件别人提供好一堆 ...
- poj Layout 差分约束+SPFA
题目链接:http://poj.org/problem?id=3169 很好的差分约束入门题目,自己刚看时学呢 代码: #include<iostream> #include<cst ...
- [刷题]算法竞赛入门经典(第2版) 5-3/UVa10935 - Throwing cards away I
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa10935 - Throwing cards away I #incl ...
- 自坑实录 - Asp.net MVC中无法使用@Ajax.BeginForm问题解决
创建空的web项目,通过Nuget引用mvc组件来搭建空的MVC项目时, 在视图页面中无法使用@Ajax.BegForm来进行异步提交数据, 而新建默认的MVC模板项目却能够正常使用@Ajax.Beg ...
- Java IO详解(二)------流的分类
一.根据流向分为输入流和输出流: 注意输入流和输出流是相对于程序而言的. 输出:把程序(内存)中的内容输出到磁盘.光盘等存储设备中 输入:读取外部数据(磁盘.光盘等存储设备的数据)到程序(内 ...
- Android studio 3.0 引起的 outputFile sync failed:not vaild
我们大多使用 android studio 改变生成安装包命名会用以下方式: applicationVariants.all { variant -> variant.outputs.each ...
- jQuery使用记录
jQuery方法获得的集合为类数组对象,可以用一些数组的方法.集合里面的元素为DOM元素,不是jQuery对象. jQuery设置css3属性的兼容性写法: $(element).css({ &quo ...
- Reverse Integer 2015年6月23日
题目: Reverse digits of an integer. Example1: x = , return Example2: x = -, return - 思路:递归 解答: / test ...