代码改变世界

老赵谈IL(4):什么时候应该学IL,该怎么学IL

2009-12-25 00:08 by Jeffrey Zhao, 11362 阅读, 收藏, 编辑
摘要: 又是一个拖了半年的系列,可能是前几篇主要以事实为准,举例子的文章总是比较容易写的,因此十分顺畅。而最后一篇打算做一个总结,以讲道理为主——却发现该将的似乎都已经讲完了。不过做事要有始有终,该完成的也必须要完成。那么现在就来谈谈我的一些个人看法:什么时候应该学IL,以及应该怎么学IL。阅读全文

重谈字符串连接性能(下):分析优化

2009-12-23 14:03 by Jeffrey Zhao, 7905 阅读, 收藏, 编辑
摘要: 经过之间的性能比较,我们得知StringBuilder的性能并非时时最优,再经过实现分析,我们大致了解了StringBuilder的实现方式。虽然在此之前,大家也基本已经了解StringBuilder的实现原理,也有不少朋友指出了它性能缺陷的原因。不过“严谨”起见,寻找性能问题的方式应该是进行Profiling,然后找出性能关键再进行优化——而不是纯粹进行“阅读”这种静态分析方式。阅读全文

使用Profiler分析程序性能

2009-12-22 11:37 by Jeffrey Zhao, 48255 阅读, 收藏, 编辑
摘要: 三个星期之前我向大家求助说,VS的Profiler分析程序性能时无法跟踪框架内部的方法调用。当时我做了不少尝试,例如下载并配置了.NET Framework的symbol文件和源代码,还尝试使用了ANTS Profiler和CLR Profiler等其他工具,最终还是没有成功。Ivony...老大在评论中告诉我说Sampling方式可以获得比Instrumentation更多的信息,不过我觉得Sampling得到的结果并不像我的目标那样干净,因此还是在寻找Instrumentation的方式。不过最终耗费了一个GTSC的支持点数,才被告知——的确应该使用Sampling。阅读全文

在.NET平台上使用Scala语言(下):分析

2009-12-21 00:30 by Jeffrey Zhao, 7038 阅读, 收藏, 编辑
摘要: 上一篇文章里我们简单尝试了在Scala里编写.NET应用程序。这个过程并不困难,因为似乎Scala官方已经对此已经有较好的支持了。我们要做的只是“获取工具”,“编译成IL”,最后再“生成程序集”即可。那么,这些工具究竟做了些什么,Scala究竟又是如何支持.NET平台的,它的可用性究竟如何,我们还需要进一步的分析及尝试。阅读全文

在.NET平台上使用Scala语言(上):初尝

2009-12-18 12:47 by Jeffrey Zhao, 10361 阅读, 收藏, 编辑
摘要: Scala是Java平台上的一门新兴起的语言,我也不止一次在博客上提到它。我非常希望它可以取代Java这种劣质语言,让Java平台的生产力上一个台阶。事实上,Scala从一开始——或者说“很早”就对生成.NET程序集提供了支持。只可惜,毕竟还是Java平台的东西,.NET方面的资源少之又少,不过我们还是可以进行一番尝试的。阅读全文

定制Paste from Visual Studio插件(下)

2009-12-16 14:27 by Jeffrey Zhao, 5268 阅读, 收藏, 编辑
摘要: 上一篇文章里我们进行了简单的实验,验证了通过修改IL生成新插件的可行性,不过我们要做的事情还有很多,因为我们实际要做的事情其实是……插入行号。这需要我们补充新的逻辑,并且对CreateContent进行修改。那么我们又该如何写这大段大段的IL呢?没关系,其实这些事情不懂IL也可以做。阅读全文

定制Paste from Visual Studio插件(上)

2009-12-16 10:56 by Jeffrey Zhao, 5880 阅读, 收藏, 编辑
摘要: 我在上一篇文章里谈了我常用Paste from Visual Studio(下文称VSPaste)的插件,这大大方便了我写博客时贴代码的工作。不过今天早上有朋友在我博客后面留言说:“VSPaste没法显示行号,不知大家有没有办法解决?”其实这点很容易,写个小程序,把VSPaste生成的HTML再进行一番处理不就可以了嘛。不过最方便的做法还是让VSPaste直接生成带行号的代码块,不是吗?那么,我们就来自己动手丰衣足食解决这个问题吧。阅读全文

浅谈代码着色(下):服务器端着色

