﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-Cavingdeep的技术专栏</title><link>http://www.cnblogs.com/cavingdeep/</link><description>软件开发与工程，又一种艺术。</description><language>zh-cn</language><lastBuildDate>Tue, 09 Feb 2010 16:56:22 GMT</lastBuildDate><pubDate>Tue, 09 Feb 2010 16:56:22 GMT</pubDate><ttl>60</ttl><item><title>用metaclass实现AOP风格的Profiler</title><link>http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483056.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Tue, 22 Aug 2006 02:36:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483056.html</guid><description><![CDATA[<p>阅读: 2434 评论: 4 作者: <a href="http://www.cnblogs.com/cavingdeep/" target="_blank">Cavingdeep</a> 发表于 2006-08-22 10:36 <a href="http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483056.html" target="_blank">原文链接</a></p>以下是一段通过metaclass实现Profiler的Python代码，很简单，功能不多，目的是为了展示Python的meta
programming的能力，这种能力，无疑是很实用的，而且可以将AOP的方面（aspect）概念发挥的很好！下面的Profiler类（metaclass）就可以将方法的profiling在不同的类中复用。<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Profiler(type):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">__new__</span><span style="color: #000000;">(mcl,&nbsp;name,&nbsp;bases,&nbsp;dict):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;time&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;clock<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;types&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;FunctionType<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;timing(func):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;wrapper(</span><span style="color: #000000;">*</span><span style="color: #000000;">args,&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">kwds):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;clock()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;func(</span><span style="color: #000000;">*</span><span style="color: #000000;">args,&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">kwds)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;clock()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;func.</span><span style="color: #800080;">__name__</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">takes</span><span style="color: #800000;">'</span><span style="color: #000000;">,&nbsp;(end&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;start),&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">seconds</span><span style="color: #800000;">'</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;value<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;wrapper<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;attr,&nbsp;value&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;dict.iteritems():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;isinstance(value,&nbsp;FunctionType):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dict[attr]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;timing(value)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;super(Profiler,&nbsp;mcl).</span><span style="color: #800080;">__new__</span><span style="color: #000000;">(mcl,&nbsp;name,&nbsp;bases,&nbsp;dict)<br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;A(object):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">__metaclass__</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Profiler<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;foo(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;range(</span><span style="color: #000000;">100000</span><span style="color: #000000;">):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;total</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;total<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;foo2(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;time&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;sleep<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;range(</span><span style="color: #000000;">100000</span><span style="color: #000000;">):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;total</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="color: #000000;">0.0001</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;total<br><br></span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;main():<br>&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;A()<br>&nbsp;&nbsp;&nbsp;&nbsp;a.foo()<br>&nbsp;&nbsp;&nbsp;&nbsp;a.foo2()<br><br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">__name__</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">__main__</span><span style="color: #800000;">'</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;main()<br></span></div>
<br><br>此篇为抛砖引玉，希望大家能制作出更多更强的metaclass来，然后不妨与我们分享！:)
<br>  <img src="http://www.cnblogs.com/cavingdeep/aggbug/483056.html?type=1" width="1" height="1" alt=""/><p>评论: 4　<a href="http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483056.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483056.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Singleton implementation using metaclass</title><link>http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483054.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Tue, 22 Aug 2006 02:34:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483054.html</guid><description><![CDATA[<p>阅读: 1919 评论: 0 作者: <a href="http://www.cnblogs.com/cavingdeep/" target="_blank">Cavingdeep</a> 发表于 2006-08-22 10:34 <a href="http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483054.html" target="_blank">原文链接</a></p>这里是一段Python代码，展示了如何利用metaclass来实现一个通用的Singleton，这使任何一个class都可以简单的复用这一行为：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Singleton(type):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">__call__</span><span style="color: #000000;">(cls,&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">args):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">not</span><span style="color: #000000;">&nbsp;hasattr(cls,&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">instance</span><span style="color: #800000;">'</span><span style="color: #000000;">):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cls.instance&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;super(Singleton,&nbsp;cls).</span><span style="color: #800080;">__call__</span><span style="color: #000000;">(</span><span style="color: #000000;">*</span><span style="color: #000000;">args)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;cls.instance<br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Cache(object):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">__metaclass__</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Singleton<br><br></span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;main():<br>&nbsp;&nbsp;&nbsp;&nbsp;cache&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Cache()<br>&nbsp;&nbsp;&nbsp;&nbsp;cache.data1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">data1&nbsp;==&nbsp;%s</span><span style="color: #800000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;cache.data1<br><br>&nbsp;&nbsp;&nbsp;&nbsp;cache2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Cache()<br>&nbsp;&nbsp;&nbsp;&nbsp;cache2.data1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cache2.data1&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">data1&nbsp;is&nbsp;increased&nbsp;by&nbsp;1.</span><span style="color: #800000;">'</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">data1&nbsp;==&nbsp;%s</span><span style="color: #800000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;cache.data1<br><br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">__name__</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">__main__</span><span style="color: #800000;">'</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;main()<br></span></div>
<br><br>这是一个简单的meta
programming的应用展示，展示了metaclass所蕴涵的强大的能力，只要想得到，metaclass可以实现各种各样用通常手法做不到或很难实现的功能。:D<br>  <img src="http://www.cnblogs.com/cavingdeep/aggbug/483054.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483054.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483054.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>初试IronPython与.NET的集成</title><link>http://www.cnblogs.com/cavingdeep/archive/2006/08/01/464781.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Tue, 01 Aug 2006 03:06:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2006/08/01/464781.html</guid><description><![CDATA[<p>阅读: 3518 评论: 5 作者: <a href="http://www.cnblogs.com/cavingdeep/" target="_blank">Cavingdeep</a> 发表于 2006-08-01 11:06 <a href="http://www.cnblogs.com/cavingdeep/archive/2006/08/01/464781.html" target="_blank">原文链接</a></p><p>在得知IronPython如今已步入1.0 RC1后兴奋不已，赶快下载下来试用。虽说功能性变化不多（加入了试用性Python 2.5的语法支持:D），但稳定性如今已提高了不少，应该说可以用来投入正式使用了。:)</p>
<p><strong>如何用好IronPython</strong></p>
<p>翻看了一下Tutorials，发现和以前的内容差不多，按照Tutorials中的方法尝试了一下在C#中嵌入IronPython 代码，发现还很不错，最起码可行，虽然速度肯定没有用C#直接写出来的快（因为IronPython需要动态编译的缘故）。</p>
<p>好的，现在我们拥有了一项较稳定的可以投入使用的新技术了，但是如果没有市场，那么这个新技术是不能够生存的，所以我左思右想 IronPython在企业级开发中到底占了什么地位（因为我是做企业级开发的:)），有何等优势呢？通过分析现有IronPython的特征，我得到了一个结论，那就是它比较适合做脚本引擎或者简单的客户端。以下是我分析的IronPython的一些特征：</p>
<ol>
    <li>Python的语法，灵活性相当的高！
    </li>
    <li>与.NET Framework的交互实现的非常的好，现在用Python的语法也可以用.NET的类库了。
    </li>
    <li>在其他.NET语言中可以通过引用IronPython.dll来执行IronPython文件并且可以实现内存共享（在同一AppDomain中）。
    </li>
    <li>纯IronPython程序启动非常慢。
    </li>
    <li>由于IronPython的特殊性，它所编译出来的程序集中的成员并非你所想象的，所以不能够由其他程序集直接引用使用。这主要还是因为Python是一种动态类型语言，所以无法在编译时给予合适的静态类型（唯一合适的就是System.Object）。另外为了与CPython保持兼容性，IronPython也是以module为单位进行group的，也就是一个module被编译成一个类，这个module中的所有成员，包括class都被当作成员编译在这个类中。 </li>
