﻿<?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>博客园-理想与现实之间</title><link>http://www.cnblogs.com/Hush/</link><description>学习的最好方法就是blog</description><language>zh-cn</language><lastBuildDate>Mon, 06 Jul 2009 16:14:36 GMT</lastBuildDate><pubDate>Mon, 06 Jul 2009 16:14:36 GMT</pubDate><ttl>60</ttl><item><title>[.Net 4.0]泛型的协变，以及高阶函数对泛型的影响 Part 1</title><link>http://www.cnblogs.com/Hush/archive/2008/11/22/1339140.html</link><dc:creator>Justin Shen</dc:creator><author>Justin Shen</author><pubDate>Sat, 22 Nov 2008 15:00:00 GMT</pubDate><guid>http://www.cnblogs.com/Hush/archive/2008/11/22/1339140.html</guid><wfw:comment>http://www.cnblogs.com/Hush/comments/1339140.html</wfw:comment><comments>http://www.cnblogs.com/Hush/archive/2008/11/22/1339140.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cnblogs.com/Hush/comments/commentRss/1339140.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Hush/services/trackbacks/1339140.html</trackback:ping><description><![CDATA[<p><em><strong>按：</strong>这文章算是上星期与装配脑袋一起讨论到的一些东西的总结。我试图用更多一点的代码把协变和反变解释得更浅显一点。大家也可以参考Ninputer同学的文章：</em></p>
<p><a href="http://www.cnblogs.com/Ninputer/archive/2008/11/22/generic_covariant.html">http://www.cnblogs.com/Ninputer/archive/2008/11/22/generic_covariant.html</a></p>
<p><strong></strong>&nbsp;</p>
<p><strong>为什么要有协变</strong></p>
<p>首先来说明一下为什么会要协变。协变其实是一个相当简单的概念。我们知道在OO的语言中，可以把一个子类的实例赋值给一个基类的引用。就像这样:<font face="Verdana"></p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">FileStream&nbsp;fs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileStream();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />Stream&nbsp;s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;fs;</span></div>
<p>&nbsp;</p>
<p>当引入了泛型之后，很容易我们会想到，像下面这样一个赋值是不是可以呢：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ISample</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;{}<br />
</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ConcreteFileStream&nbsp;:&nbsp;ISample</span><span style="color: #000000">&lt;</span><span style="color: #000000">FileStream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
{}<br />
<br />
ISample</span><span style="color: #000000">&lt;</span><span style="color: #000000">FileStream</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;iFs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConcreteFileStream();<br />
ISample</span><span style="color: #000000">&lt;</span><span style="color: #000000">Stream</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;iS&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;iFs;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">这里的赋值是可以的吗？</span></div>
<p>&nbsp;</p>
<p>直观上来看FileStream是Stream的子类，那么这个赋值当然应该是可行的。如果是可行的，那么我们称ISample&lt;T&gt;的泛型参数T，支持协变。</p>
<p>然而事实上，情况远没有这么简单。协变并不是像我们主观上认为的那样，总是可以的。在某些情况，泛型参数不能进行协变，但可以进行反变。所谓的反变，就是指对于这个泛型参数，我们可以做如下的赋值：</p>
<div class="cnblogs_code"><!--<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;ConcreteStream&nbsp;:&nbsp;ISample</span><span style="color: #000000">&lt;</span><span style="color: #000000">Stream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
{}<br />
<br />
ISample</span><span style="color: #000000">&lt;</span><span style="color: #000000">Stream</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;iS&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConcreteStream();<br />
ISample</span><span style="color: #000000">&lt;</span><span style="color: #000000">FileStream</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;iFs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;iS;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果这样的赋值可以进行，则称这个泛型参数支持反变</span></div>
<p>&nbsp;</p>
<p>这样的赋值竟然是可以的？是不是有违我们的直觉？接下来我们讨论一下什么情况下可以协变，什么情况下可以反变，而什么情况下两者都不可以。</p>
<p>这里需要说明的一点是，我们这里说&#8220;一个赋值可以进行&#8221;，意思是指这个赋值不会引发类型不安全的形为。不会因此，导致类型相关的异常。在实际使用中，C#编译器会检测到&#8220;这样一个赋值是不可以进行的&#8221;，从而会引发问题的代码不能通过编译。而泛型参数也要显示的声明成是否可以协变与反变。</p>
<p>&nbsp;</p>
<p><strong>什么时候可以协变与反变?</strong></p>
<p>之前提到了，要进行协变，远比我们的直觉要复杂的多。一个泛型参数是不是可以协变，取决于接口所定义的方法是如何使用这个泛型参数的。让我们来看下面的例子：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ISample</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;foo();<br />
}</span></div>
<p>&nbsp;</p>
<p>此时，T是被用作返回值的类型。而在这种情况下，T是支持协变的。请看以下的代码：</font></p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">ISample</span><span style="color: #000000">&lt;</span><span style="color: #000000">FileStream</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;iFs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConcreteFileStream();<br />
<br />
ISample</span><span style="color: #000000">&lt;</span><span style="color: #000000">Stream</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;iS&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;iFs;<br />
Stream&nbsp;s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;iS.foo();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">iS.foo()返回FileStream对象，可以隐式转化为Stream类型，没有问题！！</span></div>
<p>&nbsp;</p>
<p>当我们使用ISample&lt;Stream&gt;的时候，因为类型参数为Stream，所以代码中我们指望foo方法会返回一个Stream对象。而当iS实际指向一个ISample&lt;FileStream&gt;的对象时，foo方法会返回一个FileStream对象。而因为FileStream是Stream的子类，因此也是一个Stream对象。所以，在这里这个赋值不会引发任何问题。</p>
<p>在C# 4.0当中，如果一个泛型参数可以进行协变，我们要显示地进行声明，最通常的，当T被传出的时候，可以进行协变（这在有高阶函数的时候不成立，但我们稍后再讨论），所以我们要用一个out关键字来修饰T，说明它可以协变，像这样：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ISample</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">out</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
{}</span></div>
<p>&nbsp;</p>
<p>接下来让我们看一个不能协变的例子：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ISample</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;foo(T&nbsp;t);<br />
}<br />
<br />
ISample</span><span style="color: #000000">&lt;</span><span style="color: #000000">FileStream</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;iFs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConcreteFileStream();<br />
<br />
ISample</span><span style="color: #000000">&lt;</span><span style="color: #000000">Stream</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;iS&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;iFs;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果可以，会引发以下的情况，导致类型不安全</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
Stream&nbsp;s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Stream();<br />
iS.foo(s);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">不能把s转化为FileStream!!!</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;我们可以看到当使用iS的时候，我们认为类型参数是Stream，因此调用foo的时候，我们可能会把一个Stream类型的对象当作参数传递给foo。而当iS实际指向一个ISample&lt;FileStream&gt;的时候，foo函数要求的是一个FileStream对象。而Stream是不能转化为FileStream的。所以如果允许这样的赋值，在运行时会有一个InvalidCastException。实际情况是，C#编译器会检测到这段代码的问题，不会让代码通过编译。而在这种情况下，iS不可以指向ISample&lt;FileStream&gt;，也就是说T不支持协变。比较有趣的是，在这种情况下，T可以进行反变：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">ISample</span><span style="color: #000000">&lt;</span><span style="color: #000000">Stream</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;iS&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConcreteStream();<br />
<br />
ISample</span><span style="color: #000000">&lt;</span><span style="color: #000000">FileStream</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;iFs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;iS;<br />
FileStream&nbsp;fs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileStream();<br />
iFs.foo(fs);</span><span style="color: #008000">//</span><span style="color: #008000">可以将fs转化为Stream类型，所以不会有类型不安全！</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>在这里，使用iFs的时候，因为T的类型被指定为FileStream，foo的名义签名为 void foo(FileStream t)，所以我们有可能将一个FileStream类型的对象传递给foo函数。而当iFs实际指向一个ISample&lt;Stream&gt;时，foo的实际签名为void foo(Stream t)，而当我们把fs传递给foo的时候，会发生一个从FileStream到Stream的转换。FileStream是子类，所以这个转换完全可行。在这里，我们把一个ISample&lt;Stream&gt;赋值给一个ISample&lt;FileStream&gt;，而不会引发类型不安全。这种情况，我们称T支持反变。我们要用in关键字来显示地说明这一点：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ISample</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;foo(T&nbsp;t);<br />
}</span></div>
<p>&nbsp;</p>
<p>所以，协变与反变的一般定义如下：</p>
<div class="cnblogs_code"><!--<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;Base&nbsp;{}<br />
</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Derived&nbsp;:&nbsp;Base&nbsp;{}<br />
</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ISample</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;{}<br />
<br />
ISample</span><span style="color: #000000">&lt;</span><span style="color: #000000">Base</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;iB;<br />
ISample</span><span style="color: #000000">&lt;</span><span style="color: #000000">Derived</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;iD;<br />
<br />
iB&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;iD;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果这个赋值是类型安全的，那么T可以协变</span><span style="color: #008000"><br />
</span><span style="color: #000000">iD&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;IB;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果这个赋值是类型安全的，那么T可以反变</span></div>
<p>&nbsp;</p>
<p>写到这里，你大概会觉得，当T用在参数的时候，可以反变，用作返回类型的时候，可以协变。当又是参数又是返回类型的时候，就既不能协变也不能反变了。在通常的应用中，这是正确的。这里所谓的通常，是指没有高阶函数存在的情况。很不幸的是，其实我们还蛮容易就会碰到有高阶函数的情况。那么具体的内容，让我们在下一篇里再继续。</p>
<p>&nbsp;</p>
<img src ="http://www.cnblogs.com/Hush/aggbug/1339140.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48008/" target="_blank">IBM发布全球首款开源智能编译器</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>随笔 - WCF and Data Service</title><link>http://www.cnblogs.com/Hush/archive/2008/04/08/1143121.html</link><dc:creator>Justin Shen</dc:creator><author>Justin Shen</author><pubDate>Tue, 08 Apr 2008 15:21:00 GMT</pubDate><guid>http://www.cnblogs.com/Hush/archive/2008/04/08/1143121.html</guid><wfw:comment>http://www.cnblogs.com/Hush/comments/1143121.html</wfw:comment><comments>http://www.cnblogs.com/Hush/archive/2008/04/08/1143121.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/Hush/comments/commentRss/1143121.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Hush/services/trackbacks/1143121.html</trackback:ping><description><![CDATA[之前工作上偶尔用到WCF，都靠之前的一些知识对付过去了。现在终于下决心要来系统地学习一下。<br />
拿出先前买的O'reilly的"Programming WCF"来读。<br />
<br />
第一章对SOA做了个简单的介绍，其实这些概念之前也基本了解的，不过还是浏览一过来加深下印象，结果到也看到不少有趣的地方。<br />
比如书里提到Service的自主性，理论上讲Service除了应该有明确地边界之外，应该还是自主的，不和其它的Service共享数据，需要交互都应该以Message的形式来进行。但是书上也提到，现实中的Service其实对这一条是没办法完全做到。因为业务数据通常是统一存放在一个关系型数据库中的，而其上的Service，例如业务或者报表，必然会共用数据。<br />
<br />
于是想到，如果要改变这种状况，必然要把数据的供给也独立成一个Service，而其它的Service都使用这个Service。这里必然要面临的一个问题是性能下降，如果Data Object也要跨边界Serialize和Deserialize，效率应该会有很大的损失。这里，不禁异想天开：既然WCF已经做到Protocol透明，那么是不是也可以封装出一个进程内的，不Serialize的Channel呢？多少有点不切实际吧？<br />
<br />
另外，联想到DP Group的Astoria项目已经改名叫ADO.NET Data Service，似乎和我想的这个东西有点类似。突然又联想到自己的工作，是不是给Reporting Services做一个Astoria的data processing extension呢？
 <img src ="http://www.cnblogs.com/Hush/aggbug/1143121.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48007/" target="_blank">IE颓势不减 微软下月公布最新浏览器架构</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>面向对象语言中的Environment和Binding</title><link>http://www.cnblogs.com/Hush/archive/2007/12/16/996695.html</link><dc:creator>Justin Shen</dc:creator><author>Justin Shen</author><pubDate>Sun, 16 Dec 2007 08:00:00 GMT</pubDate><guid>http://www.cnblogs.com/Hush/archive/2007/12/16/996695.html</guid><wfw:comment>http://www.cnblogs.com/Hush/comments/996695.html</wfw:comment><comments>http://www.cnblogs.com/Hush/archive/2007/12/16/996695.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/Hush/comments/commentRss/996695.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Hush/services/trackbacks/996695.html</trackback:ping><description><![CDATA[第一次接触C#的编译，从现在看来确实和过程化语言的编译在Symbol Table的构建上有很大的差异。<br />