2009-12-15 15:38 by Jeffrey Zhao, 6503 阅读, 收藏, 编辑
摘要: 上篇文章谈了客户端着色,而现在自然就来讨论服务器端着色了。先下个定义:我在这里谈的“服务器端着色”,是指直接从服务器端输出着色效果的做法(与“客户端着色时”输出纯代码文本相对)。至于这个着色效果是如何获得的,例如是由另一个用户直接提供的,还是用户提供纯代码文本,而用服务器端逻辑“着色”,在这里就统称为“服务器端”着色了。不过接下去的讨论,我们还是会作一些区分。阅读全文

浅谈代码着色(上):客户端着色

2009-12-14 19:53 by Jeffrey Zhao, 7425 阅读, 收藏, 编辑
摘要: 作为程序员,写文章时总免不了插入代码,而对代码进行着色几乎已经成为一个基础,一个事实标准。代码着色的确可以大大加强代码的可读性,因此即便是再不待见IDE的朋友,代码着色永远是必不可少的。不过在网页中进行代码着色的方式有很多,现在我们就来对比一下。记得之前也有朋友写过,但我总觉得不够完整,于是还是自己写一下吧。我们先来看客户端的着色方式。阅读全文

总结一下F#中运算符的定义规则

2009-12-14 01:46 by Jeffrey Zhao, 5542 阅读, 收藏, 编辑
摘要: F#允许开发人员定义或重载各类运算符,合理利用这一规则可以让编程变得方便,让代码更容易阅读。例如,在使用F#的MailboxProcessor的时候,我会习惯于定义一个运算符来代替显式的Post操作。不过,F#的运算符定义规则较为复杂,要搞清楚编译器的整体处理方式着实花费了一番功夫。比较奇怪的是,即便是《Expert F#》中对于这个话题也没有详细的叙述——更夸张的是MSDN的文档也相当马虎,甚至有代码缺失以及与试验不符情况(因为还没有正式发布?)。于是我连看带试,最终打算总结一番,作为备忘的同时也算是补充互联网资源。阅读全文

数十行F#打造简易Comet聊天服务

2009-12-11 12:00 by Jeffrey Zhao, 10976 阅读, 收藏, 编辑
摘要: 普通的Web应用程序,都是靠大量HTTP短连接维持的。如实现一个聊天服务时,客户端会不断轮询服务器端索要新消息。这种做法的优势在于简单有效,因此广为目前的聊天服务所采用。不过Comet技术与之不同,简单地说,Comet便是指服务器推(Server-Push)技术。它的实现方式是(这里只讨论基于浏览器的Web平台)在浏览器与服务器之间建立一个长连接,待获得消息之后立即返回。否则持续等待,直至超时。客户端得到消息或超时之后,又会立即建立另一个长连接。Comet技术的最大优势,自然就是很高的即使性。而F#实现一个Comet原型,只要几十行代码。阅读全文

在项目中使用Google Closure Compiler

2009-12-09 09:13 by Jeffrey Zhao, 29134 阅读, 收藏, 编辑
摘要: 现在的Web项目总是离不开大量JavaScript,而JS文件的体积也越来越大,也越来越影响页面的感知性能(Perceived Performance)。因此,我们会对JS文件进行压缩,一方面是使用Gzip,而另一方面则是去除JS文件里的注释、空白,并且压缩局部变量长度等等。对于一些成熟的类库来说,它们本身都会提供“完整注释”以及“强烈压缩”两个版本。但是,有时候我们需要自己修复类库里的bug,这只能在注释版中修改,对于压缩版自然就无能为力了。此外,自定义的脚本文件一般也值得一压。因此我在项目中时常会备一个脚本压缩工具。阅读全文

Route组件GetVirtualPath方法性能优化结果

2009-12-08 01:32 by Jeffrey Zhao, 6108 阅读, 收藏, 编辑
摘要: 由于使用Lambda表达式生成URL的方式性能较差,因此我使用Fluent Interface来代替原有的Lambda表达式构建方式。Fluent Interface主要对生成URL的前两个阶段(创建对象及分析对象)进行了优化,分别带来了超过2/3和1/2的性能优化,但因为最后一步,也就是使用Route对象的GetVirtualPath方法构造URL的性能没有提高,因此总体性能只提高了30%。于是我打算重新实现GetVirtualPath方法,希望得到更好的性能。那么优化的结果又如何呢?阅读全文

真有必要去除HTML中的空白字符吗?

