摘要:
很多编码规范上都指出不要使用线程静态(ThreadStatic),这主要是为了防止在使用的时候出现意外。当有的时候这个线程静态确实会带来一些好处,如何取舍就要看具体情况了。 首先,明确一点线程静态与标准静态之间的区别。线程静态相当于变量有线程来负责保存,因此每个线程看到都可以是不同的,但在同一个线程内是相同的。而标准静态实际上是应用程序域(AppDomain)负责保存的,因此... 阅读全文
摘要:
前面一片随笔讲过用Delegate.CreateDelegate来提高多次反射效率的,使用代价较小的委托来代替反射的Invoke。 在Delegate.CreateDelegate方法对实例方法有一些默认的转换,例如:String.Trim()这个实例方法可以转换成下面两种委托: Code highlighting produced by Actipro CodeHighli... 阅读全文
摘要:
今天做了这么一个试验: 将直接调用、委托与反射调用放在一起,测试了一下性能。同时也发现了一些认识上的误区。测试类如下: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> public delegate void PlusOn... 阅读全文
摘要:
前几天,写了一个绕开频繁反射的几个方案,其中有的比较简单,有的比较复杂。 今天,无意中有发现了一个绝对简单的方案,适合不懂Emit的人群,而且简单到只需要一个泛型方法就可以了。 下面请出今天的主角:Delegate,相信大家应该都很熟悉这个类,所有的委托类都是继承自它。但是它的作用可不仅仅是一个基类而已哦。它还拥有众多的静态方法可供我们使用,这次用到的就是一个叫Cr... 阅读全文
摘要:
GoF的《Java与设计模式》一书就不再说其中的重要性了,这里主要想谈一下.Net中的Delegate对设计模式的影响。 与Java相比.Net的一个比较好的改进是为事件提供了一个比较好的模型,其中的第一功臣是Delegate,那么Delegate的作用是什么? 简单的来说Delegate是一个函数接口+一个函数列表。 函数接口可以说是函数编程(之后简称FP)里面的思想(... 阅读全文
摘要:
说到Lambda表达式,几乎所有人的反应就是Linq,不错,Lambda表达式的最大用途确实是在Linq,Lambda表达式本身也是为Linq量身定做的。 但是Lambda表达式本身只是一个匿名函数的简化版,因此,并不是针对Linq的。换而言之,任何匿名函数可以做的事情,Lambda表达式都可以做。就以Windows Form的程序为例子吧: Code highlighting pr... 阅读全文
摘要:
字典Dictionary相信大家都用过,但是如果字典的键是一个TKey数组(或者IList),怎么办? 这就是今天要讨论的案例:MultiKeyDictionary 先来看看反例: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--... 阅读全文
摘要:
在.net里面,反射是一个功能强大的工具,但是,这个强大功能背后却是性能的损失。尤其是频繁的反射,将降低总体性能。 为了程序运行的更快更好,有必要在频繁反射的地方添加必要的缓存,用尽量少的反射,获得必要的灵活性,而又不降低太多性能。 说到性能,先说一下在.net中的性能排列吧,最快的是非虚方法,然后依次是虚方法、接口方法,委托,反射。前面3个的性能几乎可以忽略。委托比一般的方法... 阅读全文
摘要:
SingleTon模式也许是被最广泛应用的模式,但是,最近看到的几个SingleTon不得不让我出一身冷汗。 先来看看标准的反例:C#版 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> public static SomeObje... 阅读全文
摘要:
泛型、反射、特性都是.Net强大的功能之一,关于这3个的强大之处我就不再重复说了,今天想说的是,将这三者结合起来,组成一个强大的以静制动、以不变应万变的方案。 这个方案,我已经通过一些实验,将它变成了真实的代码。当然如果已经有人有了类似的方案,纯属巧合。本方案的核心是将特性引入目前已经有很多人讨论过的Emit中。 方案的目的: 使用方需要知道: 1、接口ITestD... 阅读全文