<br />
MONO的C#编译器中，仿照System.Reflection以及System.Reflection.Emit中的构架，建立了自己的TypeManager，用相同的机制来完成对源代码中的类型和方法的解析以及代码生成。使用RootContext类型来统筹和驱动整个编译的过程。语法分析阶段产生的Parse Tree实际和类型系统被整合在了一起。可以看到ParseTree中的Class类型，实际间接继承自TypeContainer类型。<br />
<br />
相对的，在ROTOR的编译器中。Parse Tree的结点在Allnodes.h中定义，而另外有独立的SYM系统，使用的方式似乎更为复杂一些。<br />
<br />
在过程化语言的编译过程中，因为类型可能和变量重名，我们通常准备两个Environment(即查找用的Symbol Table)，一个对应类型，另一个对应变量和函数。<br />
<br />
而在面向对象的语言里，对于一个Identifier的查找，与过程化语言很不一样。<br />
初步考虑仍然使用两套Environment，其中之一为一个类型系统(TypeManager)，保存所有已经被解析之后的代码中的类型信息，按照以下的树型方式保存：<br />
Namespace<br />
&nbsp;|-- Class/Struct/Interface<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |--&nbsp;Method<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-- Property<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-- Member<br />
为了提高作Name Resolving和Type Checking的效率，底层的数据结构可能需要结合HashTable和Tree<br />
<br />
因为C#支持引用先于定义（C++的前置声明对编译器来说就是福音啊），因此解析时可能要按照以下的顺序：<br />
<br />
解析所有类型的名称 （此时类型的其它信息一概未知，但光有名字的信息已经足以在下步做类型检查了）<br />
&nbsp;&nbsp; |---&gt; 解析所有的数据成员和方法的声明 (使用上一步中的信息对成员的类型、方法返回类型、方法参数类型做类型检查）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---&gt; 解析方法的定义<br />
<br />
在解析方法的定义中，将使用到另一套Environment(VariableEnv)，这个Environment中，包含了所有的本地变量的Binding，Binding中的信息非常简单，只需要表明该Variable的类型即可。VariableEnv和过程化语言编译中使用的Symbol Table类似，有成熟的算法可以参考，Block之中作用域的扩展和相互屏敝也类似。<br />
<br />
对于以下的代码：<br />
<br />
<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 alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">MyClass&nbsp;t&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MyClass();<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />t.Foo();</span></div>
<br />
在解析t.Foo();的时候，首先在VariableEnv查找t的Binding，从而得知类型为MyClass，然后在TypeManager中查找MyClass的方法中，是否有Foo()的定义。<br />
<br />
初步设想，当中间代码生成结束之后，把得到的Intermediate Representation（IR）挂接到TypeManager中的Method部分中去，TypeManager中的信息已经足够可以用来做后阶段真正的IL生成了。此时，从Parse Tree到IR的转换也就完成了。<br />
<br />
题外话：方法重载的检查其实相对简单，当在解析方法定义的时候，根据参数的类型，在TypeManager中查找相应的方法即可。即使在面向过程的语言之中，对以下的代码：<br />
<br />
<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 alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;foo();<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;foo(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i);</span></div>
<br />
加入到Environment中的时候，我们只要保证foo-&gt;foo(int i)的Binding不会屏敝掉之前加入的foo-&gt;foo()的Binding即可。这个既可以通过存放的数据结构来实现也可以通过查找的算法来加以保证。<br />
<br />
<img src ="http://www.cnblogs.com/Hush/aggbug/996695.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48002/" target="_blank">竞争日趋激烈 微软欲借 Windows 7 扭转战局</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>元数据</title><link>http://www.cnblogs.com/Hush/archive/2007/12/16/996611.html</link><dc:creator>Justin Shen</dc:creator><author>Justin Shen</author><pubDate>Sun, 16 Dec 2007 06:29:00 GMT</pubDate><guid>http://www.cnblogs.com/Hush/archive/2007/12/16/996611.html</guid><wfw:comment>http://www.cnblogs.com/Hush/comments/996611.html</wfw:comment><comments>http://www.cnblogs.com/Hush/archive/2007/12/16/996611.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Hush/comments/commentRss/996611.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Hush/services/trackbacks/996611.html</trackback:ping><description><![CDATA[<div>从初学.NET的时候，就常常挂在嘴边的一句话是：托管程序和原生程序最大的区别是编译器在程序集中加入了大量的元数据，因此托管程序是自描述的，我们可以在运行时获得关于源程序的任何信息，从而使用反射之类的高级机制。</div>
<div>&nbsp;</div>
<div>一直以为自己对这句话的理解已经很透彻了，但自己鼓捣编译器，才豁然发现，原来编译成IL，编译器需要Emit这么多的描述类型描述方法的元数据，在代码生成阶段，我们依然要保留大量的诸如Namespace, Class, Method的信息。而编译成x86 ASM的话，到代码生成阶段，就只有对应指令流的IR树罢了。在源代码层面的类型啊、函数定义啊、操作符啊、函数重载啊之类的信息，已经完全丢失了。</div>
<div>&nbsp;</div>
<div>还挺好玩的，嘿嘿。</div>
 <img src ="http://www.cnblogs.com/Hush/aggbug/996611.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48002/" target="_blank">竞争日趋激烈 微软欲借 Windows 7 扭转战局</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>有多少东西需要学习？</title><link>http://www.cnblogs.com/Hush/archive/2005/11/22/281712.html</link><dc:creator>Justin Shen</dc:creator><author>Justin Shen</author><pubDate>Mon, 21 Nov 2005 16:37:00 GMT</pubDate><guid>http://www.cnblogs.com/Hush/archive/2005/11/22/281712.html</guid><wfw:comment>http://www.cnblogs.com/Hush/comments/281712.html</wfw:comment><comments>http://www.cnblogs.com/Hush/archive/2005/11/22/281712.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cnblogs.com/Hush/comments/commentRss/281712.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Hush/services/trackbacks/281712.html</trackback:ping><description><![CDATA[<DIV>工作工作的，似乎忘记了要继续充电了。当然喽，工作上的原因，SQL Server和数据库上的长进还是很大的，不过这些还不够呀。下面是一个欠债清单，要下决心，一个一个还掉了！</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG>- 阅读Rotor的源码</STRONG></DIV>
<DIV>&nbsp;</DIV>
<DIV>在进公司之前，自己的.NET水准终于差不多了可以去看看Rotor源码的程度了。不过没想到，工作之后，就一点没时间来做这种阅读功课了。现在只有在地铁上有点看书的时间，考虑要不要把源代码打印出来在地铁上看，嘿嘿！至少要把Execution Engine和Thread两大部分给搞懂。　其实对Regular Expression的实现也蛮有兴趣，不过大概没时间。</DIV>
<DIV>&nbsp;</DIV>
<DIV>不过上班也有上班的好处，收获以下两本极有价值的书：</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp; + Inside Rotor</DIV>
<DIV>&nbsp;&nbsp; + Shared Source CLI Essentials</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG>- 编译原理</STRONG></DIV>
<DIV>&nbsp;</DIV>
<DIV>对编译原理的兴趣始终不减。需要下决定把龙书看完。感觉这次应该把精力集中在代码生成和代码优化上。前端的东西确实比较死。</DIV>
<DIV>&nbsp;</DIV>
<DIV>以下的书目也在采购计划上。可惜O'reilly的那本《Lex和Yacc》已经绝版。发现原来书店里都只存2年之内的书，看样子下次看到好书绝对不能手弱。好在现在俺也工作了，不怕。嘿嘿~~</DIV>
<DIV>&nbsp;</DIV>
<DIV>　+ Advanced Compiler Design and Implementation</DIV>
<DIV>　+ Crafting a Compiler with C</DIV>
<DIV>&nbsp;</DIV>
<DIV>以上两上皆是Amazon上四星半评价的好书。</DIV>
<DIV>&nbsp;</DIV>
<DIV>实践的话，想要阅读一下Rotor中，C#的编译器的源码。朋友说里面的词法分析器不是用Lex生成的，而是Hand-craft，似乎还蛮有兴趣去瞧一下的。不过更多代码生成和优化的环节是不是会包含在JIT编译器的代码中呢？</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG>- 复习数据结构和算法</STRONG></DIV>
<DIV>&nbsp;</DIV>
<DIV>数据结构是从初中开始就一陪伴着我的东西了。还记得考大学的时候，做数学物理脑袋涨的时候，就会把严蔚敏老师的《数据结构》拿出来翻翻。现在到是越来越怀念高中的生活。前天晚上的时候，梦到高中时的同桌，梦里那份高兴的心情，似乎好久没有在现实生活感受到了。</DIV>
<DIV>&nbsp;</DIV>
<DIV>《Introduction to Algorithm》这本书是在学数据结构和算法的时候，一直梦寐以求的。可惜买到的时候，已经没有时间看了。再加上MIT公开课程里的那个课程表和相应的习题、讲义、试卷。闲置在那里实在也太可惜。决定好好从头到尾再复习一遍。MIT的课程表里，似乎三小时一个Session，一共42个Session，似乎需要坚持蛮久才行的样子。</DIV>
<DIV>&nbsp;</DIV>
<DIV>以下的是在采购列表上的书：</DIV>
<DIV>&nbsp;</DIV>
<DIV>　+ Algorithms in C</DIV>
<DIV>&nbsp;</DIV>
<DIV>由Robert Sedgewick撰写的这本书，据传被认为是我们敬爱的Knuth教授的那套《The Art of Computer Programming》的一个可阅读版本。嘿嘿。在学校的图书馆里看过一部分，说实话，不太喜欢这种风格的C程序，不过盛名之下，应该会有两把刷子的。可以用来参考。同样也是一本Amazon上四星半评价的好书。</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG>- 数据库原理</STRONG></DIV>
<DIV>&nbsp;</DIV>
<DIV>这算是本职工作了。好歹现在做着SQL Server的技术支持，数据库知识上不更上层楼是不行。目前的储备是由著名的Abraham Silberschatz教授编写的《Database System Concept》一书。我同时还有他编写的那本久负盛名的恐龙书《Operating System Concept》，可惜现在大概是真的没时间看了。很多好书总是到最近才出，学完了才买到，真是可惜错过。好在学操作系统的时候，已经有Tanenbaum教授的《Operating Systems: Design and Implementation》（Amazon四星）不然损失就大了。如果你是一个Linux Fan的话，应该会有听说过这本如雷灌耳的书吧。;-)</DIV>
<DIV>&nbsp;</DIV>
<DIV>不过《Database System Concept》在Amazon上的评价只有三星，而且MIT公开课程中的数据库原理也不是用这本书做教材，而是直接用数据库理论的那些原始论文来讲的。从公司的Library里借了MIT用作教材的数据库论文选集《Readings on Database Systems(Fourth Edition》。这本选集被称为Red Book，也是四星半评论的名著。只是从美国的总部图书馆漂洋过海而来不知道会要多少时间。到时间一定翻印一本。</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG>- Reporting Services</STRONG></DIV>
<DIV>&nbsp;</DIV>
<DIV>这也是工作的一部分，Reporting Services可是属于我的Specialty哦！在进公司之前，就对RS很有兴趣，所以毫不犹豫就Ready了。：）　不过应用层面的Case都有点无聊，到是对RS的Architecture很有兴趣，一个典范式的.NET程序。</DIV>
<DIV>&nbsp;</DIV>
<DIV>准备研究的部分，包括PDF Rendering Extension和Email Delivery Extension。目前手上的资料只有这两部份和Report Model的Specification，简略到不行的东西，竟然也是Microsoft Confidential。唉...如果能看到源码就好了，看样子，自己还要不断加油。好在.NET的程序反编译出来看也凑合。</DIV>
<DIV>&nbsp;</DIV>
<DIV>动手的部分，是想写一个for word的Rendering Extension。一方面，似乎客户那里对这个功能还是蛮有需求的，另一方面，自己太久不写程序了，也得找个大一点的东东来练手一下。不过这个应该是蛮久之后的事情了，现在连是生成WordML还是原生Word文档都还没有想好。</DIV>
<DIV>&nbsp;</DIV>
<DIV>近一点的目标包括，研习一下VS2005示例程序中的ReportViewer的那个范例。ReportViewer的出现，真是解决了Reporting Services的一大难题，终于可以不要再反复回答那一个BT的问题了。</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG>- Win32 User Mode Debug</STRONG></DIV>
<DIV>&nbsp;</DIV>
<DIV>手里有的书是《Debugging Applicatoin》，又是Amazon上一本四星半评价的书。可惜不是最新版的，没有.NET的部分。不过新版本的我有电子书，不怕。顺便提下，这书是我从Oliver那里rob过来的，嘿嘿。不过他好象有布置我要看完。<IMG src="http://spaces.msn.com/rte/emoticons/smile_tongue.gif"></DIV>
<DIV>&nbsp;</DIV>
<DIV>另一个重要的参考是《Win32 User Mode Debug》这本内部的培训教材。差不多看完一遍了。第一部分写得还真棒，感觉我是越来越喜欢Microsoft写的培训教材了，再下去要懒得看书了。不过，附带的习题有点BT，为啥调用一下malloc都可以Access Violation？一点也看不出来。啥叫AV in Heap Manager啊？<IMG src="http://spaces.msn.com/rte/emoticons/smile_cry.gif">　Oliver又去北京了，没人教我，可怜啊...</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>呼...写下来发现，欠的东西还真是蛮多，这都要还到哪年哪月呀，不管怎样，还是努力吧！ <IMG src="http://spaces.msn.com/rte/emoticons/smile_regular.gif"></DIV><img src ="http://www.cnblogs.com/Hush/aggbug/281712.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48001/" target="_blank">上海电信计划2012年80%用户实现100M带宽</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>[电子书下载]Dissecting a C# Application: Inside SharpDevelop</title><link>http://www.cnblogs.com/Hush/archive/2005/01/03/85957.html</link><dc:creator>Justin Shen</dc:creator><author>Justin Shen</author><pubDate>Mon, 03 Jan 2005 14:04:00 GMT</pubDate><guid>http://www.cnblogs.com/Hush/archive/2005/01/03/85957.html</guid><wfw:comment>http://www.cnblogs.com/Hush/comments/85957.html</wfw:comment><comments>http://www.cnblogs.com/Hush/archive/2005/01/03/85957.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cnblogs.com/Hush/comments/commentRss/85957.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Hush/services/trackbacks/85957.html</trackback:ping><description><![CDATA[这本书比较全面地介绍了<a href="http://www.sharpdevelop.com/OpenSource/SD/Default.aspx">SharpDevelop</a>的开发原理，写得非常不错，然而中文的翻译版本实在太糟糕了...好在现在它的出版社Apress，提供了免费的电子书下载：<a href="http://www.apress.com/free/content/Dissecting_A_CSharp_Application.pdf"> 
<br/>
<br/>http://www.apress.com/free/content/Dissecting_A_CSharp_Application.pdf</a><img src ="http://www.cnblogs.com/Hush/aggbug/85957.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48000/" target="_blank">数万名网友签名抗议星际争霸2取消局域网功能</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>[MSDNTV]Don Box再次出击 :)</title><link>http://www.cnblogs.com/Hush/archive/2004/12/21/80022.html</link><dc:creator>Justin Shen</dc:creator><author>Justin Shen</author><pubDate>Tue, 21 Dec 2004 05:26:00 GMT</pubDate><guid>http://www.cnblogs.com/Hush/archive/2004/12/21/80022.html</guid><wfw:comment>http://www.cnblogs.com/Hush/comments/80022.html</wfw:comment><comments>http://www.cnblogs.com/Hush/archive/2004/12/21/80022.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/Hush/comments/commentRss/80022.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Hush/services/trackbacks/80022.html</trackback:ping><description><![CDATA[还记得去年圣诞节的那一期Special Holiday Episode&#160;吗？
<br/>
<br/>今年的圣诞节又快到了，所以又出了一个Speical Holiday Episode II，主要介绍了一下在Avalon里怎样自己实现一个类似FlowPanel的东东。
<br/>
<br/>去年节目结束的部分，两人(Don Box and Chris Anderson)自弹自唱了改编后的圣诞歌曲。今年他们再接再励，给大家献上了诗朗诵。这首诗是改编自Clement Clarke Moore的&quot; &#39;Twas the Night Before Christmas &quot;
<br/>
<br/>大家不妨去看看 <img height="19" src="http://www.cnblogs.com/Emoticons/emsmile.gif" width="19" align="absMiddle" border="0" /><img src ="http://www.cnblogs.com/Hush/aggbug/80022.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47999/" target="_blank">Silverlight打造杰克逊纪念专题</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>追踪你的时间使用状况</title><link>http://www.cnblogs.com/Hush/archive/2004/12/17/78618.html</link><dc:creator>Justin Shen</dc:creator><author>Justin Shen</author><pubDate>Fri, 17 Dec 2004 15:17:00 GMT</pubDate><guid>http://www.cnblogs.com/Hush/archive/2004/12/17/78618.html</guid><wfw:comment>http://www.cnblogs.com/Hush/comments/78618.html</wfw:comment><comments>http://www.cnblogs.com/Hush/archive/2004/12/17/78618.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/Hush/comments/commentRss/78618.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Hush/services/trackbacks/78618.html</trackback:ping><description><![CDATA[最近在根据PSP(个体软件开发过程)的相关内容，统计我每天花在主要活动上的时间。在坚持了大概1个月之后，总算也积累了一定的数据。我发现每天浪费掉的时间还真是非常多。在统计数据里，很少有单次活动超过1个小时的记录，大部分时候总是会被各种各样的事情打断。而且很多时候，你觉得你整整工作了一个下午，但实际的有效时间可能都只有3小时，真是非常惊讶呢。 
<br/>
<br/>我发现做这些统计也带来了一些时间安排上的好处。如果你能够比较正确地选择工作单元的单位，就可以根据以前的数据来比较有效地预测将要在花费在某个活动上的时间，从而更合理地安排的日程。 
<br/>
<br/>一个时间记录日志，包括以下几列： 
<br/>
<br/>日期 开始时间 结束时间 中断时间 净时间 活动 备注 C U 
<br/>
<br/>每一行都是一项活动，记录时间的单位为分钟。 
<br/>
<br/>其中，C列表示这个活动是否完成了，比如这个活动是读某本书的某一个章节，在C列上打勾表示已经读完了这个章节。 
<br/>
<br/>U列表示这项活动完成的工作单元的数目，合理地选取工作单元的单位，才能比较准确地根据过去的数据来预测将来的情况。还是以读书来作例子，你可以选择在活动中读完的页数来作工作单元，也可以选择读完的章节数来做工作单元，然而很显然是页数比较好。通常工作单元选比较小的单位比较好，这样能减少数据的误差。如果所记录的活动是写代码，那么可以使用所写程序的行数来做工作单元。 
<br/>
<br/>追踪时间的使用状况还是一个蛮有帮助的过程，大家不妨尝试一下。 
<br/>
<br/><img src ="http://www.cnblogs.com/Hush/aggbug/78618.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47998/" target="_blank">传诺基亚正在开发Android手机</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>听说《csdn开发高手》停刊了</title><link>http://www.cnblogs.com/Hush/archive/2004/12/12/76102.html</link><dc:creator>Justin Shen</dc:creator><author>Justin Shen</author><pubDate>Sun, 12 Dec 2004 13:58:00 GMT</pubDate><guid>http://www.cnblogs.com/Hush/archive/2004/12/12/76102.html</guid><wfw:comment>http://www.cnblogs.com/Hush/comments/76102.html</wfw:comment><comments>http://www.cnblogs.com/Hush/archive/2004/12/12/76102.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.cnblogs.com/Hush/comments/commentRss/76102.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Hush/services/trackbacks/76102.html</trackback:ping><description><![CDATA[看到这个消息的时候，并不觉得十分意外，因为一直觉得《csdn开发高手》的文章质量比较欠佳，买过最初几期之后，就失去了再买下去的兴趣。 
<br/>
<br/>然而抛开个案不谈，在《程序春秋》和《csdn开发高手》相继倒下之后，在开发类的技术杂志领域又只下了《程序员》孤军奋战。这多少是一个不怎么健康且值得思考的现象。或许国内确实比较缺乏做技术杂志的土壤，因为似乎并没有很多人是在关注技术，浏览csdn的论坛，你常常会有这样一个感觉：发帖的人通常都只是功利地想解决工作中遇到的问题，甚至把作业放到网上找人代做的都有，但真正讨论技术的却实在太少。如果程序员的整个群体都处于这样一个状况，要找到一本技术杂志的市场，确实非常困难。 
<br/>
<br/>好在blog出现之后，多少让人看到了一些改变的希望。像博客园就聚集了一批关注技术的人。或许我们不需要太悲观，要相信事情总会往好的方向上发展。　<img height="19" src="http://www.cnblogs.com/Emoticons/emsmile.gif" width="19" align="absMiddle" border="0" /> 
<br/>
<br/><img src ="http://www.cnblogs.com/Hush/aggbug/76102.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47996/" target="_blank">7月编程语言排行榜</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>在nant中改变编译的目标平台</title><link>http://www.cnblogs.com/Hush/archive/2004/12/12/76054.html</link><dc:creator>Justin Shen</dc:creator><author>Justin Shen</author><pubDate>Sun, 12 Dec 2004 13:04:00 GMT</pubDate><guid>http://www.cnblogs.com/Hush/archive/2004/12/12/76054.html</guid><wfw:comment>http://www.cnblogs.com/Hush/comments/76054.html</wfw:comment><comments>http://www.cnblogs.com/Hush/archive/2004/12/12/76054.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/Hush/comments/commentRss/76054.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Hush/services/trackbacks/76054.html</trackback:ping><description><![CDATA[最近一直在用VS 2005 express，很多功能都让人爱不释手，然而总还是需要写一些必须运行在.net v1.1上的程序，被迫要去用VS 2003，觉得非常不爽。人果然是容易被宠坏的，越来越懒了　<img height="19" src="http://www.cnblogs.com/Emoticons/emsmilep.gif" width="19" align="absMiddle" border="0" /> 
<br/>
<br/>所以现在就尝试用VS 2005写代码，然后用nant来编译项目。nant有三种改变编译目标平台的方法： 
<br/>
<br/>(1)直接在命令行中指定，例如： 
<br/>
<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; NAnt.exe -t:net-1.1 
<br/>
<br/>(2)通过在build文件，对系统属性nant.settings.currentframework赋值来进行指定： 
<br/>
<br/>&lt;property name=&quot;nant.settings.currentframework&quot; value=&quot;net-1.1&quot; /&gt; 
<br/>
<br/>(3)直接修改nant的配置文件来改变nant的默认目标平台 
<br/>
<br/>&lt;frameworks&gt; 
<br/>&lt;platform name=&quot;win32&quot; default=&quot;net-1.1&quot;&gt; 
<br/>... 
<br/>&lt;/platform&gt; 
<br/>&lt;/frameworks&gt; 
<br/>
<br/>所有支持的平台，你可以nant.exe.config里找到，比如我手头的nant就支持　net-1.0 net-1.1 net-2.0 netcf-1.0 mono-1.0。 
<br/>
<br/>直觉上觉得，既然VS2005里的C#已经开始用msbuild来进行后台编译，那么应该也可以支持目标平台的设置，但似乎并没有在vs2005的项目设置里找到相应的选项，对msbuild也不很了解，如果哪位知道，还请不吝赐教。<img src ="http://www.cnblogs.com/Hush/aggbug/76054.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47996/" target="_blank">7月编程语言排行榜</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>让使用MSN就像访问网页一样容易！</title><link>http://www.cnblogs.com/Hush/archive/2004/12/10/75430.html</link><dc:creator>Justin Shen</dc:creator><author>Justin Shen</author><pubDate>Fri, 10 Dec 2004 14:39:00 GMT</pubDate><guid>http://www.cnblogs.com/Hush/archive/2004/12/10/75430.html</guid><wfw:comment>http://www.cnblogs.com/Hush/comments/75430.html</wfw:comment><comments>http://www.cnblogs.com/Hush/archive/2004/12/10/75430.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/Hush/comments/commentRss/75430.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Hush/services/trackbacks/75430.html</trackback:ping><description><![CDATA[有时候，你不得不佩服微软的想法！
<br/>
<br/><a href="http://webmessenger.msn.com/">http://webmessenger.msn.com/</a><img src ="http://www.cnblogs.com/Hush/aggbug/75430.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47995/" target="_blank">Google Voice 上手</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>System.String是不可变的字符串吗？</title><link>http://www.cnblogs.com/Hush/archive/2004/12/07/74098.html</link><dc:creator>Justin Shen</dc:creator><author>Justin Shen</author><pubDate>Tue, 07 Dec 2004 14:15:00 GMT</pubDate><guid>http://www.cnblogs.com/Hush/archive/2004/12/07/74098.html</guid><wfw:comment>http://www.cnblogs.com/Hush/comments/74098.html</wfw:comment><comments>http://www.cnblogs.com/Hush/archive/2004/12/07/74098.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/Hush/comments/commentRss/74098.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Hush/services/trackbacks/74098.html</trackback:ping><description><![CDATA[在学习.net编程时，你一定有听到过这样的说法，System.String类是不可变字符串，也就是说你不能修改一个字符串的值。 
<br/>
<br/>比如以下这段代码 
<br/>
<br/>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
   <div><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" /><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&#160;s&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">hello</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">; 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" />s&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">world</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">;</span> 
   </div>
</div>
<br/>你并不是把s的值修改为world，而是生成了一个新的包含&quot;world&quot;的字符串，然后令s这个字符串的引用指向新的字符串，而原来的那个字符串就被抛弃掉了。 
<br/>
<br/>也正是基于String类的不可修改性，CLR采用了String Interning的技术来共享相同的字符串，以达到减少内存使用的目的。比如以下这段代码 
<br/>
<br/>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
   <div><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" /><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&#160;s1&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">hello</span><span style="COLOR: #000000">&quot;</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">string</span><span style="COLOR: #000000">&#160;s2&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">hello</span><span style="COLOR: #000000">&quot;</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: #0000ff">if</span><span style="COLOR: #000000">&#160;(Object.ReferenceEquals(s1,&#160;s2)) 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Console.WriteLine(</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">They&#160;are&#160;same</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">);</span> 
   </div>
</div>
<br/>s1和s2其实指向相同的字符串。 
<br/>
<br/>那么是不是我们真的没有办法改变一个string的值呢？当然不是，在C++/CLI中，我们可以使用一些特殊的手段来达到我们的目的！ 
<br/>
<br/>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
   <div><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" /><span style="COLOR: #000000">&#160;&#160;&#160;&#160;String</span><span style="COLOR: #000000">^</span><span style="COLOR: #000000">&#160;s1&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">hello</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">;
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" />&#160;&#160;&#160;&#160;String</span><span style="COLOR: #000000">^</span><span style="COLOR: #000000">&#160;s2&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">hello</span><span style="COLOR: #000000">&quot;</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" />&#160;&#160;&#160;&#160;interior_ptr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Char</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&#160;p&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;const_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">interior_ptr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Char</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(PtrToStringChars(s1));
<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" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(;&#160;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p;&#160;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p</span><span style="COLOR: #000000">++=</span><span style="COLOR: #000000">&#39;</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">&#39;</span><span style="COLOR: #000000">);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
<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" />&#160;&#160;&#160;&#160;Console::WriteLine(</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">{0}&#160;and&#160;{1}</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">,s1,s2);</span>
   </div>
</div>
<br/>
<p></p>
<p></p>
<p>PtrToStringChars(String^)是一个定义在vcclr.h头文件中的一个helper function，它返回一个类型为interior_ptr&lt;const Char&gt;的内部指针，指向String实例内部所包含的字符串，之所以返回类型是interior_ptr&lt;const Char&gt;而不是interior_ptr&lt;Char&gt;是因为不希望我们改变String实例内的字符串，不过既然我们执意要这么做，那么就让我们用一个const_cast&lt;T&gt;来把这个const搞掉！<img height="19" src="http://www.cnblogs.com/Emoticons/emsmilep.gif" width="19" align="absMiddle" border="0" /> 
<br/>
<br/>运行以上代码你会发现，s2现在的内容已经是aaaaa，而不是hello了。 
<br/>
<br/>当然，以上例子只是说明存在修改string实例的内容的可能，并不是鼓励大家这么做。虽然直接访问string实例内部的字符串，可能会带来一些性能上的好处。但是由于String Interning的存在，修改String实例内部的字符串是相当危险的行为，比如上面的那个例子中，你会发现，s1的输出也变成aaaaa了！<img height="19" src="http://www.cnblogs.com/Emoticons/emdgust.gif" width="19" align="absMiddle" border="0" /> 
</p><img src ="http://www.cnblogs.com/Hush/aggbug/74098.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47994/" target="_blank">Google号召社区力量为互联网加速</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>对中国计算机大学教育的一些牢骚</title><link>http://www.cnblogs.com/Hush/archive/2004/11/29/70164.html</link><dc:creator>Justin Shen</dc:creator><author>Justin Shen</author><pubDate>Sun, 28 Nov 2004 16:06:00 GMT</pubDate><guid>http://www.cnblogs.com/Hush/archive/2004/11/29/70164.html</guid><wfw:comment>http://www.cnblogs.com/Hush/comments/70164.html</wfw:comment><comments>http://www.cnblogs.com/Hush/archive/2004/11/29/70164.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cnblogs.com/Hush/comments/commentRss/70164.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Hush/services/trackbacks/70164.html</trackback:ping><description><![CDATA[高中和初进大学的时候，周围总有这么一种论调：好的计算机公司都喜欢招聘数学系或者物理系的毕业生，说是数学功底比较扎实。我的一位学物理出身的长辈曾问我计算机系都学些什么，听了我的描述之后，露出一种不屑的神色，说这些有什么可学的。言下之意似乎只有物理、数学系学的那些东西才算是真正的学问。<br/><br/>然而，既然计算机从数学和物理之中分离出来，成了一个独立的学科，总有它独到之处。那么这个独到之处是什么呢？我觉得不是数据结构，以数学系学生的离散数学知识，我们在数据结构上占不到什么便宜，也正是因为这个，才会有本文开头的那种论调。何况数据结构的复用是做得相当好的，很多人用着STL里的Map、.Net里的HashTable，很好的完成了自己的工作，却不用太注意那背后的红黑树、碰撞处理。<br/><br/>那么除了数据结构的知识之外，要成为一名合格的软件开发者，还需要具备什么样的知识呢？我觉得是面向对象技术和软件工程知识。这两项技术理应成为计算机系学生的优势。然而现实情况实在是令人沮丧。<br/><br/>大学里的课程开设，主干依然是围绕数据结构展开的，软件工程现在总算也是一门主干课程了，但重要性远不如数据结构的一系列课程。而面向对象技术往往只是软件工程课程中的一个章节，有所讲述也往往停留在面向对象技术初始阶段的理论，而完全无视近年的发展。当大家已经承认接口复用的意义，课堂上还在大讲代码复用。当大家已经都在用C++、C#编程的时候，课堂上还在大讲Goto语句的危害性。<br/><br/>面对这样的现实，有的只能是无奈...<img src ="http://www.cnblogs.com/Hush/aggbug/70164.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47989/" target="_blank">Twitter无处不在 魔兽世界Twitter发送器插件发布</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>[VS2005]做了两个Code Expansion用的Code Snippet。</title><link>http://www.cnblogs.com/Hush/archive/2004/11/03/60152.html</link><dc:creator>Justin Shen</dc:creator><author>Justin Shen</author><pubDate>Wed, 03 Nov 2004 14:56:00 GMT</pubDate><guid>http://www.cnblogs.com/Hush/archive/2004/11/03/60152.html</guid><wfw:comment>http://www.cnblogs.com/Hush/comments/60152.html</wfw:comment><comments>http://www.cnblogs.com/Hush/archive/2004/11/03/60152.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/Hush/comments/commentRss/60152.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Hush/services/trackbacks/60152.html</trackback:ping><description><![CDATA[如果你不清楚VS 2005的定制Code Expansion的功能，可以看一下我的<A href="http://www.cnblogs.com/hush/archive/2004/10/27/57492.html">这篇文章</A>。<br/><br/>第一个是用来生成string，其实就是自动生成一对双引号，在中间输入好string之后，按回车可以跳到双引号之后。这个是受了eclipse的启发，不过觉得我的这个更好用，因为输入完字符串之后，不用去按方向键，嘿嘿<br/>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
    <DIV><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/><SPAN style="COLOR: #0000ff">&lt;?</SPAN><SPAN style="COLOR: #ff00ff">xml&#160;version=&quot;1.0&quot;&#160;encoding=&quot;utf-8&quot;&#160;</SPAN><SPAN style="COLOR: #0000ff">?&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/></SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">CodeSnippet&#160;</SPAN><SPAN style="COLOR: #ff0000">Format</SPAN><SPAN style="COLOR: #0000ff">=&quot;1.0.0&quot;</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Header</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Title</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">String</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Title</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Shortcut</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">s</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Shortcut</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Description</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Expansion&#160;snippet&#160;for&#160;String</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Description</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">SnippetTypes</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">SnippetType</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Expansion</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">SnippetType</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">SnippetTypes</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Header</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;<br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Snippet</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Declarations</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Literal</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">ID</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">body</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">ID</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">ToolTip</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">string&#160;body</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">ToolTip</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Literal</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Declarations</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Code&#160;</SPAN><SPAN style="COLOR: #ff0000">Language</SPAN><SPAN style="COLOR: #0000ff">=&quot;csharp&quot;</SPAN><SPAN style="COLOR: #ff0000">&#160;Format</SPAN><SPAN style="COLOR: #0000ff">=&quot;CData&quot;</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #0000ff">&lt;![CDATA[</SPAN><SPAN style="COLOR: #808080">&quot;$body$&quot;$end$</SPAN><SPAN style="COLOR: #0000ff">]]&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Code</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Snippet</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">CodeSnippet</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN> 
    </DIV>
</DIV><br/><br/>第二个是用来生成一个函数的框架，写这个的原因主要是eclipse里面，打一个大括号会自动生成另一个，实在是很好的功能，这样就不会去按方向键了。<br/>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
    <DIV><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/><SPAN style="COLOR: #0000ff">&lt;?</SPAN><SPAN style="COLOR: #ff00ff">xml&#160;version=&quot;1.0&quot;&#160;encoding=&quot;utf-8&quot;&#160;</SPAN><SPAN style="COLOR: #0000ff">?&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/></SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">CodeSnippet&#160;</SPAN><SPAN style="COLOR: #ff0000">Format</SPAN><SPAN style="COLOR: #0000ff">=&quot;1.0.0&quot;</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Header</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Title</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Function</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Title</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Shortcut</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">f</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Shortcut</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Description</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Expansion&#160;snippet&#160;for&#160;Function</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Description</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">SnippetTypes</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">SnippetType</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Expansion</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">SnippetType</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">SnippetTypes</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Header</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;<br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Snippet</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Declarations</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Literal&#160;</SPAN><SPAN style="COLOR: #ff0000">default</SPAN><SPAN style="COLOR: #0000ff">=&quot;true&quot;</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">ID</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">modifier</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">ID</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">ToolTip</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">modifier&#160;of&#160;a&#160;function</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">ToolTip</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Default</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">void</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Default</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Literal</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Literal&#160;</SPAN><SPAN style="COLOR: #ff0000">default</SPAN><SPAN style="COLOR: #0000ff">=&quot;true&quot;</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">ID</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">name</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">ID</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">ToolTip</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">function&#160;name</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">ToolTip</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Default</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">foo</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Default</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Literal</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Literal&#160;</SPAN><SPAN style="COLOR: #ff0000">default</SPAN><SPAN style="COLOR: #0000ff">=&quot;true&quot;</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">ID</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">arg</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">ID</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">ToolTip</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">argument&#160;list</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">ToolTip</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Default</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">int&#160;i</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Default</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Literal</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Declarations</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">Code&#160;</SPAN><SPAN style="COLOR: #ff0000">Language</SPAN><SPAN style="COLOR: #0000ff">=&quot;csharp&quot;</SPAN><SPAN style="COLOR: #ff0000">&#160;Format</SPAN><SPAN style="COLOR: #0000ff">=&quot;CData&quot;</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #0000ff">&lt;![CDATA[</SPAN><SPAN style="COLOR: #808080">$modifier$&#160;$name$($arg$)<br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$end$<br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">]]&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Code</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/>&#160;&#160;&#160;&#160;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">Snippet</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><br/><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"/></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">CodeSnippet</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN> 
    </DIV>
</DIV><br/>这个东东有一个BUG，本来想让那个argument list默认显示空白的，但是不知道为什么默认空白，那个输入区域就没了，只好搞了一个int i，下次再写一个无参的方法框架。<br/><br/>有了这两个，再加上系统原有的那些Code Expansion，按方向键的需求已经降到了最低，我觉得我有越来越懒的趋势。<IMG src="http://www.cnblogs.com/Emoticons/emsmilep.gif" align="absMiddle" border="0"/><img src ="http://www.cnblogs.com/Hush/aggbug/60152.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47988/" target="_blank">Firefox 3.5匆忙推出漏洞多 Mozilla本月将更新</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>VC2005中依然没有Refactoring和Code Expansion.</title><link>http://www.cnblogs.com/Hush/archive/2004/11/03/60089.html</link><dc:creator>Justin Shen</dc:creator><author>Justin Shen</author><pubDate>Wed, 03 Nov 2004 11:47:00 GMT</pubDate><guid>http://www.cnblogs.com/Hush/archive/2004/11/03/60089.html</guid><wfw:comment>http://www.cnblogs.com/Hush/comments/60089.html</wfw:comment><comments>http://www.cnblogs.com/Hush/archive/2004/11/03/60089.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/Hush/comments/commentRss/60089.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Hush/services/trackbacks/60089.html</trackback:ping><description><![CDATA[<P>我在私有新闻组里询问VC2005里是不是会有Refactoring或者Code Expansion的功能，结果得到如下的回复，真是十分遗憾：<br/><br/><br/>Unfortunately, we won&#39;t be able to support refactoring or code expansion in <br/>the Whidbey timeframe.&#160; However, we will definitely be revisiting and <br/>considering the feature set for our next release.&#160; It&#39;s an important <br/>customer request, and we&#39;d like to implement it if possible.<br/><br/>--<br/>cheers,<br/>Ami Vora<br/>Program Manager, Visual C++<br/>
</P><img src ="http://www.cnblogs.com/Hush/aggbug/60089.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47988/" target="_blank">Firefox 3.5匆忙推出漏洞多 Mozilla本月将更新</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item></channel></rss>