2009-12-07 17:59 by Jeffrey Zhao, 14125 阅读, 收藏, 编辑
摘要: 刚才有朋友在MSN上问我说,他的页面中有许多空白字符,打开源文件一看发现这代码稀疏得很。他觉得很浪费,他说有什么办法可以去除它们。我问他“你的页面使用GZip压缩了吗?”他说用了,于是我回答说“那么就不用去除空白字符了,连续空白字符压缩得很好,去掉后效果不大的”。这时我又不禁想到早上那篇《博客园首页优化心得》中也有一条是“去除HTML中的空格、空行”,于是我便打算尝试一下,去除空白字符到底有多少效果。阅读全文

使用值类型LazyString分析字符串

2009-12-07 10:09 by Jeffrey Zhao, 6130 阅读, 收藏, 编辑
摘要: .NET里提供了值类型与引用类型可谓是一个非常关键的特性,例如开发人员使用值类型时,可以充分控制内存的布局方式,这对于Interop等操作非常重要。不过,其实值类型最重要,最基本的特性还是内存分配上。现在基本上是个.NET开发人员就会叨念说“值类型”分配在栈上,“引用类型”分配在堆上。但是什么是栈什么堆?分配在栈上和堆上的区别是什么?如果说这两个问题太“理论”,那么来个实际的:您在平时什么情况下会使用,或者说,定义一个值类型呢?其实这才是重要的,否则背再多概念也没有用。只可惜从我面试的经验上来看,基本没有多少兄弟能把这些.NET基础完整说清楚。阅读全文

求助:如何使用VS的Profiler跟踪框架内部的方法调用?

2009-12-05 19:16 by Jeffrey Zhao, 6449 阅读, 收藏, 编辑
摘要: 解决性能问题必须使用Profiler,无论是自己写的实验代码还是一些高级工具,没有数据,而是凭感觉来解决性能问题在绝大部分情况是不靠谱的。VSTS包含了Profiler,也经常见一些博客上用Profiler得到的数据进行性能分析,其中最著名的莫过于Rico Mariani的Performance Quiz系列了。使用VSTS的Profiler可以收集程序运行过程中每个方法的调用次数,所消耗的总时间等等,一目了然,但是我在使用过程中却出现了问题。阅读全文

jQuery Validation插件remote验证方式的Bug

2009-12-04 14:29 by Jeffrey Zhao, 25533 阅读, 收藏, 编辑
摘要: jQuery插件很多,其中一个重要的插件便是jQuery Validation,它的作用是对表单进行验证,还上了jQuery官网。不过奇怪的是,最近用下来感觉有些古怪,因为好像有些死板,已有功能的应变能力还不强,甚至还有个奇怪的Bug。任何项目有Bug其实也正常,但这个Bug其实是一个文档上已经记载了,却没有实现的功能,这就有些说不过去了。这个问题便出在remote验证方式上,还好修改起来非常容易,在此记录一下,也方便以后的参考。阅读全文

做个游戏:设计代码生成特定的调用堆栈

2009-12-04 00:30 by Jeffrey Zhao, 4786 阅读, 收藏, 编辑
摘要: 前篇文章里我谈了谈String.Concat与StringBuilder的实现,于是后来有个朋友回复到:“我发现StringBuilder里好像也用了String.Concat。在一次异常中,Exception的StackTrace显示是先发生了String.Concat异常,然后再StringBuilder.Append。”不过经过一些简单的分析,我们会发现StringBuilder.Append方法的各个重载都没有依赖(即调用)String.Concat方法,那么这样的调用堆栈又是如何形成的呢?阅读全文

重谈字符串连接性能(中):细节实现

2009-12-03 10:10 by Jeffrey Zhao, 9718 阅读, 收藏, 编辑
摘要: 根据上次的评测结果,我们了解了几种字符串拼接方式的性能高低。从中可以看出,广受追捧的StringBuilder性能似乎并不是最好的,String.Concat方法有时候有时候更适合使用。那么为什么String.Concat方法性能那么高,StringBuilder又为什么落败,而我们又有没有什么可以改进的做法呢?为此,我们不妨动用.NET Reflector这一利器,看一下两者是怎么实现的。阅读全文

各种数组元素复制方式的性能比较

2009-12-02 10:27 by Jeffrey Zhao, 8670 阅读, 收藏, 编辑
摘要: 原本这只是“字符串”话题的一个分支,不过后来我发现这个问题单独来看也有一定参考价值,也有一些问题值得讨论的地方,其中也有一些问题希望得到高手指点,最终打算把这个话题独立处理。话不多说,现在就来看看。阅读全文