</ol>
<p>基于以上一些IronPython现有的特征来看，我觉得它更适合使用.NET 程序集，而非为.NET程序提供功能（虽然也是可行的，也是我希望的），所以我建议将IronPython用作客户端以及脚本引擎一类的用途上，因为这类程序是属于consumer类的，它们使用现成的API，但是它们不为其他人提供新的API。</p>
<p><strong>如何用IronPython为.NET程序提供API</strong></p>
<p>读者可能会说我自相矛盾，刚刚才说过IronPython不适合用来提供API，怎么现在又提起这件事来了呢（唉，人本身就是一种很矛盾的生物）？！其实就像上面我在括号中提及的，利用IronPython的交互能力与语言的灵活性为我的.NET程序提供简化的解决方案是我的期望，虽然速度方面还不尽人意，但优化的空间永远都是存在的，我相信随着时间的推移IronPython会在性能方面做的更出色（从这方面来看我是个乐观主义者:D）。</p>
<p>为了简化主程序与IronPython文件的交互与维护难度，我决定将IronPython文件作为服务（service）来看待，IronPython所提供的每一个API就是一个独立的服务，每次需要使用这个服务的时候我只需向它发送相应的消息（message）即可，而它，会返回给我一个回应（response）如果有必要的话。我觉得这样做比较符合目前的SOA潮流。（如果你还不知道SOA是什么的话，一句话告诉你，它是一种企业级集成手段）</p>
<p>我的做法很简单，只是初步实现了一个对IronPython文件调用的封装，示例如下。</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;a.Add(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;a.Add(</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;a.Add(</span><span style="color: #000000;">3</span><span style="color: #000000;">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;b&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;b.Add(</span><span style="color: #000000;">4</span><span style="color: #000000;">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;b.Add(</span><span style="color: #000000;">5</span><span style="color: #000000;">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;b.Add(</span><span style="color: #000000;">6</span><span style="color: #000000;">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;PyFacade</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">IList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">IList</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;&gt;&gt;</span><span style="color: #000000;">&nbsp;py&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PyFacade</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">IList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">IList</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;&gt;&gt;</span><span style="color: #000000;">();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;py.PythonFile&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">mayorThenTen.py</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;py.Arguments.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">listA</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;a);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;py.Arguments.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">listB</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;b);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;py.Execute();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><br><img id="Codehighlighter1_369_480_Open_Image" onclick="this.style.display='none'; codehighlighter1_369_480_open_text.style.display="'none';" codehighlighter1_369_480_closed_image.style.display="'inline';" codehighlighter1_369_480_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_369_480_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_369_480_closed_text.style.display="'none';" codehighlighter1_369_480_open_image.style.display="'inline';" codehighlighter1_369_480_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;</span><span style="color: #0000ff;">foreach</span><span style="color: #000000;">&nbsp;(IList</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;tuple&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;py.Result)&nbsp;</span><span id="Codehighlighter1_369_480_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_369_480_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(tuple[</span><span style="color: #000000;">0</span><span style="color: #000000;">]);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(tuple[</span><span style="color: #000000;">1</span><span style="color: #000000;">]);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">&nbsp;}</span></span></div>
<p>PyFacade的代码如下。</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System.Collections.Generic;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;IronPython.Hosting;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><br><img id="Codehighlighter1_104_992_Open_Image" onclick="this.style.display='none'; codehighlighter1_104_992_open_text.style.display="'none';" codehighlighter1_104_992_closed_image.style.display="'inline';" codehighlighter1_104_992_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_104_992_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_104_992_closed_text.style.display="'none';" codehighlighter1_104_992_open_image.style.display="'inline';" codehighlighter1_104_992_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;Cavingdeep.Python&nbsp;</span><span id="Codehighlighter1_104_992_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_104_992_Open_Text"><span style="color: #000000;">{<br><img id="Codehighlighter1_134_990_Open_Image" onclick="this.style.display='none'; codehighlighter1_134_990_open_text.style.display="'none';" codehighlighter1_134_990_closed_image.style.display="'inline';" codehighlighter1_134_990_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_134_990_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_134_990_closed_text.style.display="'none';" codehighlighter1_134_990_open_image.style.display="'inline';" codehighlighter1_134_990_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;PyFacade</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_134_990_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_134_990_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;ResultVariableName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">_result_</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;PythonEngine&nbsp;engine&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PythonEngine();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;pythonFile;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Result</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Result</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;IDictionary</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;args&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Dictionary</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img id="Codehighlighter1_458_545_Open_Image" onclick="this.style.display='none'; codehighlighter1_458_545_open_text.style.display="'none';" codehighlighter1_458_545_closed_image.style.display="'inline';" codehighlighter1_458_545_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_458_545_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_458_545_closed_text.style.display="'none';" codehighlighter1_458_545_open_image.style.display="'inline';" codehighlighter1_458_545_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;PythonFile&nbsp;</span><span id="Codehighlighter1_458_545_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_458_545_Open_Text"><span style="color: #000000;">{<br><img id="Codehighlighter1_473_497_Open_Image" onclick="this.style.display='none'; codehighlighter1_473_497_open_text.style.display="'none';" codehighlighter1_473_497_closed_image.style.display="'inline';" codehighlighter1_473_497_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_473_497_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_473_497_closed_text.style.display="'none';" codehighlighter1_473_497_open_image.style.display="'inline';" codehighlighter1_473_497_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_473_497_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_473_497_Open_Text"><span style="color: #000000;">{</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pythonFile;}</span></span><span style="color: #000000;"><br><img id="Codehighlighter1_512_537_Open_Image" onclick="this.style.display='none'; codehighlighter1_512_537_open_text.style.display="'none';" codehighlighter1_512_537_closed_image.style.display="'inline';" codehighlighter1_512_537_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_512_537_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_512_537_closed_text.style.display="'none';" codehighlighter1_512_537_open_image.style.display="'inline';" codehighlighter1_512_537_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_512_537_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_512_537_Open_Text"><span style="color: #000000;">{</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pythonFile&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img id="Codehighlighter1_570_619_Open_Image" onclick="this.style.display='none'; codehighlighter1_570_619_open_text.style.display="'none';" codehighlighter1_570_619_closed_image.style.display="'inline';" codehighlighter1_570_619_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_570_619_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_570_619_closed_text.style.display="'none';" codehighlighter1_570_619_open_image.style.display="'inline';" codehighlighter1_570_619_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;T&nbsp;Result&nbsp;</span><span id="Codehighlighter1_570_619_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_570_619_Open_Text"><span style="color: #000000;">{<br><img id="Codehighlighter1_585_611_Open_Image" onclick="this.style.display='none'; codehighlighter1_585_611_open_text.style.display="'none';" codehighlighter1_585_611_closed_image.style.display="'inline';" codehighlighter1_585_611_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_585_611_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_585_611_closed_text.style.display="'none';" codehighlighter1_585_611_open_image.style.display="'inline';" codehighlighter1_585_611_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_585_611_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_585_611_Open_Text"><span style="color: #000000;">{</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.result.Value;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img id="Codehighlighter1_672_713_Open_Image" onclick="this.style.display='none'; codehighlighter1_672_713_open_text.style.display="'none';" codehighlighter1_672_713_closed_image.style.display="'inline';" codehighlighter1_672_713_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_672_713_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_672_713_closed_text.style.display="'none';" codehighlighter1_672_713_open_image.style.display="'inline';" codehighlighter1_672_713_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;IDictionary</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;Arguments&nbsp;</span><span id="Codehighlighter1_672_713_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_672_713_Open_Text"><span style="color: #000000;">{<br><img id="Codehighlighter1_687_705_Open_Image" onclick="this.style.display='none'; codehighlighter1_687_705_open_text.style.display="'none';" codehighlighter1_687_705_closed_image.style.display="'inline';" codehighlighter1_687_705_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_687_705_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_687_705_closed_text.style.display="'none';" codehighlighter1_687_705_open_image.style.display="'inline';" codehighlighter1_687_705_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_687_705_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_687_705_Open_Text"><span style="color: #000000;">{</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.args;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img id="Codehighlighter1_744_985_Open_Image" onclick="this.style.display='none'; codehighlighter1_744_985_open_text.style.display="'none';" codehighlighter1_744_985_closed_image.style.display="'inline';" codehighlighter1_744_985_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_744_985_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_744_985_closed_text.style.display="'none';" codehighlighter1_744_985_open_image.style.display="'inline';" codehighlighter1_744_985_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Execute()&nbsp;</span><span id="Codehighlighter1_744_985_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_744_985_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;engine.Globals[ResultVariableName]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.result;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img id="Codehighlighter1_870_930_Open_Image" onclick="this.style.display='none'; codehighlighter1_870_930_open_text.style.display="'none';" codehighlighter1_870_930_closed_image.style.display="'inline';" codehighlighter1_870_930_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_870_930_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_870_930_closed_text.style.display="'none';" codehighlighter1_870_930_open_image.style.display="'inline';" codehighlighter1_870_930_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">foreach</span><span style="color: #000000;">&nbsp;(KeyValuePair</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;arg&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.args)&nbsp;</span><span id="Codehighlighter1_870_930_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_870_930_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;engine.Globals[arg.Key]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;arg.Value;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;engine.ExecuteFile(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pythonFile);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"></span></div>
<p>Result的代码如下。</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><br><img id="Codehighlighter1_43_100_Open_Image" onclick="this.style.display='none'; codehighlighter1_43_100_open_text.style.display="'none';" codehighlighter1_43_100_closed_image.style.display="'inline';" codehighlighter1_43_100_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_43_100_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_43_100_closed_text.style.display="'none';" codehighlighter1_43_100_open_image.style.display="'inline';" codehighlighter1_43_100_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;Cavingdeep.Python&nbsp;</span><span id="Codehighlighter1_43_100_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_43_100_Open_Text"><span style="color: #000000;">{<br><img id="Codehighlighter1_71_98_Open_Image" onclick="this.style.display='none'; codehighlighter1_71_98_open_text.style.display="'none';" codehighlighter1_71_98_closed_image.style.display="'inline';" codehighlighter1_71_98_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_71_98_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_71_98_closed_text.style.display="'none';" codehighlighter1_71_98_open_image.style.display="'inline';" codehighlighter1_71_98_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Result</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_71_98_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_71_98_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;T&nbsp;Value;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"></span></div>
<p>mayorThenTen.py的代码如下，这是这个示例中用到的IronPython文件。</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;mayorThenTen(a,&nbsp;b):<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;[(x,&nbsp;y)&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;a&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;y&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;b&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;y&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">]<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;globals().has_key(</span><span style="color: #800000;">'</span><span style="color: #800000;">_result_</span><span style="color: #800000;">'</span><span style="color: #000000;">):<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;_result_.Value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;mayorThenTen(listA,&nbsp;listB)<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"></span></div>
<p>这里的这个PyFacade是个比较通用的与IronPython交互的接口类，在真正的应用中建议用强类型模式（<a href="http://www.cnblogs.com/cavingdeep/archive/2005/01/31/208952.html" target="_blank">强类型设计实践</a>）加以封装以得到type safety等好处。</p>
<p>关于PyFacade是如何与IronPython文件交互一题，简单地说就是通过那个<em>_result_</em>变量，它会在IronPython文件中被赋值，这个值是外界可见的，也就是说IronPython文件的执行与当前程序是在一个AppDomain中的。有关这类知识感兴趣的读者可以去研究一下动态编译、加载与程序域（AppDomain）等知识。</p><img src="http://www.cnblogs.com/cavingdeep/aggbug/464781.html?type=1" width="1" height="1" alt=""/><p>评论: 5　<a href="http://www.cnblogs.com/cavingdeep/archive/2006/08/01/464781.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/cavingdeep/archive/2006/08/01/464781.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Refactoring as a way to improve the existing design</title><link>http://www.cnblogs.com/cavingdeep/archive/2006/07/15/451195.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Sat, 15 Jul 2006 01:04:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2006/07/15/451195.html</guid><description><![CDATA[<p>阅读: 1053 评论: 1 作者: <a href="http://www.cnblogs.com/cavingdeep/" target="_blank">Cavingdeep</a> 发表于 2006-07-15 09:04 <a href="http://www.cnblogs.com/cavingdeep/archive/2006/07/15/451195.html" target="_blank">原文链接</a></p><p>Share with you a refactoring web site maintained by the mighty '<b>Martin Fowler</b>':<br><br><a href="http://www.refactoring.com/" target="_blank">http://www.refactoring.com/</a><br><br>You can find up to 93 refactoring methods in the catalog of this web site, 21 more than listed in book <i>&lt;Refactoring: Improve the Design of Existing Code&gt;</i>. Understanding the importance of refactoring can help you write robust and mantainable code, an essential weapon for today's agile business.<br></p><img src="http://www.cnblogs.com/cavingdeep/aggbug/451195.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/cavingdeep/archive/2006/07/15/451195.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/cavingdeep/archive/2006/07/15/451195.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>用metaclass来实现AOP</title><link>http://www.cnblogs.com/cavingdeep/archive/2006/04/28/387175.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Fri, 28 Apr 2006 01:05:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2006/04/28/387175.html</guid><description><![CDATA[<p>阅读: 1209 评论: 0 作者: <a href="http://www.cnblogs.com/cavingdeep/" target="_blank">Cavingdeep</a> 发表于 2006-04-28 09:05 <a href="http://www.cnblogs.com/cavingdeep/archive/2006/04/28/387175.html" target="_blank">原文链接</a></p><p>meta-programming是AOP实现的经常性手段，而这里要展示的，是利用Python的metaclass能力来实现 AOP。</p>
<p>当a的setx方法被调用时，会被&#8220;拦截&#8221;，先输出pre...然后是原始setx的方法调用，最后输出post...</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MetaAll(type):<br>&nbsp;&nbsp;&nbsp;def&nbsp;__new__(mcl,&nbsp;name,&nbsp;bases,&nbsp;dict):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;log(func):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;f(</span><span style="color: #000000;">*</span><span style="color: #000000;">args,&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">kwds):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">pre&nbsp;%s</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;func.__name__<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;func(</span><span style="color: #000000;">*</span><span style="color: #000000;">args,&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">kwds)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">post&nbsp;%s</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;func.__name__<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;value<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;f<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;attr,&nbsp;value&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;dict.iteritems():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;attr.startswith(</span><span style="color: #000000;">'</span><span style="color: #000000;">set</span><span style="color: #000000;">'</span><span style="color: #000000;">):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dict[attr]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;log(value)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;super(MetaAll,&nbsp;mcl).__new__(mcl,&nbsp;name,&nbsp;bases,&nbsp;dict)<br><br>__metaclass__&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;MetaAll<br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;A:<br>&nbsp;&nbsp;&nbsp;def&nbsp;__init__(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.__x&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;def&nbsp;getx(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;self.__x<br><br>&nbsp;&nbsp;&nbsp;def&nbsp;setx(self,&nbsp;value):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.__x&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value<br><br>a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;A()<br>a.setx(</span><span style="color: #000000;">2</span><span style="color: #000000;">)<br>print&nbsp;a.getx()</span></div>
<p>看到那个__metaclass__变量了吗？如果你赋给它另外一个metaclass的话它会产生其他效应（我这里做的是 logging，其他的可能有例如timing、access control、transaction, etc.），这是魔法！^_^ 最魔力十足的地方是我甚至可以把一个metaclass传进模块中去，给__metaclass__动态的赋值（赋metaclass），这意味着我可以通过meta-programming动态的改变我程序的逻辑，或者不需要改动原有代码即可添加新功能（或修改）等特点！</p>
<p>整个演示就当作抛砖引玉吧，代码我就不细讲了，因为概念太复杂了，不是一两句能说得明白的。有兴趣的朋友可以研究一下Python。; -)</p><img src="http://www.cnblogs.com/cavingdeep/aggbug/387175.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/cavingdeep/archive/2006/04/28/387175.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/cavingdeep/archive/2006/04/28/387175.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>不该用Generics实现Abstract Factory的理由</title><link>http://www.cnblogs.com/cavingdeep/archive/2006/03/24/357434.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Fri, 24 Mar 2006 02:24:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2006/03/24/357434.html</guid><description><![CDATA[<p>阅读: 1588 评论: 16 作者: <a href="http://www.cnblogs.com/cavingdeep/" target="_blank">Cavingdeep</a> 发表于 2006-03-24 10:24 <a href="http://www.cnblogs.com/cavingdeep/archive/2006/03/24/357434.html" target="_blank">原文链接</a></p><p>最近在与<a href="http://ninputer.cnblogs.com/" target=_blank>Ninputer</a>争执.NET与Java的泛型特点，他的意见是.NET的Generics要更强（实现层面与语法层面两个层面），我的意见是Java的Generics的语法层面要更强（语法层面的强主要是指易用性）。他让我看了一篇用.NET Generics实现的Abstract Factory的文章<a href="http://blog.joycode.com/ninputer/archive/2006/01/12/70313.aspx" target=_blank>http://blog.joycode.com/ninputer/archive/2006/01/12/70313.aspx</a>，说如果用Java就会遇到很多麻烦。因为我也是初学Java的Generics，所以比较感兴趣这个话题，看了一下文章后做了一些实现后得出了以下一些结论。</p>
<p><strong>该不该使用Generics实现Abstract Factory？</strong></p>
<p>我的意见是不应该，理由如下：</p>
<ol>
    <li>具体创建对象的时候，也就是在ConcreteFactory中，不是所有情况都是简单地一个new操作就算是创造对象了，就像它的名字所示那样，具体对象具体操作，这里不能泛化，一定要根据具体类型来实现对象创建。
    <li>就像许多人提到的，到底用多少个type variable才算合适呢？AbstractFactory&lt;A, B&gt;, AbstractFactory&lt;A, B, C&gt; ??? 简单地说，Abstract Factory是不能够定量的，目前.NET与Java的泛型都不能实现这点。 </li>
</ol>
<p><strong>Java的泛型真的那么弱吗？如果要实现定量的Abstract Factory真的很难吗？</strong></p>
<p>我的答案是否，实际上，我觉得用Java的语法无论在实现上的阅读与易用性都要比.NET的语法强。下面是我给出的Abstract Factory的实现，虽然我说过，用Generics实现Abstract Factory并不合适。</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_20_21_Open_Image onclick="this.style.display='none'; Codehighlighter1_20_21_Open_Text.style.display='none'; Codehighlighter1_20_21_Closed_Image.style.display='inline'; Codehighlighter1_20_21_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_20_21_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_20_21_Closed_Text.style.display='none'; Codehighlighter1_20_21_Open_Image.style.display='inline'; Codehighlighter1_20_21_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">interface</span><span style="COLOR: #000000">&nbsp;Processor&nbsp;</span><span id=Codehighlighter1_20_21_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_20_21_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_38_39_Open_Image onclick="this.style.display='none'; Codehighlighter1_38_39_Open_Text.style.display='none'; Codehighlighter1_38_39_Closed_Image.style.display='inline'; Codehighlighter1_38_39_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_38_39_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_38_39_Closed_Text.style.display='none'; Codehighlighter1_38_39_Open_Image.style.display='inline'; Codehighlighter1_38_39_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">interface</span><span style="COLOR: #000000">&nbsp;Ram&nbsp;</span><span id=Codehighlighter1_38_39_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_38_39_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_86_87_Open_Image onclick="this.style.display='none'; Codehighlighter1_86_87_Open_Text.style.display='none'; Codehighlighter1_86_87_Closed_Image.style.display='inline'; Codehighlighter1_86_87_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_86_87_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_86_87_Closed_Text.style.display='none'; Codehighlighter1_86_87_Open_Image.style.display='inline'; Codehighlighter1_86_87_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;PentiumProcessor&nbsp;</span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000">&nbsp;Processor&nbsp;</span><span id=Codehighlighter1_86_87_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_86_87_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_118_119_Open_Image onclick="this.style.display='none'; Codehighlighter1_118_119_Open_Text.style.display='none'; Codehighlighter1_118_119_Closed_Image.style.display='inline'; Codehighlighter1_118_119_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_118_119_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_118_119_Closed_Text.style.display='none'; Codehighlighter1_118_119_Open_Image.style.display='inline'; Codehighlighter1_118_119_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;DDRRam&nbsp;</span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000">&nbsp;Ram&nbsp;</span><span id=Codehighlighter1_118_119_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_118_119_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_156_192_Open_Image onclick="this.style.display='none'; Codehighlighter1_156_192_Open_Text.style.display='none'; Codehighlighter1_156_192_Closed_Image.style.display='inline'; Codehighlighter1_156_192_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_156_192_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_156_192_Closed_Text.style.display='none'; Codehighlighter1_156_192_Open_Image.style.display='inline'; Codehighlighter1_156_192_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">interface</span><span style="COLOR: #000000">&nbsp;AbstractFactory</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">PA,&nbsp;PB</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_156_192_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_156_192_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;PA&nbsp;createA();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;PB&nbsp;createB();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_267_456_Open_Image onclick="this.style.display='none'; Codehighlighter1_267_456_Open_Text.style.display='none'; Codehighlighter1_267_456_Closed_Image.style.display='inline'; Codehighlighter1_267_456_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_267_456_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_267_456_Closed_Text.style.display='none'; Codehighlighter1_267_456_Open_Image.style.display='inline'; Codehighlighter1_267_456_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;IntelFactory&nbsp;</span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000">&nbsp;AbstractFactory</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">PentiumProcessor,&nbsp;DDRRam</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_267_456_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_267_456_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_306_370_Open_Image onclick="this.style.display='none'; Codehighlighter1_306_370_Open_Text.style.display='none'; Codehighlighter1_306_370_Closed_Image.style.display='inline'; Codehighlighter1_306_370_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_306_370_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_306_370_Closed_Text.style.display='none'; Codehighlighter1_306_370_Open_Image.style.display='inline'; Codehighlighter1_306_370_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;PentiumProcessor&nbsp;createA()&nbsp;</span><span id=Codehighlighter1_306_370_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_306_370_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;一切特化且可在这里实现。</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;PentiumProcessor();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_400_454_Open_Image onclick="this.style.display='none'; Codehighlighter1_400_454_Open_Text.style.display='none'; Codehighlighter1_400_454_Closed_Image.style.display='inline'; Codehighlighter1_400_454_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_400_454_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_400_454_Closed_Text.style.display='none'; Codehighlighter1_400_454_Open_Image.style.display='inline'; Codehighlighter1_400_454_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;DDRRam&nbsp;createB()&nbsp;</span><span id=Codehighlighter1_400_454_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_400_454_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;一切特化且可在这里实现。</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;DDRRam();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;使用</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">AbstractFactory</span><span style="COLOR: #000000">&lt;?</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000">&nbsp;Processor,&nbsp;</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000">&nbsp;Ram</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;factory&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;IntelFactory();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>Processor&nbsp;processor&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;factory.createA();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>Ram&nbsp;ram&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;factory.createB();</span></div>
<p>以上代码并没有运用不必要的TypeToken，而且也没有实例化时特化的问题，但是仍然没有解决Abstract Factory的量的问题。可以看出，这段代码非常的简洁，我觉得这段代码真正突出了Generics的优点：<strong>泛化类型</strong>，而没有做不应该做的过多的事情（比如泛化本来应该是特化的东西）。</p>
<p>注意Java的Generics语法是可以使用wildcard的（?），这是.NET所没有的。wildcard的特点之一就是能够在变量声明中使用，这是很重要的一大特色。</p><img src="http://www.cnblogs.com/cavingdeep/aggbug/357434.html?type=1" width="1" height="1" alt=""/><p>评论: 16　<a href="http://www.cnblogs.com/cavingdeep/archive/2006/03/24/357434.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/cavingdeep/archive/2006/03/24/357434.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>新兴XML处理方法VTD-XML介绍</title><link>http://www.cnblogs.com/cavingdeep/archive/2006/03/15/350456.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Wed, 15 Mar 2006 03:49:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2006/03/15/350456.html</guid><description><![CDATA[<p>阅读: 4612 评论: 26 作者: <a href="http://www.cnblogs.com/cavingdeep/" target="_blank">Cavingdeep</a> 发表于 2006-03-15 11:49 <a href="http://www.cnblogs.com/cavingdeep/archive/2006/03/15/350456.html" target="_blank">原文链接</a></p><p><strong style="font-size: 14pt;">序言</strong> </p>
<p>本文所提及的<a href="http://vtd-xml.sourceforge.net/" target="_blank">VTD-XML</a>并非本文作者原创，作者只是对它进行介绍。 </p>
<p><strong style="font-size: 14pt;">问题</strong> </p>
<p>通常当我们提起XML的使用时，最头痛的部分便是XML的verbosity与XML的解析速度，当需要处理大XML文件时这个问题便变得格外严重。我在这里提及的，便是如何优化XML处理速度的话题。 <br><br>当我们选择处理XML文件的时候，我们大致上有两种选择： </p>
<ol>
    <li>DOM，这是W3C的标准模型，它将XML的结构信息以树形的方式构建，提供了遍历这颗树的接口与方法。 </li>
    <li>SAX，一种低级的parser，逐元素的向前只读处理，不含有结构信息。</li>
</ol>
<p>以上两种选择都各有利弊，但是都不是特别好的解决方案，它们的优缺点如下： </p>
<p>DOM</p>
<ol>
    <li>优点：易用性强，因为所有的XML结构信息都存在于内存中，并且遍历简单，支持XPath。 </li>
    <li>缺点：Parsing速度太慢，内存占用过高（原文件的5x~10x），对于大文件来说几乎不可能使用。</li>
</ol>
<p>SAX </p>
<ol>
    <li>优点：Parsing速度快，内存占用不与XML的大小相联系（可以做到XML涨内存不涨）。 </li>
    <li>缺点：易用性差，因为没有结构信息，并且无法遍历，不支持XPath。如果需要结构的话只能读一点构造一点，这样的可维护性特别的差。</li>
</ol>
<p>我们可以看出，基本上DOM与SAX是正好相反的两个极端，但是任何一个都不能很好的满足我们的大部分要求，我们需要找出另外一种处理方法来。注意XML的效率问题并不是XML本身的问题，而是处理XML的Parser的问题，就像我们在上面看到的两种方法有不同的效率权衡一样。 </p>
<p><strong style="font-size: 14pt;">思考</strong> </p>
<p>我们很喜欢类似DOM的使用方法，因为我们可以遍历，这意味着可以支持XPath，大大增强了易用性，但是DOM的效率很低。就像我们已经知道，效率问题出在处理机制上。那么，DOM到底有哪些方面影响了它的效率呢？下面让我们来做一个全面的解剖：</p>
<ol>
    <li>在当今大多数基于虚拟机（托管，或任何类似机制）技术的平台下，对象的创建销毁是一个耗时的作业（这里值得主要是Garbage Collection的耗时），DOM机制中所运用的大量的对象创建销毁无疑是影响其效率的原因之一（会引发过多的Garbage Collection）。 </li>
    <li>每个对象都会额外有32bits用来存储它的内存地址，当像DOM一样拥有大量对象的时候这个额外开支也是不小的。 </li>
    <li>引起以上两个问题的最主要的效率问题在于，DOM与SAX都是extractive parsing模式，这种解析模式注定了DOM与SAX都需要大量的创建（销毁）对象，引起效率问题。所谓的extractive parsing就是说在解析XML时，DOM或SAX会提取一部分原文件（一般来说是一个字符串），然后在内存中进行解析构建（输出自然就是一个或一些对象了）。拿DOM这个例子来说，DOM会将每一个element, attribute, processing-instruction, comment等等都解析成对象并给与结构，这就是所谓的extractive parsing。 </li>
    <li>由extractive的问题带来的另一个问题便是更新效率，在DOM中（SAX因为不支持更新所以根本不提它），每一次需要做改动时，我们要做的就是将对象的信息再解析回XML的字符串，注意这个解析是个完整的解析，也就是说，原文件并没有被利用，而是直接将DOM模型重新完整解析成XML字符串。换句话讲，也就是DOM并不支持Incremental Update（增量更新）。 </li>
    <li>另一个很可能不被注意到的&#8220;小&#8221;问题便是XML的编码，无论是何种解析方法都需要能够处理XML的编码，也就是说，在读取的时候解码，在写入的时候编码。DOM的另一个效率问题便是当我对于一个大XML只想做很小的一块儿修改的时候它也必须首先将整个文件进行解码，然后构建结构。无形中又是一个开销。</li>
</ol>
<p>让我们来总结一下问题，简单的讲DOM的效率问题主要出在它的extractive parsing模式上（SAX也是一样，有同样的问题），由此引发了一系列相关问题，如果可以击破这些效率瓶颈的话那么可以想象XML的处理效率将进一步的得到提高。如果XML的易用性与处理效率得到飞跃性的提高的话，那么XML的应用范围，应用模式将得到更一步的升华，或许由此可以产生出许许多多精彩的以前连想都没有想过的基于XML的产品来。</p>
<p><strong style="font-size: 14pt;">出路</strong> </p>
<p><a href="http://vtd-xml.sourceforge.net/" target="_blank">VTD-XML</a>便是对以上问题的思考后给出的答案，它是一个non-extractive XML parser，由于它出色的机制，很好的解决（避免）了上面所提出的各种问题，并且还&#8220;顺便&#8221;带来了non-extractive的其他好处，像快速的解析与遍历、XPath的支持、Incremental Update等等。我这里有一组数据，取自于VTD-XML的官方网站： </p>
<ol>
    <li>VTD-XML的解析速度是SAX（with NULL content handler）的1.5x~2.0x。With NULL content handler的意思就是说SAX解析中没有插入任何额外的处理逻辑，也就是SAX的最高速度。 </li>
    <li>VTD-XML的内存占用是原XML的1.3x~1.5x（其中1.0x的部分是原XML，0.3x~0.5x是VTD-XML占用的部分），而DOM的内存占用则是原XML的5x~10x。举一个例子，如果一个XML的大小是50MB，那么用VTD-XML读取进来内存占用会在 65MB~75MB之间，而DOM的内存占用则会在250M~500MB之间。基于这个数据用DOM处理大的XML文件几乎是不可能的选择。&lt; /li&gt; </li>
</ol>
<p>你可能会觉得不可思议，真的可以做出比DOM易用性还好，比SAX还快的XML解析器吗？别急着下定论，还是来看看VTD-XML的原理吧！</p>
<p><strong style="font-size: 14pt;">基本原理</strong> </p>
<p>就像大多数好的产品一样，VTD-XML的原理并不复杂，而是很巧妙。为了实现non-extractive这个目的，它将原XML文件原封不动的以二进制的方式读进内存，连解码都不做，然后在这个byte数组上解析每个element的位置并把一些信息记录下来，之后的遍历操作便在这些保存下来的record上进行，如果需要提取XML内容就利用record中的位置等信息在原始byte数组上进行解码并返回字符串。这一切看起来都很简单，但是，这个简单的过程确有多个性能细节在里边，并且隐藏了若干个潜在的能力。下面我们首先来描述一下各个性能细节：</p>
<ol>
    <li>为了避免过多的对象创建，VTD-XML决定采用原始的数值类型作为record的类型，这样就可以不必用heap。VTD-XML 的record机制就叫做VTD（Virtual Token Descriptor），VTD将性能瓶颈在tokenization阶段就解决掉了真的是很巧妙很用心的做法。VTD是一个64bits长度的数值类型，记录了每个element的起始位置（offset），长度（length），深度（depth）以及token的类型（type）等信息。 </li>
    <li>注意VTD是固定长度的（官方决定用64bits），这样做的目的就是为了提高性能，因为长度固定，在读取，查询等操作的时候格外的高效（O(1)），也就是可以用数组这种高效的结构来组织VTD大大减少了因为大量使用对象而产生的性能问题。 </li>
    <li>VTD的超能力（一点都不夸张地说）就在于它能够将XML这种树形的数据结构简单的变换成对一个byte数组的操作，任何你能想象到的对于byte数组的操作都可以应用在XML上了。这是因为读取进来的XML是二进制的（byte数组），而VTD则记录了每个element的位置等访问用信息，当我们找到要操作的VTD的时候，只要用offset与length等信息就可以对原始byte数组进行任何操作，或者可以直接对VTD进行操作。举例来说，我想在一个大XML中找出一个element并删除它，那么我只需要找到这个element的VTD（遍历方法稍候再讲），将这个VTD从 VTD数组中删除，然后再利用所有的VTD写出到另一个byte数组中就可以了，因为删除的VTD标明了要删除的element的位置，所以在新写入的 byte数组中就不会出现这段element了，用VTD 写入新的byte数组实际上就是一个byte数组的拷贝，其效率相当的高，这就是所谓的增量更新（incremental update）。</li>
</ol>
<p>关于VTD-XML的遍历方式，它采用了LC (Location Cache)，简单地说就是将VTD以其深度作为标准构建的一个树形的表结构。LC的entry也是64bits长的数值类型，前32bits代表一个 VTD的索引（index），后32bits代表了这个VTD的第一个child的索引。利用这些信息就可以计算出任何一个你想要到达的位置了，关于具体的遍历方法请参看官方网站的文章。基于这种遍历方式的VTD-XML有与DOM不同的操作接口，这是可以理解的，并且，VTD-XML的这种遍历方式可以在最少的几步内将你带到你所需要的地方去，遍历的性能十分突出。</p>
<p><strong style="font-size: 14pt;">总结</strong> </p>
<p>就像你上面看到的，VTD-XML有着迷人的特性，而如今的1.5版本中已经加入了XPath的支持（只要可以遍历，就可以支持 XPath，这是早晚的事:-)），它的实用性已经超越了当今我们所想象的范围了。另一个VTD-XML的超能力，就是基于它现在的处理方式，完全可以支持将来的Binary XML标准，并通过Binary化将XML的应用推向更高一层楼！这也是我目前所期待的！:-)</p>
<p>不过，VTD-XML仍然有许多需要改进与完善的地方，这方面值得我们努力与探讨。</p>
<p>顺便提一下，VTD-XML是开源项目（GPL），目前有Java、C两种平台支持。如果你想在.NET试一试的话建议你使用<a href="http://www.ikvm.net/" target="_blank">IKVM</a>（BSD style license）将VTD-XML转换成.NET程序集，相信你会喜欢上它的！;-) </p><img src="http://www.cnblogs.com/cavingdeep/aggbug/350456.html?type=1" width="1" height="1" alt=""/><p>评论: 26　<a href="http://www.cnblogs.com/cavingdeep/archive/2006/03/15/350456.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/cavingdeep/archive/2006/03/15/350456.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Performance Tips I</title><link>http://www.cnblogs.com/cavingdeep/archive/2005/12/16/298448.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Fri, 16 Dec 2005 05:39:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2005/12/16/298448.html</guid><description><![CDATA[<p>阅读: 1538 评论: 21 作者: <a href="http://www.cnblogs.com/cavingdeep/" target="_blank">Cavingdeep</a> 发表于 2005-12-16 13:39 <a href="http://www.cnblogs.com/cavingdeep/archive/2005/12/16/298448.html" target="_blank">原文链接</a></p><P>假如所有的人都很在意高性能代码的话，那么我的这篇Blog就没有意义了。我希望能够给出一些有意义的性能提示，这些是我们日常编码工作中总会碰到的，所以对这些小tips漠不关心只会日益加深对你代码的伤害，而且做Review的时候也会很不体面，老实说，一个人写的代码确切地反映了这个人的能力与个性，对于经常看不同代码的我们来说，这并不是胡说的，我们有确切的体会。</P>
<P>首先值得一提的是，如果你的程序有性能问题，请不要首先在代码中找，因为一般情况下，大的性能问题都发生在架构与设计上，架构与设计的性能问题是在代码层次解决不了的，影响面也很广。这篇文章不会告诉你如何在架构与设计中找性能问题，或者架构与设计的性能提示。这篇文章只是在编码层次上给这个层次的性能提示，虽然比不上架构与设计的性能优化，但是如果不注意也还是会带来显著的性能影响的。</P>
<P>我会以总结的方式列出每条我能想到的性能提示来，并解析为什么会这样，希望对读者有用。</P>
<P><STRONG><U>Resource Management（资源管理）</U></STRONG> </P>作为任何一个程序，都需要考虑它所能使用的资源界限以及它目前使用的资源状况。假设一个程序只被允许使用100MB内存，但是它在执行某个大任务时内存占用却达到了400MB，那么这时你就会发现你有个不得不解决的大问题。任何硬件的资源都是有限的（不要跟我说SETI，没有几个程序是SETI类型的），作为程序，如何利用好这些有限的资源达到目的是任何一个开发人员不得不考虑的（不管你是架构师、设计师还是纯粹的Developer）。首先我们要知道所谓的资源其实可以分为几大类： 
<OL>
<LI>CPU 
<LI>Memory 
<LI>Disk I/O 
<LI>Network I/O</LI></OL>
<P>为了有效的利用这些有限的资源，我们有时不得不针对资源管理做一些优化，下面的这些便是一些相关的tips。可能你会问：&#8220;资源的管理.NET下不是自动的嘛，不是有GC的嘛&#8221;，没错，GC是做资源管理的，但是这并不代表有GC我们就不用注意资源的使用了，因为GC的行为是固定的，所以我们可以针对GC的行为来为它优化。下面会有几条tips谈到。</P>
<P><STRONG>只在你真正需要时分配内存。</STRONG> </P>
<P>为什么：</P>
<P>内存的过早分配会造成不必要的效率损失以及资源紧缺或者浪费。</P>
<P>不好的做法：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG id=Codehighlighter1_41_177_Open_Image onclick="this.style.display='none'; Codehighlighter1_41_177_Open_Text.style.display='none'; Codehighlighter1_41_177_Closed_Image.style.display='inline'; Codehighlighter1_41_177_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_41_177_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_41_177_Closed_Text.style.display='none'; Codehighlighter1_41_177_Open_Image.style.display='inline'; Codehighlighter1_41_177_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;Result&nbsp;Divide(</SPAN><SPAN style="COLOR: #0000ff">double</SPAN><SPAN style="COLOR: #000000">&nbsp;a,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">double</SPAN><SPAN style="COLOR: #000000">&nbsp;b)&nbsp;</SPAN><SPAN id=Codehighlighter1_41_177_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_41_177_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Result对象过早的分配，当a/b发生异常时 <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;这个对象就白分配了，因为这个对象只有被 <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;方法返回才有意义。</SPAN><SPAN style="COLOR: #008000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;Result&nbsp;r&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Result(); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;r.Value&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;a&nbsp;</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">&nbsp;b; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;r; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>}</SPAN></SPAN> </DIV>
<P>好的做法：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG id=Codehighlighter1_41_131_Open_Image onclick="this.style.display='none'; Codehighlighter1_41_131_Open_Text.style.display='none'; Codehighlighter1_41_131_Closed_Image.style.display='inline'; Codehighlighter1_41_131_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_41_131_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_41_131_Closed_Text.style.display='none'; Codehighlighter1_41_131_Open_Image.style.display='inline'; Codehighlighter1_41_131_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;Result&nbsp;Divide(</SPAN><SPAN style="COLOR: #0000ff">double</SPAN><SPAN style="COLOR: #000000">&nbsp;a,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">double</SPAN><SPAN style="COLOR: #000000">&nbsp;b)&nbsp;</SPAN><SPAN id=Codehighlighter1_41_131_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_41_131_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">double</SPAN><SPAN style="COLOR: #000000">&nbsp;value&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;a&nbsp;</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">&nbsp;b; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;Result&nbsp;r&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Result(); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;r.Value&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;value; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;r; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>}</SPAN></SPAN> </DIV>
<P><STRONG>尽可能早的释放资源。</STRONG> </P>
<P>为什么：</P>
<P>对于你已经确定不再需要的对象如果不尽早对其释放就有可能造成不必要的资源紧缺。</P>
<P>不好的做法：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG id=Codehighlighter1_18_354_Open_Image onclick="this.style.display='none'; Codehighlighter1_18_354_Open_Text.style.display='none'; Codehighlighter1_18_354_Closed_Image.style.display='inline'; Codehighlighter1_18_354_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_18_354_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_18_354_Closed_Text.style.display='none'; Codehighlighter1_18_354_Open_Image.style.display='inline'; Codehighlighter1_18_354_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Foo()&nbsp;</SPAN><SPAN id=Codehighlighter1_18_354_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_18_354_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">connection.Open(); <BR><IMG id=Codehighlighter1_54_306_Open_Image onclick="this.style.display='none'; Codehighlighter1_54_306_Open_Text.style.display='none'; Codehighlighter1_54_306_Closed_Image.style.display='inline'; Codehighlighter1_54_306_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_54_306_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_54_306_Closed_Text.style.display='none'; Codehighlighter1_54_306_Open_Image.style.display='inline'; Codehighlighter1_54_306_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_54_306_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_54_306_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Data&nbsp;operations<IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;PostProcessing并不涉及数据库连接的使用， <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;在处理PostProcessing的时候，一个宝贵的 <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;数据库连接资源就被这样白白的浪费了，如果 <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;这时有其他需要数据库连接的操作而它又 <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;没有可用连接那么就会引发timeout等等因数据库 <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;连接不足而产生的各种问题。</SPAN><SPAN style="COLOR: #008000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">PostProcessing(); <BR><IMG id=Codehighlighter1_316_352_Open_Image onclick="this.style.display='none'; Codehighlighter1_316_352_Open_Text.style.display='none'; Codehighlighter1_316_352_Closed_Image.style.display='inline'; Codehighlighter1_316_352_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_316_352_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_316_352_Closed_Text.style.display='none'; Codehighlighter1_316_352_Open_Image.style.display='inline'; Codehighlighter1_316_352_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">finally</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_316_352_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_316_352_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">connection.Close(); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>}</SPAN></SPAN> </DIV>
<P>好的做法：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG id=Codehighlighter1_18_163_Open_Image onclick="this.style.display='none'; Codehighlighter1_18_163_Open_Text.style.display='none'; Codehighlighter1_18_163_Closed_Image.style.display='inline'; Codehighlighter1_18_163_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_18_163_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_18_163_Closed_Text.style.display='none'; Codehighlighter1_18_163_Open_Image.style.display='inline'; Codehighlighter1_18_163_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Foo()&nbsp;</SPAN><SPAN id=Codehighlighter1_18_163_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_18_163_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">connection.Open(); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top> <BR><IMG id=Codehighlighter1_55_88_Open_Image onclick="this.style.display='none'; Codehighlighter1_55_88_Open_Text.style.display='none'; Codehighlighter1_55_88_Closed_Image.style.display='inline'; Codehighlighter1_55_88_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_55_88_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_55_88_Closed_Text.style.display='none'; Codehighlighter1_55_88_Open_Image.style.display='inline'; Codehighlighter1_55_88_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_55_88_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_55_88_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Data&nbsp;operations<IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN style="COLOR: #008000"> <BR><IMG id=Codehighlighter1_98_134_Open_Image onclick="this.style.display='none'; Codehighlighter1_98_134_Open_Text.style.display='none'; Codehighlighter1_98_134_Closed_Image.style.display='inline'; Codehighlighter1_98_134_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_98_134_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_98_134_Closed_Text.style.display='none'; Codehighlighter1_98_134_Open_Image.style.display='inline'; Codehighlighter1_98_134_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">finally</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_98_134_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_98_134_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">connection.Close(); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">PostProcessing(); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>}</SPAN></SPAN> </DIV>
<P><STRONG>不要使用Finalizer，除非是为了确保关键资源的正确释放。</STRONG> </P>
<P>为什么：</P>
<P>有Finalizer的对象需要两次GC才能被彻底回收，影响内存回收效率，第一次GC会执行Finalizer，第二次才会释放对象所占用的内存空间。</P>
<P>不好的做法：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG id=Codehighlighter1_11_51_Open_Image onclick="this.style.display='none'; Codehighlighter1_11_51_Open_Text.style.display='none'; Codehighlighter1_11_51_Closed_Image.style.display='inline'; Codehighlighter1_11_51_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_11_51_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_11_51_Closed_Text.style.display='none'; Codehighlighter1_11_51_Open_Image.style.display='inline'; Codehighlighter1_11_51_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><SPAN style="COLOR: #000000">~</SPAN><SPAN style="COLOR: #000000">MyClass()&nbsp;</SPAN><SPAN id=Codehighlighter1_11_51_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_11_51_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;影响资源回收的速度。</SPAN><SPAN style="COLOR: #008000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;instanceNumber</SPAN><SPAN style="COLOR: #000000">--</SPAN><SPAN style="COLOR: #000000">; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>}</SPAN></SPAN> </DIV>
<P>好的做法：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width=11 align=top><SPAN style="COLOR: #000000">不声明Finalizer。</SPAN> </DIV>
<P><STRONG>对于拥有非托管资源的对象，一定要实现Disposable模式。</STRONG> </P>
<P>为什么：</P>实现了整个Disposable模式才能确保非托管资源会被正确释放（非托管资源不受GC管理，需手动释放），并且提供了手动释放的方法。 
<P>不好的做法：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width=11 align=top><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;拥有文件系统这种非托管资源，但是没有 <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;定义关闭这个非托管资源的方法。</SPAN><SPAN style="COLOR: #008000"> <BR><IMG id=Codehighlighter1_56_152_Open_Image onclick="this.style.display='none'; Codehighlighter1_56_152_Open_Text.style.display='none'; Codehighlighter1_56_152_Closed_Image.style.display='inline'; Codehighlighter1_56_152_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_56_152_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_56_152_Closed_Text.style.display='none'; Codehighlighter1_56_152_Open_Image.style.display='inline'; Codehighlighter1_56_152_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;TextFile&nbsp;</SPAN><SPAN id=Codehighlighter1_56_152_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_56_152_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;FileStream&nbsp;fileStream; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp; <BR><IMG id=Codehighlighter1_124_139_Open_Image onclick="this.style.display='none'; Codehighlighter1_124_139_Open_Text.style.display='none'; Codehighlighter1_124_139_Closed_Image.style.display='inline'; Codehighlighter1_124_139_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_124_139_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_124_139_Closed_Text.style.display='none'; Codehighlighter1_124_139_Open_Image.style.display='inline'; Codehighlighter1_124_139_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;ReadLine()&nbsp;</SPAN><SPAN id=Codehighlighter1_124_139_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_124_139_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;<IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>}</SPAN></SPAN> </DIV>
<P>好的做法：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG id=Codehighlighter1_29_750_Open_Image onclick="this.style.display='none'; Codehighlighter1_29_750_Open_Text.style.display='none'; Codehighlighter1_29_750_Closed_Image.style.display='inline'; Codehighlighter1_29_750_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_29_750_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_29_750_Closed_Text.style.display='none'; Codehighlighter1_29_750_Open_Image.style.display='inline'; Codehighlighter1_29_750_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;TextFile&nbsp;:&nbsp;IDisposable&nbsp;</SPAN><SPAN id=Codehighlighter1_29_750_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_29_750_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;FileStream&nbsp;fileStream; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp; <BR><IMG id=Codehighlighter1_97_112_Open_Image onclick="this.style.display='none'; Codehighlighter1_97_112_Open_Text.style.display='none'; Codehighlighter1_97_112_Closed_Image.style.display='inline'; Codehighlighter1_97_112_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_97_112_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_97_112_Closed_Text.style.display='none'; Codehighlighter1_97_112_Open_Image.style.display='inline'; Codehighlighter1_97_112_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;ReadLine()&nbsp;</SPAN><SPAN id=Codehighlighter1_97_112_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_97_112_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;<IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp; <BR><IMG id=Codehighlighter1_154_185_Open_Image onclick="this.style.display='none'; Codehighlighter1_154_185_Open_Text.style.display='none'; Codehighlighter1_154_185_Closed_Image.style.display='inline'; Codehighlighter1_154_185_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_154_185_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_154_185_Closed_Text.style.display='none'; Codehighlighter1_154_185_Open_Image.style.display='inline'; Codehighlighter1_154_185_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Dispose()&nbsp;</SPAN><SPAN id=Codehighlighter1_154_185_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_154_185_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.Dispose(</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp; <BR><IMG id=Codehighlighter1_241_695_Open_Image onclick="this.style.display='none'; Codehighlighter1_241_695_Open_Text.style.display='none'; Codehighlighter1_241_695_Closed_Image.style.display='inline'; Codehighlighter1_241_695_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_241_695_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_241_695_Closed_Text.style.display='none'; Codehighlighter1_241_695_Open_Image.style.display='inline'; Codehighlighter1_241_695_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">protected</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Dispose(</SPAN><SPAN style="COLOR: #0000ff">bool</SPAN><SPAN style="COLOR: #000000">&nbsp;disposing)&nbsp;</SPAN><SPAN id=Codehighlighter1_241_695_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_241_695_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG id=Codehighlighter1_264_556_Open_Image onclick="this.style.display='none'; Codehighlighter1_264_556_Open_Text.style.display='none'; Codehighlighter1_264_556_Closed_Image.style.display='inline'; Codehighlighter1_264_556_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_264_556_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_264_556_Closed_Text.style.display='none'; Codehighlighter1_264_556_Open_Image.style.display='inline'; Codehighlighter1_264_556_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(disposing)&nbsp;</SPAN><SPAN id=Codehighlighter1_264_556_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_264_556_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;在这儿清理一切托管的与Disposable的托管 <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;成员。</SPAN><SPAN style="COLOR: #008000"> <BR><IMG id=Codehighlighter1_357_441_Open_Image onclick="this.style.display='none'; Codehighlighter1_357_441_Open_Text.style.display='none'; Codehighlighter1_357_441_Closed_Image.style.display='inline'; Codehighlighter1_357_441_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_357_441_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_357_441_Closed_Text.style.display='none'; Codehighlighter1_357_441_Open_Image.style.display='inline'; Codehighlighter1_357_441_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.fileStream&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_357_441_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_357_441_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.fileStream.Close(); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.fileStream&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;因为我们已经显示地清理了资源，所以不再需要 <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Finalizer了，有它会影响效率。</SPAN><SPAN style="COLOR: #008000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GC.SupressFinalize(); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;在这儿清理一切非托管资源。 <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;如果有基类，应在这里调用基类的Dispose。这样做 <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;是因为清理顺序应该是首先清理自身的一切资源， <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;然后基类清理自身的一切资源，依此类推。</SPAN><SPAN style="COLOR: #008000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp; <BR><IMG id=Codehighlighter1_716_748_Open_Image onclick="this.style.display='none'; Codehighlighter1_716_748_Open_Text.style.display='none'; Codehighlighter1_716_748_Closed_Image.style.display='inline'; Codehighlighter1_716_748_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_716_748_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_716_748_Closed_Text.style.display='none'; Codehighlighter1_716_748_Open_Image.style.display='inline'; Codehighlighter1_716_748_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">~</SPAN><SPAN style="COLOR: #000000">TextFile()&nbsp;</SPAN><SPAN id=Codehighlighter1_716_748_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_716_748_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.Dispose(</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>}</SPAN></SPAN> </DIV>
<P><STRONG>在Dispose方法中调用GC.SupressFinalize。</STRONG> </P>
<P>为什么：</P>
<P>就像前面提到的，有Finalizer会影响回收效率，既然你都已经手动Dispose了，那么干吗还要Finalizer呢（注意Finalizer的作用应该限制在调用Dispose上）？</P>
<P>不好的做法：</P>
<P>请参照上一示例。</P>
<P>好的做法：</P>
<P>请参照上一示例。</P>
<P><STRONG>避免延长存活期短的对象的寿命。</STRONG> </P>
<P>为什么：</P>
<P>存活期短的对象会被GC优先回收，回收的效率更高。如果无谓的延长它的寿命的话再次回收它时效率会更低，而且它也会被更慢的回收。GC回收时是按照generation来回收，新创建的对象都在generation 0中，GC回收时先回收generation 0中的对象，如果回收到足够的空间那么将不再继续回收，如果不够再在generation 1中回收，依此类推，最高的generation是2，每次回收后存活下来的对象将升至更高级别的generation，从0到1再到2。寿命短的对象很自然的会在generation 0中回收，但如果延长它的寿命的话它就很可能会升至generation 1，这样一来就没有generation 0的回收效率了。</P>
<P>不好的做法：</P>
<P></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG id=Codehighlighter1_18_286_Open_Image onclick="this.style.display='none'; Codehighlighter1_18_286_Open_Text.style.display='none'; Codehighlighter1_18_286_Closed_Image.style.display='inline'; Codehighlighter1_18_286_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_18_286_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_18_286_Closed_Text.style.display='none'; Codehighlighter1_18_286_Open_Image.style.display='inline'; Codehighlighter1_18_286_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Foo()&nbsp;</SPAN><SPAN id=Codehighlighter1_18_286_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cnblogs.com/Images/dot.gif"></SPAN><SPAN id=Codehighlighter1_18_286_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;lines&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">;<BR><IMG id=Codehighlighter1_75_259_Open_Image onclick="this.style.display='none'; Codehighlighter1_75_259_Open_Text.style.display='none'; Codehighlighter1_75_259_Closed_Image.style.display='inline'; Codehighlighter1_75_259_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_75_259_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_75_259_Closed_Text.style.display='none'; Codehighlighter1_75_259_Open_Image.style.display='inline'; Codehighlighter1_75_259_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">10</SPAN><SPAN style="COLOR: #000000">;&nbsp;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_75_259_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cnblogs.com/Images/dot.gif"></SPAN><SPAN id=Codehighlighter1_75_259_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;每次lines的临时内容都不能第一次就被<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;回收，因为lines有引用，所以这个临时对象<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;会被promote为更高的generation，这样无形<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;中就对GC的工作压力产生了巨大的影响。</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lines&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Line&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;Environment.NewLine;<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;Console.Write(lines);<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN></DIV>
<P></P>
<P>好的做法：</P>
<P>在这个特殊的例子中应使用StringBuilder避免临时对象的产生。</P>
<P><STRONG>注意字符串连接的做法。</STRONG> </P>
<P>为什么：</P>
<P>不同的字符串连接需采用不同的方法，这样才能达到不损伤性能。有以下几种情况：</P>
<OL>
<LI>连接string literal：采用+符号连接，编译时编译器会将这些被连接的literals自动写成一个literal。 
<LI>一次性连接已知数量的literal与/或变量：采用+符号连接，因为这个连接其实只是一个String.Concat，没有临时对象产生。 
<LI>多次连接或者连接未知数量的literal或变量：采用StringBuilder来追加内容，避免临时对象的产生。</LI></OL>
<P>不好的做法：</P>
<P></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG id=Codehighlighter1_11_1083_Open_Image onclick="this.style.display='none'; Codehighlighter1_11_1083_Open_Text.style.display='none'; Codehighlighter1_11_1083_Closed_Image.style.display='inline'; Codehighlighter1_11_1083_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_11_1083_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_11_1083_Closed_Text.style.display='none'; Codehighlighter1_11_1083_Open_Image.style.display='inline'; Codehighlighter1_11_1083_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Foo()&nbsp;</SPAN><SPAN id=Codehighlighter1_11_1083_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_11_1083_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Case&nbsp;1.&nbsp;连接literals使用StringBuilder <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;要比用+号性能低很多。</SPAN><SPAN style="COLOR: #008000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;builder&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;StringBuilder(); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;builder.Append(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">This&nbsp;is&nbsp;a&nbsp;very&nbsp;very&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;builder.Append(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">very&nbsp;very&nbsp;very&nbsp;very&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;builder.Append(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">very&nbsp;very&nbsp;very&nbsp;very&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;builder.Append(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">very&nbsp;very&nbsp;very&nbsp;very&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;builder.Append(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">long&nbsp;string&nbsp;literal</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;Console.Write(builder.ToString()); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Case&nbsp;2.&nbsp;一次性连接已知数量就足够的情况下 <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;就不必使用StringBuilder了。</SPAN><SPAN style="COLOR: #008000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;builder2&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;StringBuilder(); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;builder2.Append(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Literal&nbsp;variable&nbsp;newline</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;builder2.Append(tempVar); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;builder2.Append(Environment.NewLine); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;Console.Write(builder2.ToString()); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Case&nbsp;3.1.&nbsp;这里每次+=都会产生两个临时字符串 <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;对象，大大增加了GC的负担，严重影响了效率。</SPAN><SPAN style="COLOR: #008000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;lines&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">; <BR><IMG id=Codehighlighter1_761_816_Open_Image onclick="this.style.display='none'; Codehighlighter1_761_816_Open_Text.style.display='none'; Codehighlighter1_761_816_Closed_Image.style.display='inline'; Codehighlighter1_761_816_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_761_816_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_761_816_Closed_Text.style.display='none'; Codehighlighter1_761_816_Open_Image.style.display='inline'; Codehighlighter1_761_816_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">10</SPAN><SPAN style="COLOR: #000000">;&nbsp;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_761_816_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_761_816_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lines&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Line&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;Environment.NewLine; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;Console.Write(lines); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Case&nbsp;3.2.&nbsp;这里每次Append时会由+引起临时字符串 <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;对象，影响效率。</SPAN><SPAN style="COLOR: #008000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;builder&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;StringBuilder(); <BR><IMG id=Codehighlighter1_981_1043_Open_Image onclick="this.style.display='none'; Codehighlighter1_981_1043_Open_Text.style.display='none'; Codehighlighter1_981_1043_Closed_Image.style.display='inline'; Codehighlighter1_981_1043_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_981_1043_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_981_1043_Closed_Text.style.display='none'; Codehighlighter1_981_1043_Open_Image.style.display='inline'; Codehighlighter1_981_1043_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">10</SPAN><SPAN style="COLOR: #000000">;&nbsp;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_981_1043_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_981_1043_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.Append(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Line&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;Environment.NewLine); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;Console.Write(builder.ToString()); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>}</SPAN></SPAN> </DIV>
<P>好的做法：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG id=Codehighlighter1_11_609_Open_Image onclick="this.style.display='none'; Codehighlighter1_11_609_Open_Text.style.display='none'; Codehighlighter1_11_609_Closed_Image.style.display='inline'; Codehighlighter1_11_609_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_11_609_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_11_609_Closed_Text.style.display='none'; Codehighlighter1_11_609_Open_Image.style.display='inline'; Codehighlighter1_11_609_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Foo()&nbsp;</SPAN><SPAN id=Codehighlighter1_11_609_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_11_609_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Case&nbsp;1.</SPAN><SPAN style="COLOR: #008000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;longLiteral&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">This&nbsp;is&nbsp;a&nbsp;very&nbsp;very&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">very&nbsp;very&nbsp;very&nbsp;very&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">very&nbsp;very&nbsp;very&nbsp;very&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">very&nbsp;very&nbsp;very&nbsp;very&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">long&nbsp;string&nbsp;literal</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;Console.Write(longLiteral); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Case&nbsp;2.</SPAN><SPAN style="COLOR: #008000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;line&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Literal&nbsp;variable&nbsp;newline</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempVar&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;Environment.NewLine; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;Console.Write(line); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Case&nbsp;3.</SPAN><SPAN style="COLOR: #008000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;builder&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;StringBuilder(); <BR><IMG id=Codehighlighter1_465_569_Open_Image onclick="this.style.display='none'; Codehighlighter1_465_569_Open_Text.style.display='none'; Codehighlighter1_465_569_Closed_Image.style.display='inline'; Codehighlighter1_465_569_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_465_569_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_465_569_Closed_Text.style.display='none'; Codehighlighter1_465_569_Open_Image.style.display='inline'; Codehighlighter1_465_569_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">10</SPAN><SPAN style="COLOR: #000000">;&nbsp;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_465_569_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_465_569_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.Append(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Line&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.Append(i); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.Append(Environment.NewLine); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;Console.Write(builder.ToString()); <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>}</SPAN></SPAN> </DIV>
<P><STRONG>不采用ToUpper或ToLower进行字符串不区分大小写的对比。</STRONG> </P>
<P>为什么：</P>
<P>ToUpper与ToLower每次对比时会产生临时对象，影响性能。改用String.Compare，这不会有临时对象产生，而且还可以根据文化进行对比（或文化中立的进行对比）。</P>
<P>不好的做法：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG id=Codehighlighter1_38_117_Open_Image onclick="this.style.display='none'; Codehighlighter1_38_117_Open_Text.style.display='none'; Codehighlighter1_38_117_Closed_Image.style.display='inline'; Codehighlighter1_38_117_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_38_117_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_38_117_Closed_Text.style.display='none'; Codehighlighter1_38_117_Open_Image.style.display='inline'; Codehighlighter1_38_117_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Foo(</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;s1,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;s2)&nbsp;</SPAN><SPAN id=Codehighlighter1_38_117_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_38_117_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;这里会有两个临时字符串对象产生。</SPAN><SPAN style="COLOR: #008000"> <BR><IMG id=Codehighlighter1_100_115_Open_Image onclick="this.style.display='none'; Codehighlighter1_100_115_Open_Text.style.display='none'; Codehighlighter1_100_115_Closed_Image.style.display='inline'; Codehighlighter1_100_115_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_100_115_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_100_115_Closed_Text.style.display='none'; Codehighlighter1_100_115_Open_Image.style.display='inline'; Codehighlighter1_100_115_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(s1.ToLower()&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;s2.ToLower())&nbsp;</SPAN><SPAN id=Codehighlighter1_100_115_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_100_115_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>}</SPAN></SPAN> </DIV>
<P>好的做法：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG id=Codehighlighter1_38_95_Open_Image onclick="this.style.display='none'; Codehighlighter1_38_95_Open_Text.style.display='none'; Codehighlighter1_38_95_Closed_Image.style.display='inline'; Codehighlighter1_38_95_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_38_95_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_38_95_Closed_Text.style.display='none'; Codehighlighter1_38_95_Open_Image.style.display='inline'; Codehighlighter1_38_95_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Foo(</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;s1,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;s2)&nbsp;</SPAN><SPAN id=Codehighlighter1_38_95_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_38_95_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG id=Codehighlighter1_78_93_Open_Image onclick="this.style.display='none'; Codehighlighter1_78_93_Open_Text.style.display='none'; Codehighlighter1_78_93_Closed_Image.style.display='inline'; Codehighlighter1_78_93_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_78_93_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_78_93_Closed_Text.style.display='none'; Codehighlighter1_78_93_Open_Image.style.display='inline'; Codehighlighter1_78_93_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">.Compare(s1,&nbsp;s2,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">))&nbsp;</SPAN><SPAN id=Codehighlighter1_78_93_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_78_93_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>}</SPAN></SPAN> </DIV>
<P>To be continued...</P><img src="http://www.cnblogs.com/cavingdeep/aggbug/298448.html?type=1" width="1" height="1" alt=""/><p>评论: 21　<a href="http://www.cnblogs.com/cavingdeep/archive/2005/12/16/298448.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/cavingdeep/archive/2005/12/16/298448.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>DCG 2.0.72 (Beta1) 发布了</title><link>http://www.cnblogs.com/cavingdeep/archive/2005/11/23/282561.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Wed, 23 Nov 2005 03:03:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2005/11/23/282561.html</guid><description><![CDATA[<p>阅读: 865 评论: 5 作者: <a href="http://www.cnblogs.com/cavingdeep/" target="_blank">Cavingdeep</a> 发表于 2005-11-23 11:03 <a href="http://www.cnblogs.com/cavingdeep/archive/2005/11/23/282561.html" target="_blank">原文链接</a></p><P>终于跨入了Beta版本了，这时的DCG 2.0可是绝对不容忽视的哦。 </P>
<P>我这里简单描述一下现有功能，有兴趣的朋友请自行下载。</P>
<OL>
<LI>使用简便切容易扩展的模板引擎。</LI>
<LI>提供基于ASP语法的模板语言，简单易上手。</LI>
<LI>扩展ASP的DTL（Dynamic Template Language）模板语言。现在写模板终于变得简单易维护了！</LI>
<LI>内置Dcg对象，提供模板自身信息。</LI>
<LI>完美自控资源清理，不会在您的目标系统上留下任何痕迹。</LI>
<LI>安全的动态模板执行，运行DCG动态模板不会危及到您的系统，您尽可放心运行从第三方获得的DCG动态模板，因为DCG模板的运行权限要比Internet程序还要低。</LI>
<LI>调试支持，开启调试后您将可以获得详细到行与列的错误提示信息。</LI>
<LI>最后但却很重要的一项，DCG很快并且内存占用很优化，您尽可以放心的在你的程序中使用大量DCG动态模板。</LI></OL>
<P>我会在今后的一些时日中仔细描述每一个功能以及使用，同时我会告诉你它们能给你带来什么样的价值。</P>
<P><A href="http://dcg.tigris.org/" target=_blank>http://dcg.tigris.org</A> </P><img src="http://www.cnblogs.com/cavingdeep/aggbug/282561.html?type=1" width="1" height="1" alt=""/><p>评论: 5　<a href="http://www.cnblogs.com/cavingdeep/archive/2005/11/23/282561.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/cavingdeep/archive/2005/11/23/282561.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>NUnit发布2.2.3兼容.NET 2.0 RTM</title><link>http://www.cnblogs.com/cavingdeep/archive/2005/11/17/278256.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Thu, 17 Nov 2005 00:50:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2005/11/17/278256.html</guid><description><![CDATA[<p>阅读: 381 评论: 1 作者: <a href="http://www.cnblogs.com/cavingdeep/" target="_blank">Cavingdeep</a> 发表于 2005-11-17 08:50 <a href="http://www.cnblogs.com/cavingdeep/archive/2005/11/17/278256.html" target="_blank">原文链接</a></p><P>比较欣慰的消息，NUnit不会因为VS 2005的存在而受到威胁，现NUnit已发布了这个兼容VS 2005与.NET 2.0 RTM的iteration版本。</P>
<P>有需要的朋友们赶快自取吧。</P><A href="http://sourceforge.net/forum/forum.php?forum_id=511248" target=_blank>http://sourceforge.net/forum/forum.php?forum_id=511248</A> 
<P></P><img src="http://www.cnblogs.com/cavingdeep/aggbug/278256.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/cavingdeep/archive/2005/11/17/278256.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/cavingdeep/archive/2005/11/17/278256.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>