﻿<?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>Mon, 06 Oct 2008 21:55:43 GMT</lastBuildDate><pubDate>Mon, 06 Oct 2008 21:55:43 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><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/483056.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483056.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/483056.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/483056.html</trackback:ping><description><![CDATA[以下是一段通过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" /><br><br><a href="http://news.cnblogs.com/n/42809/" target="_blank">[新闻]51.COM技术副总裁邵辉跳槽百度</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></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><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/483054.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483054.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/483054.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/483054.html</trackback:ping><description><![CDATA[这里是一段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" /><br><br><a href="http://news.cnblogs.com/n/42809/" target="_blank">[新闻]51.COM技术副总裁邵辉跳槽百度</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></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><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/464781.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2006/08/01/464781.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/464781.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/464781.html</trackback:ping><description><![CDATA[<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" /><br><br><a href="http://news.cnblogs.com/n/42807/" target="_blank">[新闻]Mono 2.0终于到来</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></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><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/451195.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2006/07/15/451195.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/451195.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/451195.html</trackback:ping><description><![CDATA[<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" /><br><br><a href="http://news.cnblogs.com/n/42808/" target="_blank">[新闻]百度任命李一男担任首席技术官</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></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><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/387175.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2006/04/28/387175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/387175.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/387175.html</trackback:ping><description><![CDATA[<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" /><br><br><a href="http://news.cnblogs.com/n/42805/" target="_blank">[新闻]Google Knol 开始尝试有声版</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></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><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/357434.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2006/03/24/357434.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/357434.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/357434.html</trackback:ping><description><![CDATA[<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" /><br><br><a href="http://news.cnblogs.com/n/42804/" target="_blank">[新闻]12日电脑与人进行世纪对话 可思考机器或诞生</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></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><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/350456.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2006/03/15/350456.html#Feedback</comments><slash:comments>26</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/350456.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/350456.html</trackback:ping><description><![CDATA[摘要: 比DOM与SAX更快，比DOM与SAX更好用，这就是VTD-XML，待我慢慢道来……&nbsp;&nbsp;<a href='http://www.cnblogs.com/cavingdeep/archive/2006/03/15/350456.html'>阅读全文</a><img src ="http://www.cnblogs.com/cavingdeep/aggbug/350456.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42803/" target="_blank">[新闻]人民网评:中国移动为什么要抛弃iPhone?</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></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><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/298448.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2005/12/16/298448.html#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/298448.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/298448.html</trackback:ping><description><![CDATA[摘要: 假如所有的人都很在意高性能代码的话，那么我的这篇Blog就没有意义了。我希望能够给出一些有意义的性能提示，这些是我们日常编码工作中总会碰到的，所以对这些小tips漠不关心只会日益加深对你代码的伤害，而且做Review的时候也会很不体面，老实说，一个人写的代码确切地反映了这个人的能力与个性，对于经常看不同代码的我们来说，这并不是胡说的，我们有确切的体会。首先值得一提的是，如果你的程序有性能问题，请不&nbsp;&nbsp;<a href='http://www.cnblogs.com/cavingdeep/archive/2005/12/16/298448.html'>阅读全文</a><img src ="http://www.cnblogs.com/cavingdeep/aggbug/298448.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42802/" target="_blank">[新闻]索尼推出第二代触控屏eBook电子书</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></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><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/282561.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2005/11/23/282561.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/282561.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/282561.html</trackback:ping><description><![CDATA[<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" /><br><br><a href="http://news.cnblogs.com/n/42801/" target="_blank">[新闻]百付宝加入战团 电子支付市场寻突破</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></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><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/278256.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2005/11/17/278256.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/278256.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/278256.html</trackback:ping><description><![CDATA[<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" /><br><br><a href="http://news.cnblogs.com/n/42800/" target="_blank">[新闻]邮件标准协议英文独占时代终结</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>如果你想拥有一个可嵌入式模板引擎……</title><link>http://www.cnblogs.com/cavingdeep/archive/2005/11/16/277871.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Wed, 16 Nov 2005 08:49:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2005/11/16/277871.html</guid><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/277871.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2005/11/16/277871.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/277871.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/277871.html</trackback:ping><description><![CDATA[<P>今天我发布了DCG 2.0的部分文档，其中包括DTL参考，有兴趣的朋友可以去看下。如果你需要在程序中使用模板的话，我也建议你去看下。不多说了，下面是链接。如果你还不知道DCG是什么，可以先看看我以前发布的Blog。</P>
<P><A href="http://cavingdeep.cnblogs.com/archive/2005/11/12/274618.html" target=_blank>《改进ASP语法打造更高效的模板语言》</A> </P>
<P><A href="http://cavingdeep.cnblogs.com/archive/2005/11/12/274802.html" target=_blank>《改进ASP语法打造更高效的模板语言II》</A> </P>
<P>项目首页 <BR><A href="http://dcg.tigris.org/" target=_blank>http://dcg.tigris.org</A> </P>
<P>文档页 <BR><A href="http://dcg.tigris.org/doc.html" target=_blank>http://dcg.tigris.org/doc.html</A> </P>
<P>另外模板引擎的使用帮助也已经被写在了SDK帮助中，你可以通过获取最新的源代码获得，获取后用NAnt编译生成文档。如果在使用上有什么问题的话请通过此Blog与我联系。</P><img src ="http://www.cnblogs.com/cavingdeep/aggbug/277871.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42799/" target="_blank">[新闻]2008年10月6日科技博客精选</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>改进ASP语法打造更高效的模板语言II</title><link>http://www.cnblogs.com/cavingdeep/archive/2005/11/12/274802.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Sat, 12 Nov 2005 09:29:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2005/11/12/274802.html</guid><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/274802.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2005/11/12/274802.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/274802.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/274802.html</trackback:ping><description><![CDATA[<P>在<A href="http://cavingdeep.cnblogs.com/archive/2005/11/12/274618.html" target=_blank>《改进ASP语法打造更高效的模板语言》</A>一篇中，我介绍了DTL作为ASP扩展语法的模板语言所带来的优势之一：静态标签。在这一篇中，我将带你领略DTL的又一强势：模板标签。 </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_26_42_Open_Image onclick="this.style.display='none'; Codehighlighter1_26_42_Open_Text.style.display='none'; Codehighlighter1_26_42_Closed_Image.style.display='inline'; Codehighlighter1_26_42_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_26_42_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_26_42_Closed_Text.style.display='none'; Codehighlighter1_26_42_Open_Image.style.display='inline'; Codehighlighter1_26_42_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">[]&nbsp;numbers&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">[]&nbsp;</SPAN><SPAN id=Codehighlighter1_26_42_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_26_42_Open_Text><SPAN style="COLOR: #000000">{&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">4</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">5</SPAN><SPAN style="COLOR: #000000">&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">;</SPAN> </DIV>
<P>注意空格哦！这里的动态部分就是从1到5的这部分。模板要怎样写呢？可以这样：</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_26_168_Open_Image onclick="this.style.display='none'; Codehighlighter1_26_168_Open_Text.style.display='none'; Codehighlighter1_26_168_Closed_Image.style.display='inline'; Codehighlighter1_26_168_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_26_168_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_26_168_Closed_Text.style.display='none'; Codehighlighter1_26_168_Open_Image.style.display='inline'; Codehighlighter1_26_168_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">[]&nbsp;numbers&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">[]&nbsp;</SPAN><SPAN id=Codehighlighter1_26_168_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_26_168_Open_Text><SPAN style="COLOR: #000000">{&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_60_163_Open_Image onclick="this.style.display='none'; Codehighlighter1_60_163_Open_Text.style.display='none'; Codehighlighter1_60_163_Closed_Image.style.display='inline'; Codehighlighter1_60_163_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_60_163_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_60_163_Closed_Text.style.display='none'; Codehighlighter1_60_163_Open_Image.style.display='inline'; Codehighlighter1_60_163_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top></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">5</SPAN><SPAN style="COLOR: #000000">;&nbsp;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_60_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_60_163_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG id=Codehighlighter1_76_116_Open_Image onclick="this.style.display='none'; Codehighlighter1_76_116_Open_Text.style.display='none'; Codehighlighter1_76_116_Closed_Image.style.display='inline'; Codehighlighter1_76_116_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_76_116_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_76_116_Closed_Text.style.display='none'; Codehighlighter1_76_116_Open_Image.style.display='inline'; Codehighlighter1_76_116_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;(i&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">5</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_76_116_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_76_116_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">&lt;%!</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">&lt;%=</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000">,&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: #000000">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_123_161_Open_Image onclick="this.style.display='none'; Codehighlighter1_123_161_Open_Text.style.display='none'; Codehighlighter1_123_161_Closed_Image.style.display='inline'; Codehighlighter1_123_161_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_123_161_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_123_161_Closed_Text.style.display='none'; Codehighlighter1_123_161_Open_Image.style.display='inline'; Codehighlighter1_123_161_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">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_123_161_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_123_161_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">&lt;%!</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">&lt;%=</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">%&gt;</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">!%&gt;</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/ExpandedSubBlockEnd.gif" width=11 align=top>}</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 style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">;</SPAN> </DIV>
<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_26_44_Open_Image onclick="this.style.display='none'; Codehighlighter1_26_44_Open_Text.style.display='none'; Codehighlighter1_26_44_Closed_Image.style.display='inline'; Codehighlighter1_26_44_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_26_44_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_26_44_Closed_Text.style.display='none'; Codehighlighter1_26_44_Open_Image.style.display='inline'; Codehighlighter1_26_44_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">[]&nbsp;numbers&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">[]&nbsp;</SPAN><SPAN id=Codehighlighter1_26_44_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_26_44_Open_Text><SPAN style="COLOR: #000000">{&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%=</SPAN><SPAN style="COLOR: #000000">template1</SPAN><SPAN style="COLOR: #000000">=%&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000">#&nbsp;template1 <BR><IMG id=Codehighlighter1_91_194_Open_Image onclick="this.style.display='none'; Codehighlighter1_91_194_Open_Text.style.display='none'; Codehighlighter1_91_194_Closed_Image.style.display='inline'; Codehighlighter1_91_194_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_91_194_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_91_194_Closed_Text.style.display='none'; Codehighlighter1_91_194_Open_Image.style.display='inline'; Codehighlighter1_91_194_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">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">5</SPAN><SPAN style="COLOR: #000000">;&nbsp;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_91_194_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_91_194_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG id=Codehighlighter1_107_147_Open_Image onclick="this.style.display='none'; Codehighlighter1_107_147_Open_Text.style.display='none'; Codehighlighter1_107_147_Closed_Image.style.display='inline'; Codehighlighter1_107_147_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_107_147_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_107_147_Closed_Text.style.display='none'; Codehighlighter1_107_147_Open_Image.style.display='inline'; Codehighlighter1_107_147_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;(i&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">5</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_107_147_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_107_147_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">&lt;%!</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">&lt;%=</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000">,&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: #000000">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_154_192_Open_Image onclick="this.style.display='none'; Codehighlighter1_154_192_Open_Text.style.display='none'; Codehighlighter1_154_192_Closed_Image.style.display='inline'; Codehighlighter1_154_192_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_154_192_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_154_192_Closed_Text.style.display='none'; Codehighlighter1_154_192_Open_Image.style.display='inline'; Codehighlighter1_154_192_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">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_154_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 height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_154_192_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">&lt;%!</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">&lt;%=</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">%&gt;</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">!%&gt;</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><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>#</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN> </DIV>
<P>呵呵，不错，就是这个样子，这就是我想要的。嗯，&lt;%# templateName #%&gt;就是所谓的模板标签，它定义了一个动态模板，&lt;%=templateName=%&gt;就是模板引用，将被引用的模板结果输出到引用位置上。</P>
<P>这下清晰多了，而且模板可以被多个地方引用，达到一定程度上的可重用性。这套机制酷似XSLT中的template标签，不过没有模板参数等的定义。也许你会问：&#8220;那我可以传参数给模板标签吗？&#8221;可以，不过准确的说不是你手动传，是自动传的。换句话说，模板引用是一个Closure，模板标签中的内容在运行时会自动获得所有模板引用当前的上下文。比如如下示例：</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 height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000">#&nbsp;t1 <BR><IMG id=Codehighlighter1_19_53_Open_Image onclick="this.style.display='none'; Codehighlighter1_19_53_Open_Text.style.display='none'; Codehighlighter1_19_53_Closed_Image.style.display='inline'; Codehighlighter1_19_53_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_19_53_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_19_53_Closed_Text.style.display='none'; Codehighlighter1_19_53_Open_Image.style.display='inline'; Codehighlighter1_19_53_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(var)&nbsp;</SPAN><SPAN id=Codehighlighter1_19_53_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_19_53_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">&lt;%!</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;OK <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">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_60_98_Open_Image onclick="this.style.display='none'; Codehighlighter1_60_98_Open_Text.style.display='none'; Codehighlighter1_60_98_Closed_Image.style.display='inline'; Codehighlighter1_60_98_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_60_98_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_60_98_Closed_Text.style.display='none'; Codehighlighter1_60_98_Open_Image.style.display='inline'; Codehighlighter1_60_98_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_60_98_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_60_98_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">&lt;%!</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;oh,&nbsp;no <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">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.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/None.gif" width=11 align=top>#</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">bool</SPAN><SPAN style="COLOR: #000000">&nbsp;var&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%!</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;First&nbsp;time&nbsp;call</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">s&nbsp;result&nbsp;is&nbsp;&lt;%=t1=%&gt;.</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;var&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%!</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;Second&nbsp;time&nbsp;call</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">s&nbsp;result&nbsp;is&nbsp;&lt;%=t1=%&gt;.</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>输出为： <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>First&nbsp;time&nbsp;call</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">s&nbsp;result&nbsp;is&nbsp;OK.</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">Second&nbsp;time&nbsp;call</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">s&nbsp;result&nbsp;is&nbsp;oh,&nbsp;no.</SPAN> </DIV>
<P>好了，这篇的内容就介绍完了，不知道我所描述的这两大DTL语法有没有引起你的足够兴趣，再次说明一下，如果你已经感兴趣了的话，可以自己下载试一下哦。在<A href="http://cavingdeep.cnblogs.com/archive/2005/11/12/274618.html" target=_blank>《改进ASP语法打造更高效的模板语言》</A>一篇中有相关链接。 </P>截止今日，又有一些小bug被fix掉了，所以如果你想让你的体验更愉快的话，请随时获取最新的源代码自行编译。<img src ="http://www.cnblogs.com/cavingdeep/aggbug/274802.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42798/" target="_blank">[新闻]福布斯：Web3.0尚未到来 仍需5到7年</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>改进ASP语法打造更高效的模板语言</title><link>http://www.cnblogs.com/cavingdeep/archive/2005/11/12/274618.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Sat, 12 Nov 2005 03:30:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2005/11/12/274618.html</guid><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/274618.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2005/11/12/274618.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/274618.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/274618.html</trackback:ping><description><![CDATA[<P>写过动态模板（包括ASP、JSP等）的人都知道一个动态模板有两个基础部分，静态部分和动态部分。静态部分就是我们想输出的静态内容，这部分内容是永远都不会变的，动态部分含有可执行代码，会在运行时得到不同的输出。比如如下ASP代码会根据人名的不同输出不同的内容：</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 height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top><SPAN style="COLOR: #000000">Hello&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%=</SPAN><SPAN style="COLOR: #000000">employee.Name</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000">.</SPAN> </DIV>
<P>如何将静态与动态这两部分很好的混合在一个模板中一直是动态模板的易用性关键，比如如果我想输出从1到5，以逗号分隔这样的文字时我可以用以下写法：</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 height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;length&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">5</SPAN><SPAN style="COLOR: #000000">; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_59_135_Open_Image onclick="this.style.display='none'; Codehighlighter1_59_135_Open_Text.style.display='none'; Codehighlighter1_59_135_Closed_Image.style.display='inline'; Codehighlighter1_59_135_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_59_135_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_59_135_Closed_Text.style.display='none'; Codehighlighter1_59_135_Open_Image.style.display='inline'; Codehighlighter1_59_135_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">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;length;&nbsp;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_59_135_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_59_135_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG id=Codehighlighter1_80_104_Open_Image onclick="this.style.display='none'; Codehighlighter1_80_104_Open_Text.style.display='none'; Codehighlighter1_80_104_Closed_Image.style.display='inline'; Codehighlighter1_80_104_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_80_104_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_80_104_Closed_Text.