使用WinDBG + SOS谈对象大小及字符串的结构

2009-12-01 14:57 by Jeffrey Zhao, 5652 阅读, 收藏, 编辑
摘要: 昨天我们使用了一个最最简单的小实验,来检查相同类型的不同对象大小是否相同。当然,我们很轻易地“验证”得出,不同长度的字符串大小是不一样的。不过这种表面现象其实很难说明问题,因此我现在还是用WinDBG + SOS来进行一些检查,希望可以得到一些表面上看不出来的信息。阅读全文

[已过期] 创业小公司招聘网页前端工程师(1名,上海市长宁区)

2009-12-01 13:31 by Jeffrey Zhao, 5258 阅读, 收藏, 编辑
摘要: 某创业小公司,其实就是老赵呆的创业小公司,又要招聘网页前端工程师了。对于一个网站来说,什么最重要。至少在前期,可能还是网页前端工程师吧。至少我认为,在前期可以没有老赵,但是不能没有前端工程师,否则用户就根本看不到任何东西,再好的设想也难以实现。因此,我们目前急需您的加盟。 阅读全文

相同类型的每个对象大小都是一样的吗?

2009-11-30 14:09 by Jeffrey Zhao, 5044 阅读, 收藏, 编辑
摘要: 快速回答:“相同(引用)类型的每个对象大小都是一样的吗?”其实个问题对于大多数情况下来说应该正确的,不过的确也有些类型受到CLR的特殊照顾,因而有那么些例外。我现在尝试使用一些简单的小实验来进行验证,当然它是不严谨的,只能算是一个简单尝试而已。阅读全文

验证fixed关键字效果的小实验

2009-11-29 21:11 by Jeffrey Zhao, 5403 阅读, 收藏, 编辑
摘要: 之前谈到String连接操作的性能,其中会涉及到unsafe操作,而unsafe操作必然会涉及到指针,于是fixed关键字也应运而生。fixed关键字是用来pin住一个引用地址的,因为我们知道CLR的垃圾收集器会改变某些对象的地址,因此在改变地址之后指向那些对象的引用就要随之改变。这种改变是对于程序员来说是无意识的,因此在指针操作中是不允许的。否则,我们之前已经保留下的地址,在GC后就无法找到我们所需要的对象。现在就来我们就来做一个小实验,验证fixed关键字的效果。阅读全文

视频:Microsoft PDC 09,算法及数据结构内容及其他

2009-11-27 13:57 by Jeffrey Zhao, 5697 阅读, 收藏, 编辑
摘要: 这里又有一些新整理好的视频。Microsoft PDC 09是最近的重头,只要您是搞微软技术的,无论关注哪个技术方面,都可以找到许多有用的内容。我也经常从此类大会中了解许多平时不太关注的内容,也算是保持知识的新鲜度。此外,还有算法和数据结构相关的内容,以及有趣的Visual Studio纪录片。阅读全文

重谈字符串连接性能(上):性能评测

2009-11-26 01:12 by Jeffrey Zhao, 16002 阅读, 收藏, 编辑
摘要: 看到这个标题是不是觉得很奇怪呢?字符串连接的性能,这个话题已经被谈了一遍又一遍,一次又一次,似乎已成定论,这又有什么好谈的呢?不过说来奇怪,根据我的实验结果在网上进行搜索,却找不到答案。因此,我现在和大家一起重新再作一次实验并观察结果。在文章最后我也会给出完整的代码,您可以自由地运行,修改,尝试,我们再一起进行交流。阅读全文

一系列技术视频:MIT 6.00,Channel 9 E2E,FP Foundamentals

2009-11-25 10:12 by Jeffrey Zhao, 7834 阅读, 收藏, 编辑
摘要: 最近看一些技术视频上瘾,每天都要看一两个才满足,有时还会整理整理总结总结。视频的来源主要是Channel 9等外国网站,它们往往必须下载到本地才能观看,代价太高。在线看的也不是没有,不过要么就在Youtube等国内无法访问的站点上,或者就因为国内没有CDN导致播放不畅。因此,我正在把一些视频上传到号称国内第一视频站的优酷上,这样便可以比较方便的播放,甚至可以拖拖看看。目前我准备了三个系列,并且还在不断地进行搬运和整理工作。阅读全文

关于浮点数计算时的精度问题

2009-11-24 14:21 by Jeffrey Zhao, 11704 阅读, 收藏, 编辑
摘要: 那个有问题的缩略图生成的方法发布之后,短短半天就有很多朋友响应,其中指出了不少方法中的不少问题,有些也是我没有意识到的。果然集体的智慧是无穷的,一段代码在许多人的眼皮底下经过,想留有bug也不容易。不过,我在这里只能谈一下我写那篇文章的本意了,我认为那篇文章中最主要的问题是,在计算图片尺寸时没有处理好浮点数计算的精度问题。阅读全文

您能看出这个生成缩略图的方法有什么问题吗?

2009-11-24 00:32 by Jeffrey Zhao, 9513 阅读, 收藏, 编辑
摘要: 昨天又使用了某个多年以前写的,或者说是“收集”而来的方法。这个方法的作用是根据一幅图片(一般是幅大图)生成它的缩略图。这个方法用了许多年了,一直没有去怀疑过它的正确性,但是昨天忽然发现它一直以来都存在一个问题,虽然可能不是那么明显,而且也不会造成太大问题(否则早就发现了)——但是,这的确是个不妥的地方。这个问题在我看来也有一定借鉴意义,因此我打算把它展示出来。那么,您能否看出它究竟是错在什么地方了呢?阅读全文

老赵书托(3):深入理解计算机系统

2009-11-23 00:10 by Jeffrey Zhao, 57974 阅读, 收藏, 编辑
摘要: 如果说我上次推荐的SICP强调的是编程能力,抽象能力的话,那么CSAPP这本书强调的便是作为一个程序员的基本知识。SICP来自世界顶级学府MIT,而CSAPP也同样出身名门:CMU(卡耐基梅隆大学)。虽然没有SICP那么历史悠久,但它被世界几百所大学(幸运的是也包括我所就读的复旦大学)用作教材也有好多年了。不过我很不喜欢它的中文译名《深入理解计算机系统》——如果有人说它“底层”,我同意。但如果说它“深入”,至少我不那么赞同。阅读全文

再谈Attribute性能优化方式:使用CCI Metadata

2009-11-20 10:47 by Jeffrey Zhao, 6239 阅读, 收藏, 编辑
摘要: Attribute使用了反射,密集调用时会带来较大开销,因此我们上次提出了一些优化方式,这样就不会产生性能方面的问题了。这个优化方式的关键,主要是使用直接获得构造Attribute的元数据,然后自定义它们的生成方式并缓存,这样就避免了每次获取元数据及反射构造Attribute的开销。我从一开始就抱有这个优化的“思路”,但是上篇文章中最终的做法是受到了heros同学的提示才得出的,因为我一开始还根本不知道CustomAttributeData这个已然内置的类库。我当时在探索的方向是使用CCI Metadata读取程序集中与Attribute相关的元数据。阅读全文

URL生成方式性能优化结果

2009-11-19 10:33 by Jeffrey Zhao, 18163 阅读, 收藏, 编辑
摘要: 继上次发现URL生成的性能问题之后,我最近一直在关注一些细节的性能优化。这些优化方式不是宏观的,理论的,而是在实践上对相同问题的不同做法进行探索。我把探索的过程和结论都发布在博客上了,从结果上看性能提高是比较明显的。但是,把它们用于解决实际问题时,效果又会如何呢?我把MvcPatch进行了一些修改,然后再使用UrlGenBenchmark进行了一番比较。阅读全文

Attribute操作的性能优化方式

2009-11-18 10:09 by Jeffrey Zhao, 22713 阅读, 收藏, 编辑
摘要: Attribute是.NET平台上提供的一种元编程能力,可以通过标记的方式来修饰各种成员。无论是组件设计,语言之间互通,还是最普通的框架使用,现在已经都离不开Attribute了。迫于Attribute的功能的重要性(Kent Beck认为NUnit比早期JUnit设计的好,一个主要方面便是利用了Attribute),Java语言也在5.0版本中引入了与Attribute类似的Annotation概念。不过Attribute说到底也是一种反射操作,平时正常使用不会带来问题,但是密集的调用还是对性能有一定影响的。这次我们就来总结看看我们究竟可以如何回避Attribute操作的一些性能问题。阅读全文

《链接、装载与库》里的一个错误:关于调用栈

2009-11-17 00:29 by Jeffrey Zhao, 20290 阅读, 收藏, 编辑
摘要: 周六老同学聚会,出门前随手从桌上抓起了《程序员的自我修养——链接、装载与库》在路上翻。自从武汉博文出版社的周筠老师送给我这本书后,我基本上还没怎么看过。对这本书第一感觉是“标题党”,主标题起大了,虽然经过解释之后并非无法理解,但还是不太喜欢。但书还是好书,已经看完大半,而且基本上会在近期找个方式推荐一把。不过现在我想细说的并不是推荐相关话题(如适合谁看,该怎么看,结合什么一起看等等),而是想指出书中还未被《勘误》收录的一个错误:P288讲调用栈时,文字描述和配图上的问题。阅读全文

并发环境下的缓存容器性能优化(下):性能测试

2009-11-16 00:29 by Jeffrey Zhao, 19424 阅读, 收藏, 编辑
摘要: 上一篇文章里,我谈到对于某些场景中的缓存容器,其写操作非常少,到了程序后期甚至为零,而对它的读操作却几乎是密集连续且无穷无尽的。对于这样的容器,如果使用ReaderWriterLockSlim去进行保护每个“读”操作,这开销是在有些多余。因此我提出了“不可变”的哈希表,目的是在保持读操作的时间复杂度为O(1)的情况下,尽可能避免多余的开销。现在我们便将它和其他几种时间进行一个性能的对比。阅读全文

“表达式树”配合“泛型参数字典”定义通用操作

2009-11-13 13:53 by Jeffrey Zhao, 18069 阅读, 收藏, 编辑
摘要: 上午有朋友提出了这么一个问题:如何定义一个通用的相加操作。其实这可以利用“泛型参数字典”和“表达式树”配合完成,也有着非常优秀的性能。于是,我们便可以定义一个比.NET框架自带的Enumerable.Sum强大许多的扩展方法了。阅读全文

F#版本的CodeTimer(已支持CPU时钟周期统计)

2009-11-13 10:49 by Jeffrey Zhao, 17400 阅读, 收藏, 编辑
摘要: CodeTimer很好用,自从在今年三月在.NET技术大会上看到Jeffrey Richter用类似的东西之后,我就自己写了一个。不过,当时是用C#写的,现在我需要在F#里做相同的事情就不那么方便了。当然,F#与.NET本是无缝集成,因此C#写的CodeTimer也应该可以被F#使用。不过,我平时在使用CodeTimer时并不是通过程序集引用,而是使用代码复制的方式,因此如果有个F#版本那么应该使用起来更加方便。阅读全文

并发环境下的缓存容器性能优化(上):不可变的哈希表

2009-11-12 00:03 by Jeffrey Zhao, 22319 阅读, 收藏, 编辑
摘要: 我们在项目中经常会遇到这样的场景:一些信息读取开销较大,但只需要生成一次便可反复使用,因此我们会将其永久地缓存起来。例如在ASP.NET MVC中,系统会根据Controller的名称来缓存对应的元数据。这些缓存容器都有一些共同的特点,便是存储的对象数量有限(少则几十,多不过数千),但都需要在并发环境下被大量地读取,因此必须是线程安全的。那么,我们该如何设计这样的容器呢?阅读全文

缓存方式与对象创建的性能比较

2009-11-11 14:28 by Jeffrey Zhao, 19534 阅读, 收藏, 编辑
摘要: 由于Lambda表达式构造URL的速度不佳,我最近对于性能上的细节问题进行了一些探索和尝试。对于很多问题,以前由于不会形成性能瓶颈,因此并没有进行太多关注。还有一些问题可以“推断”出大致的结论,也趁这个机会进行更详细的试验,希望可以得到更为确切的结论和理性的认识。这次我打算做的实验,是关于对象的缓存与创建的性能比较。在某些情况下,我们会将创建好的对象缓存起来,以便今后进行复用。但是不同的缓存方式会有不同的性能,因此……我们现在便来试试看。阅读全文

一次失败的尝试(下):无法使用泛型的Attribute

2009-11-11 00:07 by Jeffrey Zhao, 18751 阅读, 收藏, 编辑
摘要: 原本打算两篇写在一起,但是我认为这两个话题本身并没有太大关联,因此分开,便于查询。其实在构建Attribute的时候,我们经常会从构造函数中传入一个Type类型,然后在Attribute中使用Activator.CreateInstance或其他的“反射”方法来构造对象。那么,我忽然想,为什么不能使用泛型的Attribute呢?有了泛型便可以利用静态检查,也可以获得其他有用的特性。只可惜,C#并不支持在Attribute中使用泛型……而且这点在C# 4中也基本不会有所改变了。阅读全文
使用Live Messenger联系我