<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_SolidMango</title><subtitle type="text">Arithmetics/Patterns/Languages---1 and 0 are the whole world, but 1 and 0 are not enough..  </subtitle><id>http://feed.cnblogs.com/blog/u/56092/rss</id><updated>2012-02-10T10:29:58Z</updated><author><name>SolidMango</name><uri>http://www.cnblogs.com/pugang/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/pugang/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/56092/rss"/><entry><id>http://www.cnblogs.com/pugang/archive/2012/02/10/2345942.html</id><title type="text">《Effective STL》读书总结--关于STL 你不一定都懂的</title><summary type="text">春节期间一次用手机上网无意间发现了这本书，说起来还得感谢智能手机的发展，有时候还是很方便的。当时随便的翻了几页，于是我停不下来了，因为我发现原来我不知道的东西太多了。我第一次接触STL的时候大约在7年前，那个时候刚从C语言转到C++，记得那个时候知道了STL 的vector, list, map, 但是只是把这些东西当作C++的语法，一带而过，用的时候查查文档，只要逻辑和结果对了就OK，到处是for循环，到处是迭代器，现在回想起来的感触是：… 没文化，真可怕。第二次我想深入学习STL的时候是研究生毕业以后，记得那个时候刚入行，公司的产品出现了一个问题，是关于STL 的一个容器的erase() </summary><published>2012-02-10T10:30:00Z</published><updated>2012-02-10T10:30:00Z</updated><author><name>SolidMango</name><uri>http://www.cnblogs.com/pugang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/pugang/archive/2012/02/10/2345942.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/pugang/archive/2012/02/10/2345942.html"/><content type="html">&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="font-family: SimSun"&gt;春节期间一次用手机上网无意间发现了这本书，说起来还得感谢智能手机的发展，有时候还是很方便的。当时随便的翻了几页，于是我停不下来了，因为我发现原来我不知道的东西太多了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="font-family: SimSun"&gt;我第一次接触&lt;/span&gt;STL&lt;span style="font-family: SimSun"&gt;的时候大约在&lt;/span&gt;7&lt;span style="font-family: SimSun"&gt;年前，那个时候刚从&lt;/span&gt;C&lt;span style="font-family: SimSun"&gt;语言转到&lt;/span&gt;C++&lt;span style="font-family: SimSun"&gt;，记得那个时候知道了&lt;/span&gt;STL &lt;span style="font-family: SimSun"&gt;的&lt;/span&gt;vector, list, map, &lt;span style="font-family: SimSun"&gt;但是只是把这些东西当作&lt;/span&gt;C++&lt;span style="font-family: SimSun"&gt;的语法，一带而过，用的时候查查文档，只要逻辑和结果对了就&lt;/span&gt;OK&lt;span style="font-family: SimSun"&gt;，到处是&lt;/span&gt;for&lt;span style="font-family: SimSun"&gt;循环，到处是迭代器，现在回想起来的感触是：&lt;/span&gt;&amp;#8230; &lt;span style="font-family: SimSun"&gt;没文化，真可怕。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="font-family: SimSun"&gt;第二次我想深入学习&lt;/span&gt;STL&lt;span style="font-family: SimSun"&gt;的时候是研究生毕业以后，记得那个时候刚入行，公司的产品出现了一个问题，是关于&lt;/span&gt;STL &lt;span style="font-family: SimSun"&gt;的一个容器的&lt;/span&gt;erase() &lt;span style="font-family: SimSun"&gt;方法调用问题，自己搞了半天才看懂，原来这一个特殊的情况下，这种用法有问题。为了扫清这类问题，我决定深入的学习一下&lt;/span&gt;STL&lt;span style="font-family: SimSun"&gt;。当时找到了一本侯捷翻译的《&lt;/span&gt;STL &lt;span style="font-family: SimSun"&gt;源码剖析》，说实话，这本书写的真不错，但是他写的有点枯燥，迭代器，分配器&lt;/span&gt;&amp;#8230; &lt;span style="font-family: SimSun"&gt;你没点坚定的毅力说不定就败给他了，我花了一个月的时间&lt;/span&gt;(&lt;span style="font-family: SimSun"&gt;下班后&lt;/span&gt;) &lt;span style="font-family: SimSun"&gt;才啃完这本书，不敢说&lt;/span&gt;100% &lt;span style="font-family: SimSun"&gt;扫平，&lt;/span&gt;80%&lt;span style="font-family: SimSun"&gt;还是有的，但是当我读完的时候，我发现这并不是我想要的，我虽然理解了作者要表达的东西，读懂了分配器，迭代器的原理，但是在我的工作中用到的地方并不多。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="font-family: SimSun"&gt;第三次，也就是这次，当我看到《&lt;/span&gt;Effective STL&lt;span style="font-family: SimSun"&gt;》的时候，我的感触是相见恨晚，做&lt;/span&gt;C++&lt;span style="font-family: SimSun"&gt;开发要是不知道这些东西，显然不够格。其实每种技术都有他自己的特点，都有他自己的取舍，你如果想使用&lt;/span&gt;STL&lt;span style="font-family: SimSun"&gt;就要按照他的方式来玩，我们平时的主官感觉对&lt;/span&gt;STL&lt;span style="font-family: SimSun"&gt;来说并不一定都适用。什么时候用什么容器，什么时候用什么迭代器，什么时候用什么算法，什么时候不该用循环，这本书都做了解答，可以不夸张的说，这本书看过了才能说自己会用&lt;/span&gt;STL&lt;span style="font-family: SimSun"&gt;了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="font-family: SimSun"&gt;当然我们要承认，这个世界是有高人的，如果您能正确的回答我下面的几个问题，那估计您不需要读了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -0.25in; margin: 0in 0in 0pt 0.5in"&gt;&lt;span&gt;1.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;STL &lt;span style="font-family: SimSun"&gt;标准序列容器和关联容器都是什么？有什么区别？非标准的呢？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -0.25in; margin: 0in 0in 0pt 0.5in"&gt;&lt;span&gt;2.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;STL &lt;span style="font-family: SimSun"&gt;迭代器有几种都有什么区别？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -0.25in; margin: 0in 0in 0pt 0.5in"&gt;&lt;span&gt;3.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun"&gt;在什么情况下用什么容器？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -0.25in; margin: 0in 0in 0pt 0.5in"&gt;&lt;span&gt;4.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun"&gt;什么情况下&lt;/span&gt;vector&lt;span style="font-family: SimSun"&gt;可以比&lt;/span&gt;map&lt;span style="font-family: SimSun"&gt;效率高？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -0.25in; margin: 0in 0in 0pt 0.5in"&gt;&lt;span&gt;5.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun"&gt;如何写一个自己的内存分配器？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -0.25in; margin: 0in 0in 0pt 0.5in"&gt;&lt;span&gt;6.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun"&gt;如何调整&lt;/span&gt;vector&lt;span style="font-family: SimSun"&gt;的内存容量，节省内存？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -0.25in; margin: 0in 0in 0pt 0.5in"&gt;&lt;span&gt;7.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun"&gt;如何修改&lt;/span&gt;multiset&lt;span style="font-family: SimSun"&gt;的键？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -0.25in; margin: 0in 0in 10pt 0.5in"&gt;&lt;span&gt;8.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun"&gt;如何写仿函数类？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="font-family: SimSun"&gt;如果您不用上网查就都知道答案，那么恭喜您，您是&lt;/span&gt;STL&lt;span style="font-family: SimSun"&gt;大牛。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="font-family: SimSun"&gt;如果您懂超过&lt;/span&gt;5&lt;span style="font-family: SimSun"&gt;个，那么同样恭喜您，您至少算个合格的高级工程师。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="font-family: SimSun"&gt;如果您对超过一半都不知所措，那您也该考虑充充电了。&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/pugang/aggbug/2345942.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/pugang/archive/2012/02/10/2345942.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/pugang/archive/2012/01/18/2325695.html</id><title type="text">2011总结，2012展望，生活技术都不能少</title><summary type="text">2011总结，2012展望，生活技术都不能少转眼间2012年已悄然来临，春节将至，和大部分的朋友一样，有感于时光飞逝，在这个特别的阶段总想总结一下过去，并展望一下美好的未来，为新的一年做个规划。总结身体是革命的本钱，先来说说身体，2011年基本能保证每周打一次羽毛球，一次篮球，每次各两个小时，打完球洗个温水澡，睡个懒觉，这也许就是人生最大的追求了。外语方面，英语水平稳中有升，单词量也多了一些，本来年初的时候有计划把日语捡起来，后来因为时间不够，没能实施，做个trilingual的中国牛，不容易啊..技术方面，主要精力集中在windows开发方面，正如有些兄弟说的，技术这个东西，你每做一次都会有</summary><published>2012-01-18T08:10:00Z</published><updated>2012-01-18T08:10:00Z</updated><author><name>SolidMango</name><uri>http://www.cnblogs.com/pugang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/pugang/archive/2012/01/18/2325695.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/pugang/archive/2012/01/18/2325695.html"/><content type="html">&lt;p style="margin: 0in 0in 10pt"&gt;&lt;strong&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 16pt"&gt;2011&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 16pt"&gt;总结，&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 16pt"&gt;2012&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 16pt"&gt;展望，生活技术都不能少&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 16pt"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;转眼间&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;2012&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;年已悄然来临，春节将至，和大部分的朋友一样，有感于时光飞逝，在这个特别的阶段总想总结一下过去，并展望一下美好的未来，为新的一年做个规划。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;strong&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 16pt"&gt;总结&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;身体是革命的本钱，先来说说身体，&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;2011&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;年基本能保证每周打一次羽毛球，一次篮球，每次各两个小时，打完球洗个温水澡，睡个懒觉，这也许就是人生最大的追求了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;外语方面，英语水平稳中有升，单词量也多了一些，本来年初的时候有计划把日语捡起来，后来因为时间不够，没能实施，做个&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;&lt;a href="http://www.cnblogs.com/pugang/admin/javascript:;"&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none"&gt;trilingual&lt;/span&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;的中国牛，不容易啊&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;..&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;技术方面，主要精力集中在&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;windows&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;开发方面，正如有些兄弟说的，技术这个东西，你每做一次都会有更深入的理解。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;2011&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;年重温了《&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;Effective C++&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;》《&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;More Effective C++&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;》《组件对象模型》《&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;COM&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;本质论》对&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;C++&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;的理解和以前的自己比，应该算是更上一层楼了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;.NET &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;方面通读和挑选了几本中英文的书籍，重点挑选自己以前没注意的和忽略的技术进行研究主要包括：&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;Linq to object, &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;闭包，协变逆变，以及&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;WCF&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;，其中&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;WCF&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;我只进行了相关的技术学习，写了一些测试的&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;Demo&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;，由于在实际的项目实施中没机会使用，感觉还欠火候，准备有时间继续学习。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;调试技术方面，不管实时调试还是事后调试，就非托管代码而言，在什么情况下该用什么样的工具，遇到什么样的问题如何处理可以说已经了然于胸，剩下的只有积累经验，多做多学，其实就是这样，付出越多收获才会越多，不是谁天生就比别人牛很多，都是良性循环的积累的。非托管代码是努力的目标，新的一年准备做一些&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;SOS&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;方面的学习。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;基础知识方面，本来年初计划把剩下的一些《算法导论》的内容读完，但是还是没坚持下来，有些算法确实有些晦涩，而且不常用，作为兴趣爱好，时间不够只能往后排，不过也不是完全没有收获，读了一本《数据结构算法与应用&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;C&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;语言描述》，至少常用的数据结构知识又重新温习了一遍。新的一年打算重新研究一些编译原理，重新读一遍龙书，上学的时候是挑着读的，这次打算研读一番&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;..&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;技术类比和知识扩展方面，&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;2011&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;年出于兴趣和好奇，读了《&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;Learning Python&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;》《&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;JavaScript &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;高级编程》&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;, &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;其实工作中这两种技术很少使用，但是经常听见圈里的朋友提起，所以就尝试着学习一下，东西不难，但是值得借鉴的地方还是不少的。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;Linux &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;方面本来计划&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;2011&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;年找个开源的项目跟进一下，一是为开源社区做些贡献，另一方面自己也可以学习一下工作中接触不到的东西，尝试过几次，但是始终没有找到&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;Linux&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;下面规模适合的开源的项目，也可能是小弟没太用心，一直没有找到，如果哪位兄弟了解希望多多指教，在整个&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;2011&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;年，&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;Linux&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;方面只是学习了标准的&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;Make file&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;的写法，&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;Shell, GDB , &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;进步有限，希望在新的一年里能多花些精力在上面。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;Java &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;代码&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;2011&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;年写的也很少，作为与&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;.net &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;的类比，他们实在有太多的相似，&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;2011&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;年一年在&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;Java&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;方面的收获仅限于《&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;Java &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;核心技术》&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;I&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;卷通读一遍，算是温故知新吧。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;strong&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 16pt"&gt;展望&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;身体始终是第一位的，&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;2011&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;年的锻炼至少在量上面还是比较成功的，新的一年要再接再厉，锻炼不能只为出点汗，羽毛球和篮球的球技是该提高的时候了，有时间多向高手学习一下，看看相关的视频，请请教练，生活本来可以更美好的&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;, &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;另外如果时间允许希望可以把游泳学了，这个要真是&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;2012&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;年底就世界末日，小弟还不会游泳呢&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;..&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;英语方面，希望在词汇，听力，口语方面有所突破，现在虽然和外国友人交流没什么问题，但是总觉得不知道该说些什么好，有待提高啊，如果有时间，日语还是最好学习一下，谁知道哪天日本又出什么&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;NB&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;动画片了，不懂日语就&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;out &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;技术方面，&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;C/C++ &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;不想再读新书了，除非有特别好的，可以打动我，我希望把手里面的&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;C/C++ &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;方面的书籍和资料整理一些，温故知新，相信量已经到了，希望籍此发生质变。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;调试技术方面水还是很深的，非托管代码的调试技术需要加强，做更多的项目时注意积累这方面的经验，相关的技术知识从新整理一遍，托管代码的&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;SOS&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;是自己今年的主要的扩展方向。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;.NET &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;方面，因为这个是工作的主攻方向，准备选择&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;1&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;，&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;2&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;本书总结一下相关的知识，扫清盲点，特别是内部机理方面的知识。&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;WCF&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;需要大彻大悟啦，估计项目马上就会使用这方面的知识。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;基础知识方面《算法导论》需要读完，另外编译原理的英文版龙书需要研读一遍，翻译版的龙书实在不敢恭维。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;技术类比和扩展方面如果有感兴趣的东西，希望有时间可以选择&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;1&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;到&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;2&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;种进行学习。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;Linux&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;开发和&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;Java&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;开发希望在今年可以跟进一两个开源的项目。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;软件开发的上层建筑设计模式和&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;UML&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;一直在学习，但是感觉还是不能游刃有余，估计是这方面做的想得都不够，所以这方面要努力啊，新的一年希望可以透彻的运用这两项技能，把以前看过的资料和做过的项目都总结一下，尽量画&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;UML&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;，如果可能的话做一下相关的改进。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;写了不少，算是给今年画个完整的结束吧&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;天行健，君子自强不息，愿大家过个欢乐祥和的春节&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Times New Roman','serif'; font-size: 12pt"&gt;&amp;#8230;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/pugang/aggbug/2325695.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/pugang/archive/2012/01/18/2325695.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/pugang/archive/2011/11/26/2264107.html</id><title type="text">Windows程序员需要学什么</title><summary type="text">经常发现有人在网上提出这样的问题，现实中也确实有不少人在经历了3-5年的Windows开发之后就开始迷失方向，每天浑浑噩噩混日子，可能是因为这个问题粒度太大，没人愿意花时间回答，希望本文可以抛砖引玉，给大家节省些时间，同时也希望园子里面的兄弟们能尽力的补充，从而使这篇文章可以帮助更多的后来人。 首先说明的是，本文提到的各种技术不分先后，没有顺序，虽然先学什么，再学什么对某些人来说可能更方便，但是这些都不是绝对的，因为每个人的情况不同。 Windows开发首先必须学习的就是操作系统的API，因为其他的一切都是构建于OS之上，所谓九层之台，起于垒土，如果你对linux的系统调用很熟悉就会发现其..</summary><published>2011-11-26T02:45:00Z</published><updated>2011-11-26T02:45:00Z</updated><author><name>SolidMango</name><uri>http://www.cnblogs.com/pugang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/pugang/archive/2011/11/26/2264107.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/pugang/archive/2011/11/26/2264107.html"/><content type="html">&lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;经常发现有人在网上提出这样的问题，现实中也确实有不少人在经历了&lt;/span&gt;3-5&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;年的&lt;/span&gt;Windows&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;开发之后就开始迷失方向，每天浑浑噩噩混日子，可能是因为这个问题粒度太大，没人愿意花时间回答，希望本文可以抛砖引玉，给大家节省些时间，同时也希望园子里面的兄弟们能尽力的补充，从而使这篇文章可以帮助更多的后来人。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;首先说明的是，本文提到的各种技术不分先后，没有顺序，虽然先学什么，再学什么对某些人来说可能更方便，但是这些都不是绝对的，因为每个人的情况不同。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Windows&lt;span style="font-family: 宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;开发首先必须学习的就是操作系统的&lt;/span&gt;API&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;，因为其他的一切都是构建于&lt;/span&gt;OS&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;之上，所谓九层之台，起于垒土，如果你对&lt;/span&gt;linux&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;的系统调用很熟悉就会发现其实他们大同小异，都是应用程序在使用系统提供的功能。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;接下来是&lt;/span&gt;MFC&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;，有了&lt;/span&gt;MFC&lt;span style="font-family: 宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;你才真正的可以干点开发，因为&lt;/span&gt;MFC&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;实在是太全了，几乎封装了所有的&lt;/span&gt;Windows API, &lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;消息循环，&lt;/span&gt;COM&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;实现&lt;/span&gt;&amp;#8230;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;到了此地，你可以开始学习调试技术了，熟悉了调试的各种技巧才可以做到事半功倍，得心应手。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;接下来是组建对象模型&lt;/span&gt;COM&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;，作为&lt;/span&gt;windows&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;的基石，不懂&lt;/span&gt;COM&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;，很难说自己精通&lt;/span&gt;windows&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;编程，因为即使现在的&lt;/span&gt;.NET framework&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;也是构建于&lt;/span&gt;COM&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;之上，很多问题还是需要&lt;/span&gt;SOS&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;到底层去调试。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;当你懂得了&lt;/span&gt;COM&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;的精髓，你应该开始学习&lt;/span&gt;ATL&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;了，这个类库可以使你的&lt;/span&gt;COM&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;开发更加得心应手。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;说到&lt;/span&gt;ATL&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;就不能不提到他的前辈&lt;/span&gt;STL&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;，这个出自于标准&lt;/span&gt;C++&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;的类库在&lt;/span&gt;windows&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;上同样也得到了很好的支持，有了&lt;/span&gt;STL&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;在你有一天想转&lt;/span&gt;linux&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;开发也同样会用得上。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Windows 8&lt;span style="font-family: 宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;中的&lt;/span&gt;WinRT&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;现在还没有应用于实际开发，现有的技术中&lt;/span&gt;.NET &lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;是非常值得学习的，因为&lt;/span&gt;.NET &lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;的主旨是提高程序员的开发效率，在这个浮躁的世界，开发效率有时候能够代表一切。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;从&lt;/span&gt;COM&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;到&lt;/span&gt;.NET&lt;span style="font-family: 宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;只有一步之遥，&lt;/span&gt;.NET &lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;其实是从&lt;/span&gt;COM+&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;演化而来，具体细节请参看&lt;/span&gt; Don Box&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;的《&lt;/span&gt;.NET &lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;本质论》了解了这些会使你对&lt;/span&gt;.NET&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;的认识上升到一个新的层面。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;接下来是&lt;/span&gt;C# &lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;因为这家伙是&lt;/span&gt;.NET&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;的嫡系部队，除了&lt;/span&gt;IL&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;，这家伙可以说和&lt;/span&gt;.NET &lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;的关系最为亲近，大部分的新功能都会最先在其中加以体现。当你熟悉了&lt;/span&gt;C#&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;，&lt;/span&gt; BCL&lt;span style="font-family: 宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;，《&lt;/span&gt;CLR via C#&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;》可以说这个时候你已经可以胜任基本的&lt;/span&gt;C#&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;开发了，可以很快写出一个小工具，完成一个相关的&lt;/span&gt;task&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;接下来是&lt;/span&gt;WCF&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;和&lt;/span&gt;WPF&lt;span style="font-family: 宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;，做分布式开发少不了&lt;/span&gt;WCF&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;，同样华丽的界面少不了&lt;/span&gt;XAML&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;，&lt;/span&gt;WPF&lt;span style="font-family: 宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;大概罗列了一些，其实每个主题仔细探究下去都很有韵味，还有需要说的是，其实&lt;/span&gt;Windows&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;上面好多的东西都和&lt;/span&gt;UNIX&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;很像，比如&lt;/span&gt;PowerShell&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;明显是为了像&lt;/span&gt;UNIX&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;一样，给开发者提供一个更强大的&lt;/span&gt;shell, &lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;如果有兴趣，触类旁通一下，也很是有趣。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;还有：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;LINQ&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;改变了我们的数据操作方式，统一了数据操作模型，经常操作数据的兄弟，你值得拥有。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;F#&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;作为一种函数式编程语言也很值得研究，由于本人使用不多，在此不作评价。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;另外：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;作为基础的算法；&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;作为提升功力的设计模式，&lt;/span&gt;UML&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;；&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;作为改善系统性能的重构；&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;作为大部分分布式核心的&lt;/span&gt;TCP/IP&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;；&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;等等主题也是值得大家研究的。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;最后借鲁迅的话收尾：其实地上本没有路，走的人多了也便成了路，希望大家不要把时间都浪费了，原来还有好多东西可以去钻研。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;不当之处望大家批评、指正、拍砖&lt;/span&gt;, &lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;并提出您的宝贵的意见和补充。&lt;/span&gt;&lt;/p&gt; &lt;img src="http://www.cnblogs.com/pugang/aggbug/2264107.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/pugang/archive/2011/11/26/2264107.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/pugang/archive/2011/11/16/2251155.html</id><title type="text">C# 语言表现树形结构—TreeView高级用法指南</title><summary type="text">最近由于项目的关系，对Microsoft在各种编程语言中提供的TreeView控件做了一些研究。最初在网上查了一下，除了Microsoft的MSDN有些分散的knowledge, 并没有发现有这方面主题文章，于是有了写这篇文章的想法，希望可以抛砖引玉，让后来人少走些弯路。出于个人兴趣的关系，我主要对Microsoft Visual C++ 和C#两种语言中的TreeView控件进行了相应的研究，在这两种语言中，对于TreeView控件的基本用法本文不做说明，相对高级的用法主要是为TreeItem设置静态图标和选中图标，dragand drop操作，由于C#中的TreeView控件是所有微软提供</summary><published>2011-11-16T05:52:00Z</published><updated>2011-11-16T05:52:00Z</updated><author><name>SolidMango</name><uri>http://www.cnblogs.com/pugang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/pugang/archive/2011/11/16/2251155.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/pugang/archive/2011/11/16/2251155.html"/><content type="html">&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;最近由于项目的关系，对&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;Microsoft&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;在各种编程语言中提供的&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;TreeView&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;控件做了一些研究。最初在网上查了一下，除了&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;Microsoft&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;的&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;MSDN&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;有些分散的&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;knowledge, &lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;并没有发现有这方面主题文章，于是有了写这篇文章的想法，希望可以抛砖引玉，让后来人少走些弯路。&lt;/span&gt;&lt;span style="line-height: 115%; font-size: 10pt"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;出于个人兴趣的关系，我主要对&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;Microsoft &amp;nbsp;Visual C++ &lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;和&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;C#&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;两种语言中的&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;TreeView&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;控件进行了相应的研究，在这两种语言中，对于&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;TreeView&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;控件的基本用法本文不做说明，相对高级的用法主要是为&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;TreeItem&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;设置静态图标和选中图标，&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;drag&amp;nbsp;and drop&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;操作，由于&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;C#&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;中的&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;TreeView&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;控件是所有微软提供的&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;TreeView&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;控件中相对完整，而且设计相对优雅的一个，下面以&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;C#&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;中&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;TreeView&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;控件为例就相应的主题分别说明。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;先来看看&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;MSDN&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;上给&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;C# TreeView&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;控件的定义：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 10pt"&gt;&lt;strong&gt;&lt;span style="font-family: 'Calibri','sans-serif'; font-size: 14pt"&gt;Displays a hierarchical collection of labeled items,&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 'Calibri','sans-serif'; font-size: 14pt"&gt;each represented by a &lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span style="color: windowtext; font-size: 14pt"&gt;TreeNode.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;翻译：表现一组有继承结构关系的带有标签的项的集合，每个标签项由&lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span style="color: windowtext"&gt;&lt;strong&gt;&lt;font size="2" face="Calibri"&gt;&lt;span style="font-family: Arial; font-size: 12pt"&gt;TreeNode&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;来表现。也就是说&lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span style="color: windowtext"&gt;&lt;strong&gt;&lt;font size="2" face="Calibri"&gt;&lt;span style="font-family: Arial; font-size: 12pt"&gt;TreeNode&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;表现树的节点，主要工作由它来承担。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;strong&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 18pt"&gt;那么如何为&lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span style="color: windowtext"&gt;&lt;strong&gt;&lt;font size="2" face="Calibri"&gt;&lt;span style="font-size: 18pt"&gt;TreeNode&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 18pt"&gt;设置图像呢？&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="line-height: 115%; font-size: 12pt"&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;如下文字来自&lt;/span&gt;&lt;span style="line-height: 115%; font-size: 12pt"&gt;MSDN&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt"&gt;：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;可以在树节点旁显示图像，方法是将一个&lt;/span&gt;&lt;span style="line-height: 115%; color: #1f497d; font-size: 10pt"&gt; ImageList &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;分配给&lt;/span&gt;&lt;span style="line-height: 115%; color: #1f497d; font-size: 10pt"&gt; ImageList &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;属性，然后通过引用&lt;/span&gt;&lt;span style="line-height: 115%; color: #1f497d; font-size: 10pt"&gt; Image &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;在&lt;/span&gt;&lt;span style="line-height: 115%; color: #1f497d; font-size: 10pt"&gt; ImageList &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;中的索引值来分配该&lt;/span&gt;&lt;span style="line-height: 115%; color: #1f497d; font-size: 10pt"&gt; Image&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;使用下面的属性分配图像：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;将&lt;/span&gt;&lt;span style="line-height: 115%; color: #1f497d; font-size: 10pt"&gt; ImageIndex &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;属性设置为当树节点未选定时所显示的&lt;/span&gt;&lt;span style="line-height: 115%; color: #1f497d; font-size: 10pt"&gt; Image &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;的索引值。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;将&lt;/span&gt;&lt;span style="line-height: 115%; color: #1f497d; font-size: 10pt"&gt; SelectedImageIndex &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;属性设置为当树节点被选定时要显示的&lt;/span&gt;&lt;span style="line-height: 115%; color: #1f497d; font-size: 10pt"&gt; Image &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;的索引值。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; color: #1f497d; font-size: 10pt"&gt;ImageIndex &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;和&lt;/span&gt;&lt;span style="line-height: 115%; color: #1f497d; font-size: 10pt"&gt; SelectedImageIndex &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;属性值所引用的图像是所有分配给&lt;/span&gt;&lt;span style="line-height: 115%; color: #1f497d; font-size: 10pt"&gt; Nodes &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;集合的树节点显示的默认图像。&lt;/span&gt; &lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;每个树节点都可以通过设置&lt;/span&gt;&lt;span style="line-height: 115%; color: #1f497d; font-size: 10pt"&gt; TreeNode.ImageIndex &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;和&lt;/span&gt;&lt;span style="line-height: 115%; color: #1f497d; font-size: 10pt"&gt; TreeNode.SelectedImageIndex &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: #1f497d; font-size: 10pt"&gt;属性来取代默认的图像。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;看完了这段文字，你知道该如何操作了么？我觉得可能有好多人还是不是完全的理解，那我们就已程序员的语言来描述一下吧:&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 10pt"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;首先定义一个&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;ImageList&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;变量并将其赋值给&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;TreeView&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;的&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;ImageList&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;，&lt;/span&gt;&lt;span style="line-height: 115%; font-size: 10pt"&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080; font-size: 10pt"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff; font-size: 10pt"&gt;private&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;System.Windows.Forms.ImageList&amp;nbsp;imageList007;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080; font-size: 10pt"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff; font-size: 10pt"&gt;this&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;.imageList007&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;new&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;System.Windows.Forms.ImageList(&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;this&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;.components);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080; font-size: 10pt"&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff; font-size: 10pt"&gt;this&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;.treeView1.ImageList&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;this&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;.imageList007;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt" &gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 10pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast" lang="ZH-CN"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt" &gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast" lang="ZH-CN"&gt;然后需要对图标进行设置,&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt" &gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 10pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast" lang="ZH-CN"&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;this&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;.imageList007.ImageStream&amp;nbsp;=&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="font-size: 10pt"&gt;((System.Windows.Forms.ImageListStreamer)(resources.GetObject(&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;imageList007.ImageStream&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;)));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;this&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;.imageList007.TransparentColor&amp;nbsp;=&amp;nbsp;System.Drawing.Color.Transparent;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;this&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;.imageList007.Images.SetKeyName(&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;Icon01.ico&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;this&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;.imageList007.Images.SetKeyName(&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt"&gt;1&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;Icon02.ico&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;this&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;.imageList007.Images.SetKeyName(&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt"&gt;2&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;Icon03.ico&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;this&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;.imageList007.Images.SetKeyName(&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt"&gt;3&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;Icon04.ico&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;this&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;.imageList007.Images.SetKeyName(&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt"&gt;4&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;Icon05.ico&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt" &gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 10pt"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt" &gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;最后可以对&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;TreeView &lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;的&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;ImageIndex &lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;和&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt; SelectedImageIndex &lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;属性进行相应的设置，选择相应的图像，也可以对每个动态生成的节点进行独立的图像设置，到此你已经成功的设置了&lt;/span&gt;&lt;span style="line-height: 115%; font-size: 10pt"&gt;&lt;span style="font-family: Arial; color: windowtext; font-size: 12pt"&gt;TreeNode&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;的图像。&lt;/span&gt;&lt;span style="line-height: 115%; font-size: 10pt"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;strong&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 18pt"&gt;那又如何实现&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="line-height: 115%; font-size: 18pt"&gt;Drag and Drop &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 18pt"&gt;操作呢？&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;首先我们需要清楚&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;Drag and Drop&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;的源和目标都是什么，也就是说从哪向哪拖拽，每个部分承担的职责是什么，而只有在源和目标上都做了相应的处理，拖拽过程才可能是完整有效的。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;strong&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;源组件处理：&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;ItemDrag&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;事件&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;: &lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;当鼠标开始对源树节点进行拖拽的时候，会引发这个事件，也就是说这个事件的发出者应该是源组件，&lt;/span&gt; &lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;在这个事件处理函数中需要调用&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;DoDragDrop&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;方法&lt;/span&gt; &lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;初始化并开始一个拖拽过程。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;strong&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;目标组件处理：&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt"&gt;&lt;span style="font-family: Arial; font-size: 12pt"&gt;DragEnter&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 12pt"&gt;事件&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 12pt"&gt;: &lt;/span&gt;&lt;span style="font-family: Arial; font-size: 12pt"&gt;当初始化操作结束以后，我们需要在拖拽目标处处理&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 12pt"&gt;DragEnter&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 12pt"&gt;事件，这个事件发生在源节点被拖动到目标组件范围内的某个点的时候，在这个事件中我们可以对这个拖拽的合法性进行验证，并且设置不同的鼠标形状来表示不同的状态，&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 12pt"&gt;DragDropEffects &lt;/span&gt;&lt;span style="font-family: Arial; font-size: 12pt"&gt;结构用于对鼠标形状进行设置。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;strong&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;目标组件处理：&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;DragDrop &lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;事件&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;: &lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;这个事件用于在目标组件中处理拖拽事件，发生于源节点已经被拖拽到目的组件处，这时我们可以对拖拽过来的节点进行解析处理等实际工作。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-family: Arial; font-size: 12pt"&gt;注意&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: Arial; font-size: 12pt"&gt;:&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: Arial; font-size: 12pt"&gt;为了完成拖拽操作源组件和目标组件的&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: Arial; font-size: 12pt"&gt;AllowDrop&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: Arial; font-size: 12pt"&gt;都需要设置成&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: Arial; font-size: 12pt"&gt;true.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-family: Arial; font-size: 12pt"&gt;&lt;/span&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;示例代码，如下代码完成了将一个&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;TreeNode&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;拖拽到一个&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;Form&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt"&gt;上需要完成的工作：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff; font-size: 10pt"&gt;void&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;UsingTreeViewDemo_Load(&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;object&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;sender,&amp;nbsp;EventArgs&amp;nbsp;e)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff; font-size: 10pt"&gt;this&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;.treeView1.ItemDrag&amp;nbsp;+=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;new&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;System.Windows.Forms.ItemDragEventHandler(&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;this&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;.treeView_ItemDrag);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff; font-size: 10pt"&gt;this&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;.DragEnter&amp;nbsp;+=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;new&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;System.Windows.Forms.DragEventHandler(&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;this&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;.Form_DragEnter);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff; font-size: 10pt"&gt;this&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;.DragDrop&amp;nbsp;+=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;new&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;System.Windows.Forms.DragEventHandler(&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;this&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;.Form_DragDrop);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff; font-size: 10pt"&gt;void&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;treeView_ItemDrag(&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;object&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;sender,&amp;nbsp;System.Windows.Forms.ItemDragEventArgs&amp;nbsp;e)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DoDragDrop(e.Item,&amp;nbsp;DragDropEffects.Copy);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff; font-size: 10pt"&gt;void&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;Form_DragEnter(&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;object&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;sender,&amp;nbsp;System.Windows.Forms.DragEventArgs&amp;nbsp;e)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.Effect&amp;nbsp;=&amp;nbsp;DragDropEffects.Copy;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff; font-size: 10pt"&gt;void&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;Form_DragDrop(&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;object&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;sender,&amp;nbsp;System.Windows.Forms.DragEventArgs&amp;nbsp;e)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt"&gt;{&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TreeNode&amp;nbsp;NewNode;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff; font-size: 10pt"&gt;if&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;(e.Data.GetDataPresent(&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;System.Windows.Forms.TreeNode&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 10pt"&gt;false&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NewNode&amp;nbsp;=&amp;nbsp;(TreeNode)e.Data.GetData(&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;System.Windows.Forms.TreeNode&lt;/span&gt;&lt;span style="color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox.Show(NewNode.ToString());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt"&gt;}&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="font-size: 10pt"&gt;&lt;img style="width: 410px; height: 277px" border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/pugang/Drag_Drop.JPG" width="410" height="277" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 10pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast" lang="ZH-CN"&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt" &gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 12pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast" lang="ZH-CN"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt" &gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast" lang="ZH-CN"&gt;至此，本文的使命已经完成，相信大家已经熟悉了这两项相对高级的&lt;/span&gt;&lt;span style="line-height: 115%; font-size: 10pt"&gt;&lt;font face="Calibri"&gt;&lt;span style="font-family: Arial; font-size: 12pt"&gt;TreeView&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Arial; font-size: 12pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast" lang="ZH-CN"&gt;用法。欢迎大家就此主题互相讨论，并对本文的不当之处批评指正。&lt;/span&gt;&lt;span style="line-height: 115%; font-size: 10pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/pugang/aggbug/2251155.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/pugang/archive/2011/11/16/2251155.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/pugang/archive/2011/11/09/2242380.html</id><title type="text">一句话清晰总结协变和逆变</title><summary type="text">看到过园子里面几篇协变和逆变的文章，但是总觉得写得不够清晰，文章这东西注重要是要把自己想表达的观点表达出来，这个过程应该是把复杂的东西消化出来从而简单化，清晰化，而不是故弄玄虚，反其道而行之，下面我们言归正传啦。我们先来看一段MSDN原文给协变，逆变和变体下个定义：A generic interface or delegate is called variant if its generic parameters are declared covariant or contravariant. Both C# and Visual Basic enable you to create your</summary><published>2011-11-09T05:32:00Z</published><updated>2011-11-09T05:32:00Z</updated><author><name>SolidMango</name><uri>http://www.cnblogs.com/pugang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/pugang/archive/2011/11/09/2242380.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/pugang/archive/2011/11/09/2242380.html"/><content type="html">&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: black; font-size: 9.5pt"&gt;看到过园子里面几篇协变和逆变的文章，但是总觉得写得不够清晰，文章这东西注重要是要把自己想表达的观点表达出来，这个过程应该是把复杂的东西消化出来从而简单化，清晰化，而不是故弄玄虚，反其道而行之，下面我们言归正传啦。&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: black; font-size: 9.5pt"&gt;我们先来看一段&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt"&gt;MSDN&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: black; font-size: 9.5pt"&gt;原文给协变，逆变和变体下个定义：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt"&gt;A generic interface or delegate is called &lt;span style="line-height: 115%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt"&gt;&lt;em&gt;variant&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt"&gt; if its generic parameters are declared covariant or contravariant.&lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt"&gt; &lt;span id="src14_" jquery1608691023747590337="18"&gt;Both C# and Visual Basic enable you to create your own variant interfaces and delegates. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: black; font-size: 9.5pt"&gt;如果泛型接口或委托的泛型参数声明为协变或逆变，则将该泛型接口或委托称为&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt"&gt;&amp;#8220;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: black; font-size: 9.5pt"&gt;变体&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt"&gt;&amp;#8221;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: black; font-size: 9.5pt"&gt;。&lt;/span&gt;&lt;/span&gt; &lt;span id="xn14_55b9a7e0c49056829c0dcb2a3bfd4de8" jquery1607052494521579805="18"&gt;&lt;span style="line-height: 115%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt"&gt;C# &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: black; font-size: 9.5pt"&gt;和&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt"&gt; Visual Basic &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: black; font-size: 9.5pt"&gt;都允许您创建自己的变体接口和委&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: black; font-size: 9.5pt"&gt;托。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: black; font-size: 9.5pt"&gt;通俗解释：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;strong&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: black; font-size: 12pt"&gt;变体定义：带有协变或逆变参数的泛型接口或委托。也就是说协变和逆变主要关注点在泛型接口或委托。&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: black; font-size: 9.5pt"&gt;那什么又是协变和逆变呢？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: black; font-size: 9.5pt"&gt;我们先来看下面一个来自&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: black; font-size: 9.5pt"&gt;MSDN&lt;span&gt;的例子：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;协变&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;IEnumerable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;strings&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;List&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;();&lt;br /&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;IEnumerable&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;&amp;nbsp;objects&amp;nbsp;=&amp;nbsp;strings;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: SimSun; font-size: 9.5pt"&gt;大家看到了么一个声明为&lt;/span&gt;&lt;span style="font-size: 9.5pt"&gt;IEnumerable&amp;lt;&lt;span style="color: black"&gt;string&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; font-size: 9.5pt"&gt;的&lt;/span&gt; &lt;span style="font-family: SimSun; font-size: 9.5pt"&gt;接口类型被赋给了一个更低&lt;/span&gt; &lt;span style="font-family: SimSun; font-size: 9.5pt"&gt;级别的&lt;/span&gt;&lt;span style="font-size: 9.5pt"&gt;IEnumerable&amp;lt;&lt;span style="color: black"&gt;object&amp;gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: SimSun; font-size: 9.5pt"&gt;对，这就是协变。再来看一个例子：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: SimSun; font-size: 9.5pt"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: SimSun; font-size: 9.5pt"&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 8pt"&gt;class&lt;/span&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt; Base&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;{&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 8pt"&gt;public&lt;/span&gt; &lt;span style="font-family: Consolas; color: blue; font-size: 8pt"&gt;static&lt;/span&gt; &lt;span style="font-family: Consolas; color: blue; font-size: 8pt"&gt;void&lt;/span&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt; PrintBases(IEnumerable&amp;lt;Base&amp;gt; bases)&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 8pt"&gt;foreach&lt;/span&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;(Base b &lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 8pt"&gt;in&lt;/span&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt; bases)&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(b);&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;}&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 8pt"&gt;class&lt;/span&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt; Derived : Base&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;{&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 8pt"&gt;public&lt;/span&gt; &lt;span style="font-family: Consolas; color: blue; font-size: 8pt"&gt;static&lt;/span&gt; &lt;span style="font-family: Consolas; color: blue; font-size: 8pt"&gt;void&lt;/span&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt; Main()&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;Derived&amp;gt; dlist = &lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 8pt"&gt;new&lt;/span&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt; List&amp;lt;Derived&amp;gt;();&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Derived.PrintBases(dlist);&lt;/span&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;//&lt;/span&gt;&lt;span style="font-family: SimSun; color: black; font-size: 8pt"&gt;由于&lt;/span&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;IEnumerable&lt;/span&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;&amp;lt;T&amp;gt;&lt;/span&gt;&lt;span style="font-family: SimSun; color: black; font-size: 8pt"&gt;接口是协变的，所以&lt;/span&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;PrintBases(IEnumerable&amp;lt;Base&amp;gt; bases)&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; //&lt;/span&gt;&lt;span style="font-family: SimSun; color: black; font-size: 8pt"&gt;可以接收一个更加具体化的&lt;/span&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;IEnumerable&amp;lt;Derived&amp;gt;&lt;/span&gt;&lt;span style="font-family: SimSun; color: black; font-size: 8pt"&gt;作为其参数。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IEnumerable&amp;lt;Base&amp;gt; bIEnum = dlist;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;span style="font-family: Consolas; color: black; font-size: 8pt"&gt;}&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" &gt;&lt;span &gt;&lt;span style="font-family: SimSun; font-size: 9.5pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-bidi-font-family: SimSun; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin" lang="ZH-CN"&gt;下面给协变下个定义：&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-size: 9.5pt; mso-fareast-font-family: SimSun; mso-bidi-font-family: SimSun"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; word-break: break-all; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" &gt;&lt;span &gt;&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-family: SimSun; font-size: 12pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-bidi-font-family: SimSun; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin" lang="ZH-CN"&gt;协变：让一个带有协变参数的&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span &gt;&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-family: SimSun; color: black; font-size: 12pt; mso-bidi-font-family: SimSun" lang="ZH-CN"&gt;泛型接口（或委托）可以接收类型更加精细化，具体化的泛型接口（或委托）作为参数，可以看成&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span &gt;&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-family: SimSun; color: black; font-size: 12pt; mso-bidi-font-family: SimSun"&gt;OO&lt;span lang="ZH-CN"&gt;中多态的一个延伸。&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span &gt;&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-family: SimSun; font-size: 12pt; mso-bidi-font-family: SimSun"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;逆变&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Assume&amp;nbsp;that&amp;nbsp;the&amp;nbsp;following&amp;nbsp;method&amp;nbsp;is&amp;nbsp;in&amp;nbsp;the&amp;nbsp;class:&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;static&amp;nbsp;void&amp;nbsp;SetObject(object&amp;nbsp;o)&amp;nbsp;{&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;Action&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;&amp;nbsp;actObject&amp;nbsp;=&amp;nbsp;SetObject;&lt;br /&gt;Action&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;nbsp;actString&amp;nbsp;=&amp;nbsp;actObject;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;委托actString中以后要使用更加精细化的类型string不能再使用object啦！&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;strHello(&amp;#8220;Hello&amp;#8221;);&amp;nbsp;&lt;br /&gt;actString(strHello);&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 6.45pt; word-break: break-all"&gt;&lt;span style="font-family: SimSun; color: black; font-size: 10pt"&gt;大家看到了么？一个声明为&lt;/span&gt;&lt;span style="font-size: 9.5pt"&gt;Action&amp;lt;&lt;span style="color: black"&gt;object&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; font-size: 9.5pt"&gt;的类型被赋给了一个&lt;/span&gt;&lt;span style="font-size: 9.5pt"&gt;Action&amp;lt;&lt;span style="color: black"&gt;string&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; font-size: 9.5pt"&gt;，大家都知道，&lt;/span&gt;&lt;span style="font-size: 9.5pt"&gt;Action&amp;lt;T&amp;gt;&lt;/span&gt;&lt;span style="font-family: SimSun; font-size: 9.5pt"&gt;接收参数，没有返回值，所以其中的&lt;/span&gt;&lt;span style="color: black; font-size: 9.5pt"&gt;object&lt;/span&gt;&lt;span style="font-family: SimSun; color: black; font-size: 9.5pt"&gt;和&lt;/span&gt;&lt;span style="color: black; font-size: 9.5pt"&gt;string&lt;/span&gt;&lt;span style="font-family: SimSun; color: black; font-size: 9.5pt"&gt;是其参数，这个过程其实就是参数的约束更加强了，也就是说让参数类型更加精细化。下面我们来给逆变下个定义：&lt;/span&gt;&lt;span style="color: black; font-size: 9.5pt"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 6.45pt; word-break: break-all"&gt;&lt;strong&gt;&lt;span style="font-family: SimSun; color: black; font-size: 12pt"&gt;逆变：&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;让一个带有协变参数的&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: SimSun; color: black; font-size: 12pt"&gt;泛型接口（或委托）可以接收粒度更粗的泛型接口或委托作为参数，这个过程实际上是参数类型更加精细化的过程。&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 6.45pt; word-break: break-all"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt"&gt;&lt;strong&gt;&lt;span style="line-height: 115%; font-family: SimSun; color: black; font-size: 12pt"&gt;一句话总结：协变让一个粗粒度接口（或委托）可以接收一个更加具体的接口（或委托）作为参数（或返回值）；逆变让一个接口（或委托）的参数类型（或返回值）类型更加具体化，也就是参数类型更强，更明确。&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: SimSun; color: black; font-size: 9.5pt"&gt;通常，协变类型参数可用作委托的返回类型，而逆变类型参数可用作参数类型。&lt;/span&gt;&lt;/span&gt; &lt;span id="xn18_cc92d2f16796f599b760a7cb934c325d" jquery1605766059010653404="22"&gt;&lt;span style="font-family: SimSun; color: black; font-size: 9.5pt"&gt;对于接口，协变类型参数可用作接口的方法的返回类型，而逆变类型参数可用作接口的方法的参数类型。&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt; &lt;img src="http://www.cnblogs.com/pugang/aggbug/2242380.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/pugang/archive/2011/11/09/2242380.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/pugang/archive/2011/10/11/2207696.html</id><title type="text">.Net Framework的前世今生--各个版本的新增功能</title><summary type="text">1.0--3.5sp1http://msdn.microsoft.com/zh-cn/library/ms171868(v=VS.90).aspx4.0http://msdn.microsoft.com/zh-cn/library/ms171868(v=VS.100).aspx</summary><published>2011-10-11T11:20:00Z</published><updated>2011-10-11T11:20:00Z</updated><author><name>SolidMango</name><uri>http://www.cnblogs.com/pugang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/pugang/archive/2011/10/11/2207696.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/pugang/archive/2011/10/11/2207696.html"/><content type="html">&lt;p&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/ms171868(v=VS.90).aspx"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;1.0--3.5sp1&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/ms171868(v=VS.90).aspx"&gt;http://msdn.microsoft.com/zh-cn/library/ms171868(v=VS.90).aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;4.0&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/ms171868(v=VS.100).aspx"&gt;http://msdn.microsoft.com/zh-cn/library/ms171868(v=VS.100).aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/pugang/aggbug/2207696.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/pugang/archive/2011/10/11/2207696.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/pugang/archive/2011/10/10/2206582.html</id><title type="text">C# 编码约定</title><summary type="text">C# 语言规范没有定义编码标准。 但是，Microsoft 使用本主题中的这些指南开发示例和文档。 编码约定可实现以下目的：它们创建一致的代码外观，从而使读者可以关注内容而非布局。它们使读者能够根据以前的经验作出假设，从而更加快速地理解代码。有利于复制、更改和维护代码。演示 C# 最佳做法。命名约定 命名指南在 名称准则 中介绍。 您无需更改由 Visual Studio 设计器工具创建的对象的名称，就可以让它们符合指南。 在不包括 using 语句 的简短示例中，使用命名空间限定。 如果您知道默认情况下会将某命名空间导入项目中，则无需完全限定来自该命名空间的名称。 如果限定名称太长无法放入一</summary><published>2011-10-10T13:15:00Z</published><updated>2011-10-10T13:15:00Z</updated><author><name>SolidMango</name><uri>http://www.cnblogs.com/pugang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/pugang/archive/2011/10/10/2206582.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/pugang/archive/2011/10/10/2206582.html"/><content type="html">&lt;div style="clear: both"&gt;&lt;/div&gt;&#xD;
&lt;div id="mainSection"&gt;&#xD;
&lt;div id="mainBody"&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;span id="xn1_644696cb148de16bfaf2076a9186b7a8"  jquery1602720416778375502="5"&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=199552"&gt;&lt;font color="#1364c4"&gt;C# 语言规范&lt;/font&gt;&lt;/a&gt;没有定义编码标准。&lt;/span&gt; &lt;span id="xn2_116823c713bf842cd9ae947a23b48b27"  jquery1602720416778375502="6"&gt;但是，Microsoft 使用本主题中的这些指南开发示例和文档。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn3_8a7f1f66918956869ec16cb18d169c64"  jquery1602720416778375502="7"&gt;编码约定可实现以下目的：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn4_1d31c8dd84334b06e33321035302539a"  jquery1602720416778375502="8"&gt;它们创建一致的代码外观，从而使读者可以关注内容而非布局。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn5_7779fe9d9042cda6471c0daa4f3f08fb"  jquery1602720416778375502="9"&gt;它们使读者能够根据以前的经验作出假设，从而更加快速地理解代码。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn6_030a58458d9d4bffc6206444b8ab35ed"  jquery1602720416778375502="10"&gt;有利于复制、更改和维护代码。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn7_2def4ab0e1e65d01ed05d8aa70f3a651"  jquery1602720416778375502="11"&gt;演示 C# 最佳做法。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&#xD;
&lt;div xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div&gt;&lt;a  title="折叠" href="http://www.cnblogs.com/pugang/admin/javascript:void(0)"&gt;&lt;img  alt="" src="http://i.msdn.microsoft.com/Hash/030c41d9079671d09a62d8e2c1db6973.gif" /&gt;&lt;span &gt;&lt;strong&gt;&lt;font color="#3f529c" size="5"&gt;命名约定&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt; &#xD;
&lt;div &gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;a id="sectionToggle0" xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;/a&gt;&#xD;
&lt;ul xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn8_3d54ea132f03e9642a5bfb7d5a7c54f6"  jquery1602720416778375502="12"&gt;命名指南在 &lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/ms229002.aspx"&gt;&lt;font color="#1364c4"&gt;名称准则&lt;/font&gt;&lt;/a&gt;&lt;/span&gt; 中介绍。&lt;/span&gt; &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn9_adb8797f8415a8849072865b7b40c404"  jquery1602720416778375502="13"&gt;您无需更改由 Visual Studio 设计器工具创建的对象的名称，就可以让它们符合指南。&lt;/span&gt; &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn10_3832d84db39b68c4620e979a10fd1f17"  jquery1602720416778375502="14"&gt;在不包括 &lt;a href="http://msdn.microsoft.com/zh-cn/library/sf0df423.aspx"&gt;&lt;font color="#1364c4"&gt;using 语句&lt;/font&gt;&lt;/a&gt; 的简短示例中，使用命名空间限定。&lt;/span&gt; &lt;span id="xn11_d6801f9de6322ffe1227d97ce9cab5b1"  jquery1602720416778375502="15"&gt;如果您知道默认情况下会将某命名空间导入项目中，则无需完全限定来自该命名空间的名称。&lt;/span&gt; &lt;span id="xn12_bdfce243f920b4bf4efe3cb6c40992d7"  jquery1602720416778375502="16"&gt;如果限定名称太长无法放入一行，则可在点 (.) 后截断它，如以下示例所示。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div id="snippetGroup"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_27d136c9-82ab-4517-97d0-360fd6549a65" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; currentPerformanceCounterCategory = &lt;span style="color: blue"&gt;new&lt;/span&gt; System.Diagnostics.&#xD;
    PerformanceCounterCategory();&#xD;
&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div&gt;&lt;a  title="折叠" href="http://www.cnblogs.com/pugang/admin/javascript:void(0)" s_oid="javascript:void(0)" s_oidt="0"&gt;&lt;img  alt="" src="http://i.msdn.microsoft.com/Hash/030c41d9079671d09a62d8e2c1db6973.gif" /&gt;&lt;span &gt;&lt;strong&gt;&lt;font color="#3f529c" size="5"&gt;布局约定&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt; &#xD;
&lt;div &gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;a id="sectionToggle1" xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;/a&gt;&#xD;
&lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span id="xn13_2fb98ad7496f267cfc68a1aee2895f8e"  jquery1602720416778375502="17"&gt;好的布局使用格式设置来强调代码的结构，并使该代码更易于阅读。&lt;/span&gt; &lt;span id="xn14_ffa4e5b8081f706701b6bab84aa33738"  jquery1602720416778375502="18"&gt;Microsoft 示例符合以下约定：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;ul xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn15_5eab4da0e618b8b74416e0a35e297326"  jquery1602720416778375502="19"&gt;使用默认代码编辑器设置（智能缩进、四字符缩进、将制表符保存为空格）。&lt;/span&gt; &lt;span id="xn16_a28f3ff5a9ba0004c4f763f27a48d2fc"  jquery1602720416778375502="20"&gt;有关更多信息，请参见&lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/03864tbz.aspx"&gt;&lt;font color="#1364c4"&gt;&amp;#8220;选项&amp;#8221;对话框 -&amp;gt;&amp;#8220;文本编辑器&amp;#8221;-&amp;gt;&amp;#8220;C#&amp;#8221;-&amp;gt;&amp;#8220;格式设置&amp;#8221;&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;。&lt;/span&gt; &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn17_0ff180993318c23a7b6b0b05c1c79e6e"  jquery1602720416778375502="21"&gt;每行仅编写一个语句。&lt;/span&gt; &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn18_8beb7f11c7d08c94ee9acd9f3e72234a"  jquery1602720416778375502="22"&gt;每行仅编写一个声明。&lt;/span&gt; &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn19_5a528910b126358861077a0d6606a7c0"  jquery1602720416778375502="23"&gt;如果续行不自动缩进，将它们缩进一个制表位（四个空格）。&lt;/span&gt; &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn20_da58b8845dfdf98b39d1f4a276909e62"  jquery1602720416778375502="24"&gt;在方法定义和属性定义之间添加至少一个空白行。&lt;/span&gt; &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn21_9a500ac41dd8772132b1049d14d02cb1"  jquery1602720416778375502="25"&gt;使用括号突显表达式中的子句，如下面的代码所示。&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div id="snippetGroup1"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_45f4f7bc-4ffa-4621-b85c-715230f0251f" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; ((val1 &amp;gt; val2) &amp;amp;&amp;amp; (val1 &amp;gt; val3))&#xD;
{&#xD;
    &lt;span style="color: green"&gt;// Take appropriate action.&lt;/span&gt;&#xD;
}&#xD;
&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div&gt;&lt;a  title="折叠" href="http://www.cnblogs.com/pugang/admin/javascript:void(0)" s_oid="javascript:void(0)" s_oidt="0"&gt;&lt;img  alt="" src="http://i.msdn.microsoft.com/Hash/030c41d9079671d09a62d8e2c1db6973.gif" /&gt;&lt;span &gt;&lt;strong&gt;&lt;font color="#3f529c" size="5"&gt;注释约定&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt; &#xD;
&lt;div &gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;a id="sectionToggle2" xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;/a&gt;&#xD;
&lt;ul xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn22_56751a463322923bd212da7643bf49de"  jquery1602720416778375502="26"&gt;将注释放到另一行，而不要放在代码行的末尾。&lt;/span&gt; &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn23_a9009eee0bf75a5aa57f7a46de828d61"  jquery1602720416778375502="27"&gt;以大写字母作为注释文本的开头。&lt;/span&gt; &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn24_5ebd8487c79f68e6c2a66816f1941590"  jquery1602720416778375502="28"&gt;以句点结束注释文本。&lt;/span&gt; &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn25_ddb753438e30ffb374546d4185cb649c"  jquery1602720416778375502="29"&gt;在注释分隔符 (//) 和注释文本之间插入一个空格，如以下示例所示。&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div id="snippetGroup2"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_fa4fa670-89c5-4009-85a5-1c8aaabe4c47" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: green"&gt;// The following declaration creates a query. It does not run&lt;/span&gt;&#xD;
&lt;span style="color: green"&gt;// the query.&lt;/span&gt;&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn26_278a59e4b3a4e9dc0a16a97d6b474251"  jquery1602720416778375502="30"&gt;请勿在注释周围创建已设置格式的星号块。&lt;/span&gt; &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div&gt;&lt;a  title="折叠" href="http://www.cnblogs.com/pugang/admin/javascript:void(0)" s_oid="javascript:void(0)" s_oidt="0"&gt;&lt;img  alt="" src="http://i.msdn.microsoft.com/Hash/030c41d9079671d09a62d8e2c1db6973.gif" /&gt;&lt;span &gt;&lt;strong&gt;&lt;font color="#3f529c" size="5"&gt;语言指南&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt; &#xD;
&lt;div &gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;a id="sectionToggle3" xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;/a&gt;&#xD;
&lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span id="xn27_a4a4d906cf4bc4f0a557fe6cd2397a0c"  jquery1602720416778375502="31"&gt;以下各部分描述了 C# 团队准备代码示例时遵循的做法。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;String 数据类型&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn28_965b0a71bf122c45caa89f20c44b6453"  jquery1602720416778375502="32"&gt;使用 &lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span &gt;+&lt;/span&gt;&lt;/span&gt; 运算符来连接短字符串，如以下代码所示。&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div id="snippetGroup3"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_60f96fa1-b288-4f2a-964b-aa56d8144db8" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt; displayName = nameList[n].LastName + &lt;span style="color: #a31515"&gt;", "&lt;/span&gt; + nameList[n].FirstName;&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn29_f7f08d62d261c370ef87c8f725d6f46e"  jquery1602720416778375502="33"&gt;若要在循环中附加字符串，尤其是在您处理大量文本时，请使用 &lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.text.stringbuilder.aspx"&gt;&lt;font color="#1364c4"&gt;StringBuilder&lt;/font&gt;&lt;/a&gt;&lt;/span&gt; 对象。&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div id="snippetGroup4"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_0b605796-8970-43a6-a7b8-dc3976f9f118" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; phrase = &lt;span style="color: #a31515"&gt;"lalalalalalalalalalalalalalalalalalalalalalalalalalalalalala"&lt;/span&gt;;&#xD;
&lt;span style="color: blue"&gt;var&lt;/span&gt; manyPhrases = &lt;span style="color: blue"&gt;new&lt;/span&gt; StringBuilder();&#xD;
&lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; i = 0; i &amp;lt; 10000; i++)&#xD;
{&#xD;
    manyPhrases.Append(phrase);&#xD;
}&#xD;
&lt;span style="color: green"&gt;//Console.WriteLine("tra" + manyPhrases);&lt;/span&gt;&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;隐式类型化局部变量&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn30_944af1dfa1f80f813dee26b0295bda7d"  jquery1602720416778375502="34"&gt;如果赋值语句右侧的变量类型十分明显，或在精确的类型并不重要时，使用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/bb384061.aspx"&gt;&lt;font color="#1364c4"&gt;隐式类型&lt;/font&gt;&lt;/a&gt; 的局部变量。&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div id="snippetGroup5"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_daf8f867-4d40-4c3a-ac8f-e4daf397bd5a" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: green"&gt;// When the type of a variable is clear from the context, use var &lt;/span&gt;&#xD;
&lt;span style="color: green"&gt;// in the declaration.&lt;/span&gt;&#xD;
&lt;span style="color: blue"&gt;var&lt;/span&gt; var1 = &lt;span style="color: #a31515"&gt;"This is clearly a string."&lt;/span&gt;;&#xD;
&lt;span style="color: blue"&gt;var&lt;/span&gt; var2 = 27;&#xD;
&lt;span style="color: blue"&gt;var&lt;/span&gt; var3 = Convert.ToInt32(Console.ReadLine());&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn31_8f90d7ab94b85861a661b4006ed1b7e1"  jquery1602720416778375502="35"&gt;赋值语句右侧的类型不明显时，不要使用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/bb383973.aspx"&gt;&lt;font color="#1364c4"&gt;var&lt;/font&gt;&lt;/a&gt;。&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div id="snippetGroup6"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_d2c93e8c-bebb-46f9-9e7b-7809a6ee5692" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: green"&gt;// When the type of a variable is not clear from the context, use an&lt;/span&gt;&#xD;
&lt;span style="color: green"&gt;// explicit type.&lt;/span&gt;&#xD;
&lt;span style="color: blue"&gt;int&lt;/span&gt; var4 = ExampleClass.ResultSoFar();&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn32_238124af91e5525e8ac135e06122c462"  jquery1602720416778375502="36"&gt;不要依赖变量名来指定变量的类型。&lt;/span&gt; &lt;span id="xn33_7f1b2f844d6c692c309733c06e45237d"  jquery1602720416778375502="37"&gt;这可能是不正确的。&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div id="snippetGroup7"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_2bd7f030-d243-4ff3-aeb6-dc5f22b8e7e2" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: green"&gt;// Naming the following variable inputInt is misleading. &lt;/span&gt;&#xD;
&lt;span style="color: green"&gt;// It is a string.&lt;/span&gt;&#xD;
&lt;span style="color: blue"&gt;var&lt;/span&gt; inputInt = Console.ReadLine();&#xD;
Console.WriteLine(inputInt);&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn34_e40d6d1ebb413fc718fb48d031dd52d5"  jquery1602720416778375502="38"&gt;避免使用 &lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span &gt;var&lt;/span&gt;&lt;/span&gt; 取代 &lt;a href="http://msdn.microsoft.com/zh-cn/library/dd264741.aspx"&gt;&lt;font color="#1364c4"&gt;dynamic&lt;/font&gt;&lt;/a&gt;。&lt;/span&gt; &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn35_f5d00cdcd9ae995218685253705a4ef5"  jquery1602720416778375502="39"&gt;使用隐式类型在 &lt;a href="http://msdn.microsoft.com/zh-cn/library/ch45axte.aspx"&gt;&lt;font color="#1364c4"&gt;for&lt;/font&gt;&lt;/a&gt; 和 &lt;a href="http://msdn.microsoft.com/zh-cn/library/ttw7t8t6.aspx"&gt;&lt;font color="#1364c4"&gt;foreach&lt;/font&gt;&lt;/a&gt; 循环中确定循环变量的类型。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn36_2ce0875111611f8c79f4ee240ac2da98"  jquery1602720416778375502="40"&gt;下面的示例在 &lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span &gt;for&lt;/span&gt;&lt;/span&gt; 语句中使用了隐式类型。&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div id="snippetGroup8"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_563a4b55-a0de-4c20-ad99-ef8ea5401f23" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; syllable = &lt;span style="color: #a31515"&gt;"ha"&lt;/span&gt;;&#xD;
&lt;span style="color: blue"&gt;var&lt;/span&gt; laugh = &lt;span style="color: #a31515"&gt;""&lt;/span&gt;;&#xD;
&lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; i = 0; i &amp;lt; 10; i++)&#xD;
{&#xD;
    laugh += syllable;&#xD;
    Console.WriteLine(laugh);&#xD;
}&#xD;
&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn37_413f5dd0acf25601231b3aa1a4fb9c07"  jquery1602720416778375502="41"&gt;下面的示例在 &lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span &gt;foreach&lt;/span&gt;&lt;/span&gt; 语句中使用了隐式类型。&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div id="snippetGroup9"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_cfcb0e05-c37c-45fd-9f71-19940d70fea6" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; ch &lt;span style="color: blue"&gt;in&lt;/span&gt; laugh)&#xD;
{&#xD;
    &lt;span style="color: blue"&gt;if&lt;/span&gt; (ch == &lt;span style="color: #a31515"&gt;'h'&lt;/span&gt;)&#xD;
        Console.Write(&lt;span style="color: #a31515"&gt;"H"&lt;/span&gt;);&#xD;
    &lt;span style="color: blue"&gt;else&lt;/span&gt;&#xD;
        Console.Write(ch);&#xD;
}&#xD;
Console.WriteLine();&#xD;
&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;无符号数据类型&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn38_64d1979f8a9050d1b0938c0812024b26"  jquery1602720416778375502="42"&gt;一般情况下，使用 &lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span &gt;int&lt;/span&gt;&lt;/span&gt; 而不是无符号类型。&lt;/span&gt; &lt;span id="xn39_d37513f4df5de59142e32df6e2442ed4"  jquery1602720416778375502="43"&gt;在整个 C# 中，使用 &lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span &gt;int&lt;/span&gt;&lt;/span&gt; 很常见，并且在您使用 &lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span &gt;int&lt;/span&gt;&lt;/span&gt; 时很容易与其他库进行交互。&lt;/span&gt; &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;数组&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn40_0b769256371c154a529027df53e5df33"  jquery1602720416778375502="44"&gt;在您初始化声明行上的数组时，请使用简洁的语法。&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div id="snippetGroup10"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_88e4b41f-5ae8-40e1-8e3e-6090b86b7873" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: green"&gt;// Preferred syntax. Note that you cannot use var here instead of string[].&lt;/span&gt;&#xD;
&lt;span style="color: blue"&gt;string&lt;/span&gt;[] vowels1 = { &lt;span style="color: #a31515"&gt;"a"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"e"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"i"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"o"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"u"&lt;/span&gt; };&#xD;
&#xD;
&#xD;
&lt;span style="color: green"&gt;// If you use explicit instantiation, you can use var.&lt;/span&gt;&#xD;
&lt;span style="color: blue"&gt;var&lt;/span&gt; vowels2 = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;[] { &lt;span style="color: #a31515"&gt;"a"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"e"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"i"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"o"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"u"&lt;/span&gt; };&#xD;
&#xD;
&lt;span style="color: green"&gt;// If you specify an array size, you must initialize the elements one at a time.&lt;/span&gt;&#xD;
&lt;span style="color: blue"&gt;var&lt;/span&gt; vowels3 = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;[5];&#xD;
vowels3[0] = &lt;span style="color: #a31515"&gt;"a"&lt;/span&gt;;&#xD;
vowels3[1] = &lt;span style="color: #a31515"&gt;"e"&lt;/span&gt;;&#xD;
&lt;span style="color: green"&gt;// And so on.&lt;/span&gt;&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;委托&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn41_3eac9a4c75ec0e6c6ec035d5009a896d"  jquery1602720416778375502="45"&gt;请使用简洁的语法来创建委托类型的实例。&lt;/span&gt; &lt;/p&gt;&lt;span id="xn42_a32e43b0064c5e5077592ec8c881546a"  jquery1602720416778375502="46"&gt;&#xD;
&lt;div id="snippetGroup11" xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;span style="color: green"&gt;// First, in class Program, define the delegate type and a method that&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;// has a matching signature.&lt;/span&gt;&lt;span style="color: green"&gt;// Define the type.&lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt;&lt;span style="color: blue"&gt;delegate&lt;/span&gt;&lt;span style="color: blue"&gt;void&lt;/span&gt; Del(&lt;span style="color: blue"&gt;string&lt;/span&gt; message);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green"&gt;// Define a method that has a matching signature.&lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt;&lt;span style="color: blue"&gt;void&lt;/span&gt; DelMethod(&lt;span style="color: blue"&gt;string&lt;/span&gt; str)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&lt;span style="color: #a31515"&gt;"DelMethod argument: {0}"&lt;/span&gt;, str);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div id="snippetGroup12" xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;span style="color: green"&gt;// In the Main method, create an instance of Del.&lt;/span&gt;&lt;span style="color: green"&gt;// Preferred: Create an instance of Del by using condensed syntax.&lt;/span&gt;&lt;br /&gt;Del exampleDel2 = DelMethod;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green"&gt;// The following declaration uses the full syntax.&lt;/span&gt;&lt;br /&gt;Del exampleDel1 = &lt;span style="color: blue"&gt;new&lt;/span&gt; Del(DelMethod);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;异常处理中的 try-catch 和 using 语句&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn43_b645c6b1b47f2502cee117064d809fb0"  jquery1602720416778375502="47"&gt;为大多数异常处理使用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/0yd65esw.aspx"&gt;&lt;font color="#1364c4"&gt;try-catch&lt;/font&gt;&lt;/a&gt; 语句。&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div id="snippetGroup13"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_f973c2b0-6e0b-4a47-b0e8-6089ab6b30ca" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetValueFromArray(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] array, &lt;span style="color: blue"&gt;int&lt;/span&gt; index)&#xD;
{&#xD;
    &lt;span style="color: blue"&gt;try&lt;/span&gt;&#xD;
    {&#xD;
        &lt;span style="color: blue"&gt;return&lt;/span&gt; array[index];&#xD;
    }&#xD;
    &lt;span style="color: blue"&gt;catch&lt;/span&gt; (System.IndexOutOfRangeException ex)&#xD;
    {&#xD;
        Console.WriteLine(&lt;span style="color: #a31515"&gt;"Index is out of range: {0}"&lt;/span&gt;, index);&#xD;
        &lt;span style="color: blue"&gt;throw&lt;/span&gt;;&#xD;
    }&#xD;
}&#xD;
&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn44_fe9624849fdd57f49c94dfa201fce63e"  jquery1602720416778375502="48"&gt;使用 C# &lt;a href="http://msdn.microsoft.com/zh-cn/library/yh598w02.aspx"&gt;&lt;font color="#960bb4"&gt;using 语句&lt;/font&gt;&lt;/a&gt;简化代码。&lt;/span&gt; &lt;span id="xn45_0af5f955aa80698f95f144c803fce5c8"  jquery1602720416778375502="49"&gt;如果有一个 &lt;a href="http://msdn.microsoft.com/zh-cn/library/zwc8s4fz.aspx"&gt;&lt;font color="#1364c4"&gt;try-finally&lt;/font&gt;&lt;/a&gt; 语句，其中 &lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span &gt;finally&lt;/span&gt;&lt;/span&gt; 块中的唯一代码为对 &lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.idisposable.dispose.aspx"&gt;&lt;font color="#1364c4"&gt;Dispose&lt;/font&gt;&lt;/a&gt;&lt;/span&gt; 方法的调用，请改用 &lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span &gt;using&lt;/span&gt;&lt;/span&gt; 语句。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div id="snippetGroup14"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_ca4a1896-8a58-417d-89e0-9c3909b42833" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: green"&gt;// This try-finally statement only calls Dispose in the finally block.&lt;/span&gt;&#xD;
Font font1 = &lt;span style="color: blue"&gt;new&lt;/span&gt; Font(&lt;span style="color: #a31515"&gt;"Arial"&lt;/span&gt;, 10.0f);&#xD;
&lt;span style="color: blue"&gt;try&lt;/span&gt;&#xD;
{&#xD;
    &lt;span style="color: blue"&gt;byte&lt;/span&gt; charset = font1.GdiCharSet;&#xD;
}&#xD;
&lt;span style="color: blue"&gt;finally&lt;/span&gt;&#xD;
{&#xD;
    &lt;span style="color: blue"&gt;if&lt;/span&gt; (font1 != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&#xD;
    {&#xD;
        ((IDisposable)font1).Dispose();&#xD;
    }&#xD;
}&#xD;
&#xD;
&#xD;
&lt;span style="color: green"&gt;// You can do the same thing with a using statement.&lt;/span&gt;&#xD;
&lt;span style="color: blue"&gt;using&lt;/span&gt; (Font font2 = &lt;span style="color: blue"&gt;new&lt;/span&gt; Font(&lt;span style="color: #a31515"&gt;"Arial"&lt;/span&gt;, 10.0f))&#xD;
{&#xD;
    &lt;span style="color: blue"&gt;byte&lt;/span&gt; charset = font2.GdiCharSet;&#xD;
}&#xD;
&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;&amp;amp;&amp;amp; 和 || 运算符&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn46_167607ab1246d393dfc904a63c537008"  jquery1602720416778375502="50"&gt;若要跳过不必要的比较来避免出现异常和提高性能，在执行比较时，请使用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/2a723cdk.aspx"&gt;&lt;font color="#1364c4"&gt;&amp;amp;&amp;amp;&lt;/font&gt;&lt;/a&gt; 代替 &lt;a href="http://msdn.microsoft.com/zh-cn/library/sbf85k1c.aspx"&gt;&lt;font color="#1364c4"&gt;&amp;amp;&lt;/font&gt;&lt;/a&gt;，使用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/6373h346.aspx"&gt;&lt;font color="#1364c4"&gt;||&lt;/font&gt;&lt;/a&gt; 代替&lt;/span&gt; &lt;a href="http://msdn.microsoft.com/zh-cn/library/kxszd0kx.aspx"&gt;&lt;font color="#1364c4"&gt;|&lt;/font&gt;&lt;/a&gt; &lt;span id="xn47_16c28199d5981de2430fe739615bb7c1"  jquery1602720416778375502="51"&gt;，如以下示例所示。&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div id="snippetGroup15"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_8db19b0f-bd6b-47fc-9c23-bedb3e2fe476" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;Console.Write(&lt;span style="color: #a31515"&gt;"Enter a dividend: "&lt;/span&gt;);&#xD;
&lt;span style="color: blue"&gt;var&lt;/span&gt; dividend = Convert.ToInt32(Console.ReadLine());&#xD;
&#xD;
Console.Write(&lt;span style="color: #a31515"&gt;"Enter a divisor: "&lt;/span&gt;);&#xD;
&lt;span style="color: blue"&gt;var&lt;/span&gt; divisor = Convert.ToInt32(Console.ReadLine());&#xD;
&#xD;
&lt;span style="color: green"&gt;// If the divisor is 0, the second clause in the following condition&lt;/span&gt;&#xD;
&lt;span style="color: green"&gt;// causes a run-time error. The &amp;amp;&amp;amp; operator short circuits when the&lt;/span&gt;&#xD;
&lt;span style="color: green"&gt;// first expression is false. That is, it does not evaluate the&lt;/span&gt;&#xD;
&lt;span style="color: green"&gt;// second expression. The &amp;amp; operator evaluates both, and causes &lt;/span&gt;&#xD;
&lt;span style="color: green"&gt;// a run-time error when divisor is 0.&lt;/span&gt;&#xD;
&lt;span style="color: blue"&gt;if&lt;/span&gt; ((divisor != 0) &amp;amp;&amp;amp; (dividend / divisor &amp;gt; 0))&#xD;
{&#xD;
    Console.WriteLine(&lt;span style="color: #a31515"&gt;"Quotient: {0}"&lt;/span&gt;, dividend / divisor);&#xD;
}&#xD;
&lt;span style="color: blue"&gt;else&lt;/span&gt;&#xD;
{&#xD;
    Console.WriteLine(&lt;span style="color: #a31515"&gt;"Attempted division by 0 ends up here."&lt;/span&gt;);&#xD;
}&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;New 运算符&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn48_2ee9381154c06805e10dc93da832dc43"  jquery1602720416778375502="52"&gt;通过隐式类型使用简洁形式的对象实例，如以下声明所示。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div id="snippetGroup16"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_214dec41-52e2-418f-9e91-dbdf8fbbdf84" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; instance1 = &lt;span style="color: blue"&gt;new&lt;/span&gt; ExampleClass();&#xD;
&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn49_4aaa092b48c881710a34ecf5e9259c4d"  jquery1602720416778375502="53"&gt;上面的行与以下声明等效。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div id="snippetGroup17"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_b58c8790-a271-4a24-a7e4-e3c4e9a6868a" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;ExampleClass instance2 = &lt;span style="color: blue"&gt;new&lt;/span&gt; ExampleClass();&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn50_959ad3aad75fe2f99f92691574320033"  jquery1602720416778375502="54"&gt;使用对象初始值设定项来简化对象创建。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div id="snippetGroup18"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_36793e67-4a0d-4cdb-96e4-57e9f61bbac6" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: green"&gt;// Object initializer.&lt;/span&gt;&#xD;
&lt;span style="color: blue"&gt;var&lt;/span&gt; instance3 = &lt;span style="color: blue"&gt;new&lt;/span&gt; ExampleClass { Name = &lt;span style="color: #a31515"&gt;"Desktop"&lt;/span&gt;, ID = 37414, &#xD;
    Location = &lt;span style="color: #a31515"&gt;"Redmond"&lt;/span&gt;, Age = 2.3 };&#xD;
&#xD;
&lt;span style="color: green"&gt;// Default constructor and assignment statements.&lt;/span&gt;&#xD;
&lt;span style="color: blue"&gt;var&lt;/span&gt; instance4 = &lt;span style="color: blue"&gt;new&lt;/span&gt; ExampleClass();&#xD;
instance4.Name = &lt;span style="color: #a31515"&gt;"Desktop"&lt;/span&gt;;&#xD;
instance4.ID = 37414;&#xD;
instance4.Location = &lt;span style="color: #a31515"&gt;"Redmond"&lt;/span&gt;;&#xD;
instance4.Age = 2.3;&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;事件处理&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn51_8230b7887802149abf6321cb657a0e55"  jquery1602720416778375502="55"&gt;如果您正在定义无需日后移除的事件处理程序，请使用 lambda 表达式。&lt;/span&gt; &lt;/p&gt;&lt;span id="xn52_2792352720fbf5cd019a2a1bf3a8b141"  jquery1602720416778375502="56"&gt;&#xD;
&lt;div id="snippetGroup19" xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; Form2()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;// You can use a lambda expression to define an event handler.&lt;/span&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt;.Click += (s, e) =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((MouseEventArgs)e).Location.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green"&gt;// Using a lambda expression shortens the following traditional definition.&lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; Form1()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;this&lt;/span&gt;.Click += &lt;span style="color: blue"&gt;new&lt;/span&gt; EventHandler(Form1_Click);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;void&lt;/span&gt; Form1_Click(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show(((MouseEventArgs)e).Location.ToString());&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;静态成员&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn53_02a308681ae4d2682b3ef33614db6024"  jquery1602720416778375502="57"&gt;使用类名称调用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/98f28cdx.aspx"&gt;&lt;font color="#1364c4"&gt;static&lt;/font&gt;&lt;/a&gt; 成员：&lt;span  xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;em&gt;ClassName.StaticMember&lt;/em&gt;&lt;/span&gt;。&lt;/span&gt; &lt;span id="xn54_d9e8087f0e58aad72c6d9d3843c7376e"  jquery1602720416778375502="58"&gt;不要从派生类访问在基类中定义的静态成员。&lt;/span&gt; &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;LINQ 查询&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn55_70fb62d25d16eb743b26e7896871525f"  jquery1602720416778375502="59"&gt;对于查询变量使用有意义的名称。&lt;/span&gt; &lt;span id="xn56_87f65eec7ffaefa2b5f1d6b42572dfe7"  jquery1602720416778375502="60"&gt;下面的示例使用 &lt;span  xmlns="http://www.w3.org/1999/xhtml"&gt;seattleCustomers&lt;/span&gt; 代表地处西雅图的客户。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div id="snippetGroup21"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_50fe3d82-8011-47fe-a752-b384894c8436" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; seattleCustomers = &lt;span style="color: blue"&gt;from&lt;/span&gt; cust &lt;span style="color: blue"&gt;in&lt;/span&gt; customers&#xD;
                       &lt;span style="color: blue"&gt;where&lt;/span&gt; cust.City == &lt;span style="color: #a31515"&gt;"Seattle"&lt;/span&gt;&#xD;
                       &lt;span style="color: blue"&gt;select&lt;/span&gt; cust.Name;&#xD;
&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn57_986b0394a860b9f9bcdb387420e3fc82"  jquery1602720416778375502="61"&gt;使用别名以确保通过 Pascal 大小写格式正确设置匿名类型的属性名称的大小写。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div id="snippetGroup22"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_7cc1082e-31e7-4f04-974d-ac1cb23343c6" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; localDistributors =&#xD;
    &lt;span style="color: blue"&gt;from&lt;/span&gt; customer &lt;span style="color: blue"&gt;in&lt;/span&gt; customers&#xD;
    &lt;span style="color: blue"&gt;join&lt;/span&gt; distributor &lt;span style="color: blue"&gt;in&lt;/span&gt; distributors &lt;span style="color: blue"&gt;on&lt;/span&gt; customer.City &lt;span style="color: blue"&gt;equals&lt;/span&gt; distributor.City&#xD;
    &lt;span style="color: blue"&gt;select&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; { Customer = customer, Distributor = distributor };&#xD;
&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn58_523dec25a4379d32513eedb7bc7925da"  jquery1602720416778375502="62"&gt;在结果中的属性名称不明确时重命名属性。&lt;/span&gt; &lt;span id="xn59_3f96a67e4b6358b70a54893631d44fc3"  jquery1602720416778375502="63"&gt;例如，如果查询返回一个客户名称和一个分销商 ID，不要在结果中将它们保留为 &lt;span  xmlns="http://www.w3.org/1999/xhtml"&gt;Name&lt;/span&gt; 和 &lt;span  xmlns="http://www.w3.org/1999/xhtml"&gt;ID&lt;/span&gt;，而是将它们重命名，以阐明 &lt;span  xmlns="http://www.w3.org/1999/xhtml"&gt;Name&lt;/span&gt; 是客户的名称，&lt;span  xmlns="http://www.w3.org/1999/xhtml"&gt;ID&lt;/span&gt; 是分销商的 ID。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div id="snippetGroup23"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_4438bc54-f094-4bba-ba2c-88085ed4bf33" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; localDistributors2 =&#xD;
    &lt;span style="color: blue"&gt;from&lt;/span&gt; cust &lt;span style="color: blue"&gt;in&lt;/span&gt; customers&#xD;
    &lt;span style="color: blue"&gt;join&lt;/span&gt; dist &lt;span style="color: blue"&gt;in&lt;/span&gt; distributors &lt;span style="color: blue"&gt;on&lt;/span&gt; cust.City &lt;span style="color: blue"&gt;equals&lt;/span&gt; dist.City&#xD;
    &lt;span style="color: blue"&gt;select&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; { CustomerName = cust.Name, DistributorID = dist.ID };&#xD;
&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn60_bc91e458e0e9bd0ee8771b3de2d2a6c8"  jquery1602720416778375502="64"&gt;使用隐式类型来声明查询变量和范围变量。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div id="snippetGroup24"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_438802eb-a02c-4338-b3b7-81f63a84cc7e" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; seattleCustomers = &lt;span style="color: blue"&gt;from&lt;/span&gt; cust &lt;span style="color: blue"&gt;in&lt;/span&gt; customers&#xD;
                       &lt;span style="color: blue"&gt;where&lt;/span&gt; cust.City == &lt;span style="color: #a31515"&gt;"Seattle"&lt;/span&gt;&#xD;
                       &lt;span style="color: blue"&gt;select&lt;/span&gt; cust.Name;&#xD;
&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn61_c08cc307ec042c8720ac32f7afa43b56"  jquery1602720416778375502="65"&gt;将查询子句对齐在 &lt;a href="http://msdn.microsoft.com/zh-cn/library/bb383978.aspx"&gt;&lt;font color="#1364c4"&gt;from &lt;/font&gt;&lt;/a&gt;子句下方，如前面的示例所示。&lt;/span&gt; &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn62_905f613a3a7de5c60e54cbd577ab2a94"  jquery1602720416778375502="66"&gt;在其他查询子句前面使用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/bb311043.aspx"&gt;&lt;font color="#1364c4"&gt;where&lt;/font&gt;&lt;/a&gt; 子句，以确保对一组经过简化和筛选的数据执行后面的查询子句。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div id="snippetGroup25"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_adcc4e81-1a5e-4a0d-824a-595e926bc2f4" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; seattleCustomers2 = &lt;span style="color: blue"&gt;from&lt;/span&gt; cust &lt;span style="color: blue"&gt;in&lt;/span&gt; customers&#xD;
                        &lt;span style="color: blue"&gt;where&lt;/span&gt; cust.City == &lt;span style="color: #a31515"&gt;"Seattle"&lt;/span&gt;&#xD;
                        &lt;span style="color: blue"&gt;orderby&lt;/span&gt; cust.Name&#xD;
                        &lt;span style="color: blue"&gt;select&lt;/span&gt; cust;&#xD;
&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn63_1689e0e2812b6573b80461bcffc7b7e8"  jquery1602720416778375502="67"&gt;使用多个 &lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span &gt;from&lt;/span&gt;&lt;/span&gt; 子句而不是一个 &lt;a href="http://msdn.microsoft.com/zh-cn/library/bb311040.aspx"&gt;&lt;font color="#1364c4"&gt;join&lt;/font&gt;&lt;/a&gt; 子句来访问内部集合。&lt;/span&gt; &lt;span id="xn64_6419b2ae1d5fe9ab0d11e4d3edc410f9"  jquery1602720416778375502="68"&gt;例如，在 &lt;span  xmlns="http://www.w3.org/1999/xhtml"&gt;Student&lt;/span&gt; 对象集合中，每个对象可能都包含一个考试成绩集合。&lt;/span&gt; &lt;span id="xn65_cec1c155b48ddab8e99ba51b74fd4f48"  jquery1602720416778375502="69"&gt;在执行下面的查询时，它将返回每一个超过 90 的分数，以及获得该分数的学生的姓氏。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div id="snippetGroup26"&gt;&#xD;
&lt;div  xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" &gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div dir="ltr" id="CodeSnippetContainerCode_ce28f154-a597-4954-8702-6f808b6dee7c" &gt;&#xD;
&lt;div style="color: black"&gt;&lt;pre&gt;&lt;span style="color: green"&gt;// Use a compound from to access the inner sequence within each element.&lt;/span&gt;&#xD;
&lt;span style="color: blue"&gt;var&lt;/span&gt; scoreQuery = &lt;span style="color: blue"&gt;from&lt;/span&gt; student &lt;span style="color: blue"&gt;in&lt;/span&gt; students&#xD;
                 &lt;span style="color: blue"&gt;from&lt;/span&gt; score &lt;span style="color: blue"&gt;in&lt;/span&gt; student.Scores&#xD;
                 &lt;span style="color: blue"&gt;where&lt;/span&gt; score &amp;gt; 90&#xD;
                 &lt;span style="color: blue"&gt;select&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; { Last = student.LastName, score };&#xD;
&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div xmlns=""&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div&gt;&lt;a  title="折叠" href="http://www.cnblogs.com/pugang/admin/javascript:void(0)"&gt;&lt;img  alt="" src="http://i.msdn.microsoft.com/Hash/030c41d9079671d09a62d8e2c1db6973.gif" /&gt;&lt;span &gt;&lt;strong&gt;&lt;font color="#3f529c" size="5"&gt;安全性&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt; &#xD;
&lt;div &gt;&#xD;
&lt;hr  /&gt;&#xD;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;a id="sectionToggle4" xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;/a&gt;&#xD;
&lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span id="xn66_9b85a42dc9367f61d25f81a3401fc11c"  jquery1602720416778375502="70"&gt;遵循&lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/8a3x2b7f.aspx"&gt;&lt;font color="#1364c4"&gt;代码安全维护指南&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;中的指南。&lt;/span&gt; &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/pugang/aggbug/2206582.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/pugang/archive/2011/10/10/2206582.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/pugang/archive/2011/10/10/2206538.html</id><title type="text">如何调试Memory Leak 和 Handle Leak</title><summary type="text">1. Handle Leak:A handle leak is a type of software bug that occurs when a computer program asks for a handle to a resource but does not free the handle when it is no longer used. If this occurs frequently or repeatedly over an extended period of time, a large number of handles may be marked in-use .</summary><published>2011-10-10T12:35:00Z</published><updated>2011-10-10T12:35:00Z</updated><author><name>SolidMango</name><uri>http://www.cnblogs.com/pugang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/pugang/archive/2011/10/10/2206538.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/pugang/archive/2011/10/10/2206538.html"/><content type="html">&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt; &#xD;
&lt;p&gt;&lt;strong&gt;1. Handle Leak:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;A handle leak is a type of software bug that occurs when a computer program &lt;/p&gt;&#xD;
&lt;p&gt;asks for a handle to a resource but does not free the handle when it is no &lt;/p&gt;&#xD;
&lt;p&gt;longer used. If this occurs frequently or repeatedly over an extended period &lt;/p&gt;&#xD;
&lt;p&gt;of time, a large number of handles may be marked in-use and thus unavailable, &lt;/p&gt;&#xD;
&lt;p&gt;causing performance problems or a crash. The leak of handle itself is not a &lt;/p&gt;&#xD;
&lt;p&gt;big problem. The problem is that handle leak causes the leak of kernel paged &lt;/p&gt;&#xD;
&lt;p&gt;pool.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2. Memory Leak:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;A memory leak is a particular type of unintentional memory consumption by a &lt;/p&gt;&#xD;
&lt;p&gt;computer program where the program fails to release memory when no longer &lt;/p&gt;&#xD;
&lt;p&gt;needed. This condition is normally the result of a bug in a program that &lt;/p&gt;&#xD;
&lt;p&gt;prevents it from freeing up memory that it no longer needs. Memory is &lt;/p&gt;&#xD;
&lt;p&gt;allocated to a program, and that program subsequently loses the ability to &lt;/p&gt;&#xD;
&lt;p&gt;access it due to program logic flaws.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;//---------------------------------------------------------------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;Symptoms:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;A. Handle Leaks&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;1. System running out of non-paged pool.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;2. Failing handle allocations.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;3. Degradation in system performance.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;4. Excessive paging.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;5. Tools like Task Manager and PerfMon show increasing handle count.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;B. Memory Leaks&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;1. System running out of virtual memory.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;2. Failing memory allocations.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;3. Degradation in system performance.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;4. Excessive paging.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;5. Tools like Task Manager and PerfMon show increasing memory counters for &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Working Set Size, Commit Size and Virtual Memory Size.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;//---------------------------------------------------------------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;Causes:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;A. Handle Leaks&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;1. The programmer mistakenly forget to close the handles. The OPEN and CLOSE &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;operations are not in pairs.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;2. Incorrect error handling.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;3. Other process inject (duplicate) the handle to the current one, who is not&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;aware of the injection, and thus, does not close the injected handle.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;B. Memory Leaks&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;1. Incorrect error handling.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;2. Synchronization issues.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;3. Heap block caching (like BSTR etc).&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;C. Heap Fragmentation&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;1. Mixing long-term with short-term allocations.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;2. Mixing small size with large size allocations.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;3. Using realloc to shrink blocks.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;4. Heap leaks.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;/////////////////////////////////////////////////////////////////////////////&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;Detections and Debugging:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;A. Handle Leaks&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;- Step1. Is It Even a Handle Leak?&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;The first step of investigating a potential resource leak is to confirm that&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;there really is one. Handle leaks can be easily detected by using Task &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Manager. You can display the number of handles for a given process by &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;clicking the Process tab of Task Manager followed by selecting the View and &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Select Columns submenu. This brings up a dialog box that displays a host of &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;options that Task Manager is capable of displaying. Check the Handle Count &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;check box, and click OK. If the Handles column shows a big number or its &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;value continues going up and does not go down after letting the application &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;sit idle for a while, the application is likely leaking handles. &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;In the example of LeakFileHandle, the handle count increases by 2 and doesn't &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;go down.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;- Step2. Initial analysis&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;If we could identify what type of object the handle is associated with, it &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;might give us a better clue to the source of the leak. For example, if all &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;the preceding handles are thread handles, we could focus our efforts in those &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;parts of the code. Process Explorer is an excellent tool that has the &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;capability to show different handles and associated types in a process. &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;(http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;The newly created handles are highlighted for a short period. This facilitates &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;the detection of the leaky handles. &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;In the example of LeakFileHandle, Process Explorer displays the addition of &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;the following two handles after the execution.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;File C:\Users\Jialiang Ge\AppData\Local\Temp\HLeEF15.tmp&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;File C:\Users\Jialiang Ge\AppData\Local\Temp\HLeEF15.tmp&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;With the information of the leaky handles, we can try to spot the culprit by &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;a simple code review. If the problem cannot be easily spotted, go on to the &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;next step.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;- Step3. Using Handle Leak Detection Tools&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Several tools are available to help efficiently track down handle leaks. They &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;are Application Verifier and !htrace.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Application Verifier&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Application Verifier option "Disable invalid handle usage" or &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;"appverif -enable Handles". This functionality is provided by appverif on &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Windows XP and later versions of OS. By activating Application Verifier, &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;stack trace information is saved each time the process opens a handle, &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;closes a handle, or references an invalid handle. It is this stack trace &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;information that !htrace displays.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle Leak Detection Tools (!htrace)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;!htrace, an extension command of windbg, can help you detect where the leak &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;is occurring. Htrace stands for handle trace, and the basic idea behind the &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;command is to enable the operating system to track all calls (with associated &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;stack traces) that result in handles being opened and closed. When a leak has &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;been identified, you can then use the !htrace extension command to display &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;all the stack traces in the debugger. After all stack traces are shown, you &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;can track down sporadic handle leaks in a much easier fashion.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;The general strategy for using !htrace is&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;1. Prior to starting the actual reproducing of the leak, enable handle &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;tracing (using !htrace -enable).&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;2. Run the reproduction and let the process handle leaks.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;3. Use !htrace -diff to find the offending stacks.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Repeating steps 1-3 will give you enough information to narrow the problem &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;down in the code and find the leak by using code reviews.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Before !htrace can be used, Application Verifier must be activated for the &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;target process, and the Detect invalid handle usage option must be selected. &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;By activating Application Verifier, stack trace information is saved each &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;time the process opens a handle, closes a handle, or references an invalid&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;handle. It is this stack trace information that !htrace displays.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;First, let's enable the handle trace:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0:000&amp;gt; !htrace -enable&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle tracing enabled.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle tracing information snapshot successfully taken.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;The -enable switch is a two-step operation. First, it enables stack tracing, &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;and second, it takes a snapshot of the current state of the process with &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;regard to handles (as indicated by the second line in the output). As soon as &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;stack tracing has been enabled, Windows starts recording all calls that &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;result in handle creation and deletion. &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0:000&amp;gt; g&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;(19ec.153c): Break instruction exception - code 80000003 (first chance)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;eax=7ffde000 ebx=00000000 ecx=00000000 edx=7798b412 esi=00000000 edi=00000000&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;eip=7794433c esp=0065fd0c ebp=0065fd38 iopl=0 nv up ei pl zr na pe nc&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;ntdll!DbgBreakPoint:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;7794433c cc int 3&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;The next time you take a snapshot &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;(using the -snapshot option), the !htrace extension command queries the &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;operating system for all stack traces that result in handle creation and &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;deletion and displays them.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0:000&amp;gt; !htrace&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle = 0x0000003c - OPEN&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Thread ID = 0x000017ec, Process ID = 0x000017e8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77ca310c: ntdll!ZwDuplicateObject+0x0000000c&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x75e68ad9: KERNELBASE!DuplicateHandle+0x00000069&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77be34e1: kernel32!DuplicateHandleStub+0x000000b3&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;** WARNING: Unable to verify checksum for CppResourceLeaks.exe&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1627: CppResourceLeaks!LeakFileHandle+0x00000207&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1843: CppResourceLeaks!wmain+0x00000023&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1e48: CppResourceLeaks!__tmainCRTStartup+0x000001a8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1c8f: CppResourceLeaks!wmainCRTStartup+0x0000000f&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77be36d6: kernel32!BaseThreadInitThunk+0x0000000e&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77c9883c: ntdll!__RtlUserThreadStart+0x00000070&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77c9880f: ntdll!_RtlUserThreadStart+0x0000001b&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle = 0x00000038 - OPEN&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Thread ID = 0x000017ec, Process ID = 0x000017e8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77ca2e3c: ntdll!ZwCreateFile+0x0000000c&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x75e9679f: KERNELBASE!CreateFileW+0x0000035e&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77be51b3: kernel32!CreateFileWStub+0x00000069&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab158f: CppResourceLeaks!LeakFileHandle+0x0000016f&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1843: CppResourceLeaks!wmain+0x00000023&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1e48: CppResourceLeaks!__tmainCRTStartup+0x000001a8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1c8f: CppResourceLeaks!wmainCRTStartup+0x0000000f&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77be36d6: kernel32!BaseThreadInitThunk+0x0000000e&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77c9883c: ntdll!__RtlUserThreadStart+0x00000070&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77c9880f: ntdll!_RtlUserThreadStart+0x0000001b&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle = 0x00000034 - CLOSE&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Thread ID = 0x000017ec, Process ID = 0x000017e8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77ca2d3c: ntdll!NtClose+0x0000000c&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x75e87772: KERNELBASE!GetTempFileNameW+0x00000293&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab14fe: CppResourceLeaks!LeakFileHandle+0x000000de&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1843: CppResourceLeaks!wmain+0x00000023&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1e48: CppResourceLeaks!__tmainCRTStartup+0x000001a8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1c8f: CppResourceLeaks!wmainCRTStartup+0x0000000f&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77be36d6: kernel32!BaseThreadInitThunk+0x0000000e&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77c9883c: ntdll!__RtlUserThreadStart+0x00000070&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77c9880f: ntdll!_RtlUserThreadStart+0x0000001b&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle = 0x00000034 - OPEN&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Thread ID = 0x000017ec, Process ID = 0x000017e8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77ca2e3c: ntdll!ZwCreateFile+0x0000000c&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x75e9679f: KERNELBASE!CreateFileW+0x0000035e&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x75e87762: KERNELBASE!GetTempFileNameW+0x00000208&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab14fe: CppResourceLeaks!LeakFileHandle+0x000000de&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1843: CppResourceLeaks!wmain+0x00000023&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1e48: CppResourceLeaks!__tmainCRTStartup+0x000001a8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1c8f: CppResourceLeaks!wmainCRTStartup+0x0000000f&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77be36d6: kernel32!BaseThreadInitThunk+0x0000000e&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77c9883c: ntdll!__RtlUserThreadStart+0x00000070&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77c9880f: ntdll!_RtlUserThreadStart+0x0000001b&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle = 0x00000024 - OPEN&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Thread ID = 0x000017ec, Process ID = 0x000017e8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle = 0x00000020 - OPEN&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Thread ID = 0x000017ec, Process ID = 0x000017e8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Parsed 0xC stack traces.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Dumped 0xC stack traces.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;The output of !htrace shows all stack traces recorded for openning and &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;closing handles. Some entries are in pairs. For example,&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle = 0x00000034 - CLOSE&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Thread ID = 0x000017ec, Process ID = 0x000017e8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle = 0x00000034 - OPEN&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Thread ID = 0x000017ec, Process ID = 0x000017e8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;It means that the handle 0x00000034 was opened and closed properply and was &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;not leaked. !htrace has a handy command option, -diff, that correlates all &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;paths that resulted in creation and deletion (since the last snapshot) and &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;reports only the stack traces that do not have a delete stack associated.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0:000&amp;gt; !htrace -diff&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle tracing information snapshot successfully taken.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0xd9 new stack traces since the previous snapshot.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Ignoring handles that were already closed...&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Outstanding handles opened since the previous snapshot:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle = 0x0000003c - OPEN&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Thread ID = 0x000017ec, Process ID = 0x000017e8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77ca310c: ntdll!ZwDuplicateObject+0x0000000c&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x75e68ad9: KERNELBASE!DuplicateHandle+0x00000069&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77be34e1: kernel32!DuplicateHandleStub+0x000000b3&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1627: CppResourceLeaks!LeakFileHandle+0x00000207&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1843: CppResourceLeaks!wmain+0x00000023&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1e48: CppResourceLeaks!__tmainCRTStartup+0x000001a8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1c8f: CppResourceLeaks!wmainCRTStartup+0x0000000f&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77be36d6: kernel32!BaseThreadInitThunk+0x0000000e&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77c9883c: ntdll!__RtlUserThreadStart+0x00000070&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77c9880f: ntdll!_RtlUserThreadStart+0x0000001b&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle = 0x00000038 - OPEN&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Thread ID = 0x000017ec, Process ID = 0x000017e8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77ca2e3c: ntdll!ZwCreateFile+0x0000000c&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x75e9679f: KERNELBASE!CreateFileW+0x0000035e&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77be51b3: kernel32!CreateFileWStub+0x00000069&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab158f: CppResourceLeaks!LeakFileHandle+0x0000016f&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1843: CppResourceLeaks!wmain+0x00000023&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1e48: CppResourceLeaks!__tmainCRTStartup+0x000001a8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1c8f: CppResourceLeaks!wmainCRTStartup+0x0000000f&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77be36d6: kernel32!BaseThreadInitThunk+0x0000000e&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77c9883c: ntdll!__RtlUserThreadStart+0x00000070&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77c9880f: ntdll!_RtlUserThreadStart+0x0000001b&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle = 0x00000024 - OPEN&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Thread ID = 0x000017ec, Process ID = 0x000017e8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle = 0x00000020 - OPEN&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Thread ID = 0x000017ec, Process ID = 0x000017e8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Displayed 0x4 stack traces for outstanding handles opened since the previous &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;snapshot.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Therefore, our focus should be on the handles 0x3c, 0x38, 0x24, 0x20. &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;!handle &amp;lt;handle&amp;gt; tells the type of the handle. For example, &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0:000&amp;gt; !handle 0x3c &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle 3c&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Type File&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;The call-stacks in the output of !htrace give the hint of the culprit &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;functions that open the leaky handles. Take the &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;CppResourceLeaks!LeakFileHandle function as an example:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle = 0x00000038 - OPEN&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Thread ID = 0x000017ec, Process ID = 0x000017e8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77ca2e3c: ntdll!ZwCreateFile+0x0000000c&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x75e9679f: KERNELBASE!CreateFileW+0x0000035e&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77be51b3: kernel32!CreateFileWStub+0x00000069&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab158f: CppResourceLeaks!LeakFileHandle+0x0000016f&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1843: CppResourceLeaks!wmain+0x00000023&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1e48: CppResourceLeaks!__tmainCRTStartup+0x000001a8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00ab1c8f: CppResourceLeaks!wmainCRTStartup+0x0000000f&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77be36d6: kernel32!BaseThreadInitThunk+0x0000000e&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77c9883c: ntdll!__RtlUserThreadStart+0x00000070&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77c9880f: ntdll!_RtlUserThreadStart+0x0000001b&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;One exception is that, if the call-stack looks very convoluted and does not &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;make any sense for the target process, the handle is likedly to be injected &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;(duplicated) from another process. Take the LeakInjectedHandle as an example:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0:000&amp;gt; !htrace -diff&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle tracing information snapshot successfully taken.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x1 new stack traces since the previous snapshot.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Ignoring handles that were already closed...&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Outstanding handles opened since the previous snapshot:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle = 0x00000114 - OPEN&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Thread ID = 0x00001700, Process ID = 0x00000d30&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77ca310c: ntdll!ZwDuplicateObject+0x0000000c&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x75e68ad9: KERNELBASE!DuplicateHandle+0x00000069&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77be34e1: kernel32!DuplicateHandleStub+0x000000b3&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00101991: +0x00101991&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00101b78: +0x00101b78&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00102188: +0x00102188&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x00101fcf: +0x00101fcf&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77be36d6: kernel32!BaseThreadInitThunk+0x0000000e&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77c9883c: ntdll!__RtlUserThreadStart+0x00000070&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x77c9880f: ntdll!_RtlUserThreadStart+0x0000001b&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Another example:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Handle = 0x000007D8 - OPEN&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Thread ID = 0x00001700, Process ID = 0x00000d30&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x01001363: 09htarget!XcptFilter+0x00000009&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x010014D3: 09htarget!_NULL_IMPORT_DESCRIPTOR+0x000000CB&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0x7C816FD7: kernel32!BaseProcessStart+0x00000023&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;--------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;The Process ID and Thread ID reported by !htrace -diff belong to the &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;injecting process. We can therefore find out who duplicated the handle to &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;the leaking proecss.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;B. Memory Leaks&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;- Step1. Is It Even a Memory Leak?&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;We use Task Manager or Process Explorer to identify the potential memory &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;leak. First, bring up Task Manager and select the Memory Usage and Virtual &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Memory Size columns in Pre-Vista machines, and the Memory - Working Set and &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Memory - Commit Size columns in Post-Vista machines. Virtual memory (aka. &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Commit Size or Private Bytes) indicates how much memory the process is using &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;overall (both in and out of physical memory), whereas the Mem Usage (aka. &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Working Set) column shows how much physical memory the process is consuming. &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Typically, the best indicator for memory leaks is an increase in virtual &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;memory size (e.g. Commmit Size) and not fluctuations in working set size.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Virtual Memmory&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Private Bytes (aka. Commit Size or Virtual Memory Size) &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Peak Private Bytes&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Virtual Size&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Page Faults&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Page Fault Delta&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Physical Memory&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Working Set (aka. Mem Usage)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;WS Private: physical memory owned by just this process&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;WS Shareable: physical memory that could be shared with other processes&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;WS Shared: shareable memory that is current shared with other processes &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;(It is a subset of shareable WS. It tells the possible size of memory &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;that will still be in use after the current process exits)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Peak Working Set&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Note: Private Bytes may be bigger than Working Set Size when much virtual &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;memory is paged out. Private Bytes may also be smaller than Working Set Size &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;because the memory allocations are in pages (influencing working set size) &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;while the virtual memory size is in bytes which must be smaller than or equal &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;to one page of memory.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;In the example of LeakHeapMemory, we can observe in Task Manager the &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;continous increase of both virtual memory size and memory usage.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;- Step2. Using Memory Leak Detection Tools&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Several tools are available to help efficiently track down memory leaks. They &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;are UMDH, LeakDiag, !address, !heap, Pageheap, and CRTDBG.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;UMDH&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;http://support.microsoft.com/kb/268343&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;UMDH works by taking snapshots of the virtual memory usage of a process at &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;different points in time and logging them to text files. UMDH can compare the &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;log files taken at 2 instances of time and list the allocations that are &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;leaking. It requires GFLAGS "User Stack Trace Database Option" (+ust) to be &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;enabled in order to record the stack traces of the memory allocation requests &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;made by the process. Allocations and assocated stack traces in the log file &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;are tagged with "BackTracexxxxx". UMDH uses these tags as identifiers for &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;reporting leaks.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Note: UMDH tracks heap allocations only. In other words, it cannot track &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;allocations that are originating from non-heap-related memory activity (such &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;as calls to VirtualAlloc).&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;First, we need to enable stack traces for memory allocations. To accomplish &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;this, we use the gflags tool and enable "Create user mode stack trace &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;database" for CppResourceLeaks.exe.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;gflags -i CppResourceLeaks.exe +ust&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;The command needs to be run as administrator. It does not enable stack &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;tracing for processes that are already running, but it enables stack tracing &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;for all future executions of CppResourceLeaks.exe. Alternatively, you can set &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;the flag through the GFLAGS user interface. Use the -ust option for gflags to &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;disable the stack tracing when you are finished debugging. &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Second, we need to configure the debug symbols. One of the most important &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;steps to using UMDH is to make sure that you have good symbol files (.dbg or &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;.pdb file) to get a good stack trace. You can use the Microsoft Symbol Server &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;to obtain debug symbol files (http://support.microsoft.com/kb/311503/). UMDH &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;is capable of using dbghelp.dll to reading symbol files and resolving &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;addresses to symbolic function names.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Third, start CppResourceLeaks.exe and get its process ID from Task Manager.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Fourth, use UMDH to get a heap dump before the apparent leak happens with the &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;following command:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;umdh -p:PID -f:CppResourceLeaks1.log&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Now you have a complete heap dump of the CppResourceLeaks process in the &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;CppResourceLeaks1.log file. This file shows all of the allocations that were &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;made and the callstacks where the allocations were made. The log in this &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;state is not readable as the symbols are not resolved. UMDH can be instructed &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;to resolve the symbols by simulating a log comparison with an empty log, &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;using the command:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;umdh -v CppResourceLeaks1.log &amp;gt; CppResourceLeaks1.txt&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;The resulting log contains something like:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;+ 2018 ( 2018 - 0) 1 allocs BackTrace73F28&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;+ 1 ( 1 - 0) BackTrace73F28 allocations&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;ntdll!RtlAllocateHeap+00000274&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;kernel32!ConsoleAllocateCaptureBuffer+0000006F&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;kernel32!ReadConsoleInternal+0000007E&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;kernel32!ReadConsoleA+00000040&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;kernel32!ReadFileImplementation+00000075&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;MSVCR90D!_read_nolock+0000062C&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;MSVCR90D!_read+00000219&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;MSVCR90D!_filbuf+00000113&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;MSVCR90D!getc+00000208&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;MSVCR90D!_fgetchar+00000010&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;MSVCR90D!getchar+0000000A&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;CppResourceLeaks!LeakHeapMemory+0000003D (...\cppresourceleaks.cpp, 221)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;CppResourceLeaks!wmain+00000023 (...\cppresourceleaks.cpp, 260)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;CppResourceLeaks!__tmainCRTStartup+000001A8 (crtexe.c, 583)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;CppResourceLeaks!wmainCRTStartup+0000000F (crtexe.c, 403)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;kernel32!BaseThreadInitThunk+0000000E&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;ntdll!__RtlUserThreadStart+00000070&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;ntdll!_RtlUserThreadStart+0000001B&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Fifth, while memory is leaking, take the second snapshot of the heap:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;umdh -p:PID -f:CppResourceLeaks2.log&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Last, use UMDH to compare the UMDH logs:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;UMDH CppResourceLeaks1.log CppResourceLeaks2.log &amp;gt; cmp12.txt&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;In cmp12.txt, each log entry has the following syntax:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;+ BYTES_DELTA (NEW_BYTES - OLD_BYTES) NEW_COUNT allocs BackTrace TRACEID&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;+ COUNT_DELTA (NEW_COUNT - OLD_COUNT) BackTrace TRACEID allocations&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;... stack trace ...&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;where:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;BYTES_DELTA - increase in bytes between before and after log&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;NEW_BYTES - bytes in after log&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;OLD_BYTES - bytes in before log&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;COUNT_DELTA - increase in allocations between before and after log&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;NEW_COUNT - number of allocations in after log&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;OLD_COUNT - number of allocations in before log&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;TRACEID - decimal index of the stack trace in the trace database (can be &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;used to search for allocation instances in the original UMDH logs).&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;For example (LeakHeapMemory()), &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;+ 2a98c90 ( 2a98c90 - 0) 15cf4 allocs BackTrace74050&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;+ 15cf4 ( 15cf4 - 0) BackTrace74050 allocations&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;ntdll!RtlAllocateHeap+00000274&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;CppResourceLeaks!LeakHeapMemory+00000083 (...\cppresourceleaks.cpp, 228)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;CppResourceLeaks!wmain+00000023 (...\cppresourceleaks.cpp, 260)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;CppResourceLeaks!__tmainCRTStartup+000001A8 (crtexe.c, 583)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;CppResourceLeaks!wmainCRTStartup+0000000F (crtexe.c, 403)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;kernel32!BaseThreadInitThunk+0000000E&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;ntdll!__RtlUserThreadStart+00000070&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;ntdll!_RtlUserThreadStart+0000001B&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;- 2018 ( 0 - 2018) 0 allocs BackTrace73F28&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;- 1 ( 0 - 1) BackTrace73F28 allocations&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;ntdll!RtlAllocateHeap+00000274&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;kernel32!ConsoleAllocateCaptureBuffer+0000006F&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;kernel32!ReadConsoleInternal+0000007E&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;kernel32!ReadConsoleA+00000040&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;kernel32!ReadFileImplementation+00000075&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;MSVCR90D!_read_nolock+0000062C&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;MSVCR90D!_read+00000219&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;MSVCR90D!_filbuf+00000113&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;MSVCR90D!getc+00000208&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;MSVCR90D!_fgetchar+00000010&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;MSVCR90D!getchar+0000000A&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;CppResourceLeaks!LeakHeapMemory+0000003D (...\cppresourceleaks.cpp, 221)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;CppResourceLeaks!wmain+00000023 (...\cppresourceleaks.cpp, 260)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;CppResourceLeaks!__tmainCRTStartup+000001A8 (crtexe.c, 583)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;CppResourceLeaks!wmainCRTStartup+0000000F (crtexe.c, 403)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;kernel32!BaseThreadInitThunk+0000000E&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;ntdll!__RtlUserThreadStart+00000070&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;ntdll!_RtlUserThreadStart+0000001B&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;According to the comparison, the first call-stack appears for 15cf4 times, &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;and 2a98c90 bytes were leaked because of the LeakHeapMemory function.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;!address&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;The !address extension command comes in very handy when you want to get a &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;quick overview of where the memory in your process is really located. The &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;command gives statistics, such as memory region usage in heaps, stack, free, &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;and so on.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;For example (LeakHeapMemory()), &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0:000&amp;gt; !address -summary&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;ProcessParametrs 00381a18 in range 00380000 0039c000&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Environment 00380810 in range 00380000 0039c000&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;-------------------- Usage SUMMARY --------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;TotSize ( KB) Pct(Tots) Pct(Busy) Usage&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;11c4000 ( 18192) : 00.87% 02.27% : RegionUsageIsVAD&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;4f132000 ( 1295560) : 61.78% 00.00% : RegionUsageFree&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;397000 ( 3676) : 00.18% 00.46% : RegionUsageImage&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;200000 ( 2048) : 00.10% 00.26% : RegionUsageStack&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;2000 ( 8) : 00.00% 00.00% : RegionUsageTeb&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;2f760000 ( 777600) : 37.08% 97.01% : RegionUsageHeap&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0 ( 0) : 00.00% 00.00% : RegionUsagePageHeap&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;1000 ( 4) : 00.00% 00.00% : RegionUsagePeb&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0 ( 0) : 00.00% 00.00% : RegionUsageProcessParametrs&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0 ( 0) : 00.00% 00.00% : RegionUsageEnvironmentBlock&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Tot: 7fff0000 (2097088 KB) Busy: 30ebe000 (801528 KB)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;-------------------- Type SUMMARY --------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;TotSize ( KB) Pct(Tots) Usage&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;4f132000 ( 1295560) : 61.78% : &amp;lt;free&amp;gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;398000 ( 3680) : 00.18% : MEM_IMAGE&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;1be000 ( 1784) : 00.09% : MEM_MAPPED&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;30968000 ( 796064) : 37.96% : MEM_PRIVATE&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;-------------------- State SUMMARY --------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;TotSize ( KB) Pct(Tots) Usage&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;2f4cf000 ( 774972) : 36.95% : MEM_COMMIT&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;4f132000 ( 1295560) : 61.78% : MEM_FREE&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;19ef000 ( 26556) : 01.27% : MEM_RESERVE&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Largest free region: Base 30f00000 - Size 2a970000 (697792 KB)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;The column Pct(Tots) means the percentage of the entry in total virtual &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;memory. The column Pct(Busy) means the percentage of the entry in busy &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;virtual memory.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;RegionUsageIsVAD - memory allocated by VirtualAlloc in VMM&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;RegionUsageHeap - memory allocated by heap manager&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;From the output&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;11c4000 ( 18192) : 00.87% 02.27% : RegionUsageIsVAD&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;2f760000 ( 777600) : 37.08% 97.01% : RegionUsageHeap&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;we see that most used memory is heap alloc, instead of virtual alloc, so it's &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;a heap memory leak.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;!heap -s, !heap -a, and !heap -x -v&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;The !heap -s command allows you to get a detailed look at the heap summary of &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;the process and the suspicious heaps. Judging from the pattern of allocations &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;in the !heap extension command output (e.g. there are tons of blocks &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;allocated of same user size), chances are good that we can locate the heap &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;blocks that are leaked. Furthermore, by looking around at the heap block &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;contents (e.g. does it contain ASCII characters? does it correspond to the &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;address of some function / symbol?) we may see how / why the block was &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;allocated. &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Please note that because a lot of changes happened to the heap manager in &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Windows Vista and the later operating system, the allocation of heap entries &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;may vary. For example, the allocated block may be bigger than requested, or &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;the allocation granually grows in size.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;To prove that this is indeed a leak, you can search for references to the &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;block in the process's memory space. If these potentially leaked blocks were &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;being used (perhaps cached), there would need to be a reference somewhere in &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;memory that points to that heap block. If there are no references, it means &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;that we definitely have a leak. The !heap -x -v allows you to search the &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;entire memory space of the process for the presence of a specified address.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;For example (LeakHeapMemory()), &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0:000&amp;gt; !heap -s&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Heap Flags Reserv Commit Virt Free List UCR Virt Lock Fast &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;(k) (k) (k) (k) length blocks cont. heap &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;-----------------------------------------------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00150000 00000002 16384 16352 16352 2 0 1 0 0 L &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00250000 00008000 64 12 12 10 1 1 0 0 &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00380000 00001002 64 44 44 9 2 1 0 0 L &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;-----------------------------------------------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;The heap 00150000 occupies abnormally large memory.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0:000&amp;gt; !heap -a 00120000&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00246240: 00200 . 00200 [01] - busy (1f4)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00246440: 00200 . 00200 [01] - busy (1f4)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00246640: 00200 . 00200 [01] - busy (1f4)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00246840: 00200 . 00200 [01] - busy (1f4)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00246a40: 00200 . 00200 [01] - busy (1f4)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00246c40: 00200 . 00200 [01] - busy (1f4)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00246e40: 00200 . 00200 [01] - busy (1f4)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00247040: 00200 . 00200 [01] - busy (1f4)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00247240: 00200 . 00200 [01] - busy (1f4)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;We find a large number of blocks with the same user allocation size (1f4). &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;This is usually a good indicator that they are potentially leaked blocks. &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;The next step is to find out what these blocks actually contain. If we were &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;leaking memory, it would be reasonable to expect data related to our &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;application contained within those blocks:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0:000&amp;gt; db 00246c40+0x8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00246c48 41 6c 6c 2d 49 6e 2d 4f-6e 65 20 43 6f 64 65 20 All-In-One Code &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00246c58 46 72 61 6d 65 77 6f 72-6b 00 00 00 00 00 00 00 Framework.......&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Before we come to the conclusion that this is in fact a leak, we should &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;verify it by searching for references to the block in the process's memory &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;space. &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0:000&amp;gt; !heap -x -v 00246c40+0x8&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Entry User Heap Segment Size PrevSize Unused Flags&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;-----------------------------------------------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00246c40 00246c48 00150000 00150640 200 200 c busy &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Search VM for address range 00246c40 - 00246e3f : &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;The search yielded zero results. As stated before, if a currently allocated &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;heap block is not referenced anywhere in memory, we can safely say that we &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;are leaking that block.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;!heap -l&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;The !heap -l command causes debugger to look for leaked heap blocks. It &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;automates the act of dumping out all heap blocks (!heap -s) and &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;systematically searching for any potentially leaked blocks (!heap -x -v). &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Please note that !heap -l does not work if full page heap is enabled for the &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;process.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;For example (LeakHeapMemory()), &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0:000&amp;gt; !heap -l&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Searching the memory for potential unreachable busy blocks.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Heap 00150000&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Heap 00250000&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Heap 00380000&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Scanning VM ...&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Scanning references from 32822 busy blocks (16 MBytes) ....&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Entry User Heap Segment Size PrevSize Unused Flags&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;-----------------------------------------------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00154640 00154648 00150000 00150000 200 200 c busy &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00154840 00154848 00150000 00150000 200 200 c busy &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00154a40 00154a48 00150000 00150000 200 200 c busy &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00154e40 00154e48 00150000 00150000 200 200 c busy &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00155040 00155048 00150000 00150000 200 200 c busy &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00155240 00155248 00150000 00150000 200 200 c busy &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00155640 00155648 00150000 00150000 200 200 c busy &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00155840 00155848 00150000 00150000 200 200 c busy &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;29050 potential unreachable blocks were detected.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Pageheap, and !heap -p -a&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;After you have identified a potential leak culprit using the above !heap &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;commands, it would be useful to see which stack trace made the allocation to &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;begin with. If we had that, we could find out exactly what the code was doing &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;and what it was allocating.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;First, we need to enable stack tracing using Application Verifier. Second, &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;run !heap -p -a upon the address that we thought was leaking. Not only will &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;we see general information about the leaked address (such as which heap it's &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;in and the trace ID), but we also get the full stack trace of the code that &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;made the allocation. From here, it is a trivial exercise to code review and &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;find the culprit code.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Note, while using page heap, !heap -s, !heap -a, !heap -x -v and !heap -l may &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;not work at all! We should find the culprit memory block and run !heap -p -a &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;upon it directly.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;For example (LeakHeapMemory()), &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0:000&amp;gt; !address 0b768e08&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Usage: PageHeap&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Base Address: 0b768000&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;End Address: 0b769000&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Region Size: 00001000&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Type: 00020000 MEM_PRIVATE&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;State: 00001000 MEM_COMMIT&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Protect: 00000004 PAGE_READWRITE&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;More info: !heap -p 0x150000&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;More info: !heap -p -a 0xb768e08&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0:000&amp;gt; !heap -p -a 0xb768e08&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;address 0b768e08 found in&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;_DPH_HEAP_ROOT @ 151000&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;in busy allocation ( DPH_HEAP_BLOCK: UserAddr UserSize - VirtAddr VirtSize)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;b72e700: b768e08 1f4 - b768000 2000&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;7c83d9aa ntdll!RtlAllocateHeap+0x00000e9f&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;0039fd2c vfbasics!AVrfpRtlAllocateHeap+0x000000b1&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;00401046 CppResourceLeaks!LeakHeapMemory+0x00000046&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Not only do we see general information about the leaked address (such as &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;which heap it's in and the trace ID), but we also get the full stack trace of &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;the code that made the allocation. From here, it is a trivial exercise to &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;code review and find the culprit code.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;CRTDBG&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Debug version of C Run Time Library has facilities to debug C Run Time Heap &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;related problems like leaks and corruption. It requires application to be &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;rebuilt with debug CRT. &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;When _DEBUG is defined the following functions call the respective _xxx_dbg() &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;versions which provide extra debugging capabilities: malloc, realloc, calloc, &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;expand, free, msize.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;When _CRTDBG_MAP_ALLOC is defined the _xxx_dbg() versions of the CRT heap &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;functions are call directly instead of the standard versions. This enables &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;the _xxx_dbg() funtions to record the location (source file path &amp;amp; line &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;number) where the allocation function is being invoked. The information can &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;be used to identify the location in the source code where the block was &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;allocated.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;After enabling the above flags, debug CRT heap manager can perform various &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;types of checking like heap corruptions and heap leaks in run-time or debug-&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;time:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;_CrtSetDbgFlag() retrieves and modifies the behavior of the debug heap&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;_CrtCheckMemory() performs integrity check on memory blocks&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;_CrtDumpMemoryLeaks() dumps all heap blocks when memory leaks occurs&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;For example ((LeakCRTHeapMemory()), &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;First, we enable the debug heap functions, include the following statements &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;in the program:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;#define _CRTDBG_MAP_ALLOC&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;#include &amp;lt;crtdbg.h&amp;gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Note: The #include statements must be in the order shown here. If you change &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;the order, the functions you use may not work properly. &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;By including crtdbg.h, you map the malloc and free functions to their debug &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;versions, _malloc_dbg and _free_dbg, which keep track of memory allocation &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;and deallocation. This mapping occurs only in a debug build (in which _DEBUG &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;is defined). Release builds use the ordinary malloc and free functions.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;At the end of the function LeakCRTHeapMemory, add the line &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;_CrtDumpMemoryLeaks();&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;When you run your program under the debugger, _CrtDumpMemoryLeaks displays &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;memory leak information in the Output window. The memory leak information &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;looks like this:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Detected memory leaks!&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Dumping objects -&amp;gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;...\cppresourceleaks.cpp(257) : {101} normal block at 0x00511F40, 500 bytes long.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Data: &amp;lt; &amp;gt; CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Object dump complete.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;//---------------------------------------------------------------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Fixes:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;A. Handle Leaks&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;1. Be careful to close the handles after they are created.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;2. Consider employing an auto acquire/release construct. Very similar to auto &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;pointers, this construct allows you to acquire a handle at any given scope &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;and automatically free it when the auto construct goes out of scope. &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;B. Memory Leaks&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;1. Be careful that the allocation and deallocation of memory on the heap &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;should be paired and should target the same heap. The most common pairs are:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;new - delete&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;malloc - free&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;GlobalAlloc - GlobalFree&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;LocalAlloc - LocalFree&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;CoTaskMemAlloc - CoTaskMemFree&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;SysAllocString - SysFreeString&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;2. Consider using an auto construct that automatically deletes memory when &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;the variable goes out of scope, such as auto_ptr in STL.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;3. Consider overloading the allocation APIs used in your application. This &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;allows for trapping all calls to memory allocations, thereby giving you hooks &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;to all memory allocations performed by your applications. The allocation &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;hooks can then be used to track memory allocations, simulate failures in &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;memory allocations, and much more.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;//---------------------------------------------------------------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;References:&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Mario Hewardt &amp;amp; Daniel Pravat, Advanced Windows Debugging Ch. 9 (2007), at &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;http://advancedwindowsdebugging.com/. Copyright 2008 by Pearson Education, &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Inc. This material may be distributed only subject to the terms and &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;conditions set forth in the Open Publication License, v1.0 or later (the &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;latest version is presently available at http://www.opencontent.org/openpub/). &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Excerpted by Jialiang Ge, 2009. &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Wiki: Handle leak&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;http://en.wikipedia.org/wiki/Handle_leak&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Debug Tutorial Part 5: Handle Leaks&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;http://www.codeproject.com/KB/debug/cdbntsd5.aspx&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Use !htrace to debug handle leak&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;http://blogs.msdn.com/junfeng/archive/2008/04/21/use-htrace-to-debug-handle-leak.aspx&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Resource Leaks: Detecting, Locating, and Repairing Your Leaky GDI Code&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;http://msdn.microsoft.com/en-us/magazine/cc301756.aspx&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Wiki: Memory leak&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;http://en.wikipedia.org/wiki/Memory_leak&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;The poor man's way of identifying memory leaks&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;http://blogs.msdn.com/oldnewthing/archive/2005/08/15/451752.aspx&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;Umdhtools.exe: How to use Umdh.exe to find memory leaks&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;http://support.microsoft.com/kb/268343&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;MSDN: Memory Leak Detection and Isolation&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx"&gt;http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;//---------------------------------------------------------------------------------------------&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt; &lt;img src="http://www.cnblogs.com/pugang/aggbug/2206538.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/pugang/archive/2011/10/10/2206538.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/pugang/archive/2011/06/20/2085394.html</id><title type="text">常用计算机排序算法简单总结</title><summary type="text">计算机排序算法主要分为内排序和外排序，内排序主要指数据存储在内存中的排序，外排序通常指待排序的数据量很大，而且大部分数据存储于文件中，排序时需要读写文件的排序。通常大家讨论的都是内排序，因为内排序是外排序的根基，通常外排序过程都程序要辅助内排序。 最常见的内排序是冒泡排序，其时间复杂度为O(n^2), 空间复杂度为O(1)，基本上属于就地排序，而且该算法具有稳定性，在数据量不大，而且顺序基本已经排列好的情况下，该算法应该被优先考虑，其实现代码如下：冒泡排序（Bubble Sort）//DataswopfunctionvoidSwap(int&amp;amp;p,int&amp;amp;q){p=p^q;q=p</summary><published>2011-06-20T09:33:00Z</published><updated>2011-06-20T09:33:00Z</updated><author><name>SolidMango</name><uri>http://www.cnblogs.com/pugang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/pugang/archive/2011/06/20/2085394.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/pugang/archive/2011/06/20/2085394.html"/><content type="html">&lt;p style="line-height: normal; margin: 0in 0in 0pt"&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;　　计算机排序算法主要分为内排序和外排序，内排序主要指数据存储在内存中的排序，外排序通常指待排序的数据量很大，而且大部分数据存储于文件中，排序时需要读写文件的排序。通常大家讨论的都是内排序，因为内排序是外排序的根基，通常外排序过程都程序要辅助内排序。&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt"&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt"&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;　　最常见的内排序是冒泡排序，其时间复杂度为&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;O(n^2), &lt;/span&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;空间复杂度为&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;O(1)&lt;/span&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;，基本上属于就地排序，而且该算法具有稳定性，在数据量不大，而且顺序基本已经排列好的情况下，该算法应该被优先考虑，其实现代码如下：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt"&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;冒泡排序（&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: Consolas; font-size: 12pt"&gt;Bubble Sort&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;&lt;/span&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt"&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;strong&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;Data&amp;nbsp;swop&amp;nbsp;function&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Swap(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt;p,&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: #000000"&gt;q)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;p&lt;/span&gt;&lt;span style="color: #000000"&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: #000000"&gt;q;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;q&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;p&lt;/span&gt;&lt;span style="color: #000000"&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: #000000"&gt;q;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;p&lt;/span&gt;&lt;span style="color: #000000"&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: #000000"&gt;q;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;Bubble&amp;nbsp;sort&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;BuubleSort(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ArrayInput[],&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;nNum)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;j&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;(&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;nNum&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;(j&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;j&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;nNum&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt;i&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;j&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(ArrayInput[j]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ArrayInput[j&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: #000000"&gt;])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Swap(&amp;nbsp;ArrayInput[j],&amp;nbsp;ArrayInput[j&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: #000000"&gt;]&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;_tmain(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;argc,&amp;nbsp;_TCHAR&lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;argv[])&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;nNum&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;10&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ArrayInput[]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;3&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;4&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;8&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;8&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;9&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;7&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;6&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;5&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: #000000"&gt;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BuubleSort(ArrayInput,&amp;nbsp;nNum);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;nNum;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ArrayInput[i]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: #000000"&gt;endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: #000000"&gt;&lt;strong&gt;;&lt;br /&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt"&gt;&lt;font size="3" face="Simsun"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt"&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none" &gt;&lt;span style="font-family: SimSun; font-size: 12pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'" lang="ZH-CN"&gt;　　另一个比较常用的内排序是快速排序，其平均时间复杂度为&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 12pt; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'"&gt;O(nlgn), &lt;/span&gt;&lt;span style="font-family: SimSun; font-size: 12pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'" lang="ZH-CN"&gt;最坏时间复杂度为&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 12pt; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'"&gt;O(n^2), &lt;/span&gt;&lt;span style="font-family: SimSun; font-size: 12pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'" lang="ZH-CN"&gt;该算法为不稳定排序算法，通常对大量数据进行排序时，时间优势还是比较明显的。&lt;/span&gt;&lt;span style="font-family: SimSun; font-size: 12pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'" lang="ZH-CN"&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none" &gt;&lt;span style="font-family: SimSun; font-size: 12pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'" lang="ZH-CN"&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 12pt; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;快速排序（&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: Consolas; font-size: 12pt"&gt;Quick Sort&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;）&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: Consolas; font-size: 12pt"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; text-indent: 21pt; margin: 0in 0in 0pt"&gt;&lt;span style="font-family: Consolas; font-size: 12pt"&gt;N&lt;/span&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;个元素被分成&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 12pt"&gt;3&lt;/span&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;组：&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 12pt"&gt;left, right, pivot&lt;/span&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;，其中&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 12pt"&gt;Left&amp;lt;=pivot&amp;lt;=right&lt;/span&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;，所以&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 12pt"&gt;left&lt;/span&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;和&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 12pt"&gt;right&lt;/span&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;可以分别排序，而且&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 12pt"&gt;Quick Sort&lt;/span&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;中可以省去对结果组合的步骤&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 12pt"&gt;,&lt;/span&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;代码如下&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 12pt"&gt;:&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none" &gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;Data&amp;nbsp;swop&amp;nbsp;function&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Swap(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt;p,&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt;q)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;p&lt;/span&gt;&lt;span style="color: #000000"&gt;^&lt;/span&gt;&lt;span style="color: #000000"&gt;q;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;q&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;p&lt;/span&gt;&lt;span style="color: #000000"&gt;^&lt;/span&gt;&lt;span style="color: #000000"&gt;q;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;p&lt;/span&gt;&lt;span style="color: #000000"&gt;^&lt;/span&gt;&lt;span style="color: #000000"&gt;q;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;Partition&amp;nbsp;function&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Partition(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ArrayInput[],&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;nLow,&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;nHigh)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;j&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;nTemp&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;nLow;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;nHigh;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nTemp&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;ArrayInput[i];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;do&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;From&amp;nbsp;right&amp;nbsp;to&amp;nbsp;left&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;while&lt;/span&gt;&lt;span style="color: #000000"&gt;((ArrayInput[j]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;nTemp)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(i&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;j))&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j&lt;/span&gt;&lt;span style="color: #000000"&gt;--&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(i&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;j)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Swap(ArrayInput[i&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;],ArrayInput[j]);&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;From&amp;nbsp;left&amp;nbsp;to&amp;nbsp;right&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;while&lt;/span&gt;&lt;span style="color: #000000"&gt;((ArrayInput[i]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;nTemp)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(i&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;j))&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(i&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;j)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Swap(ArrayInput[j&lt;/span&gt;&lt;span style="color: #000000"&gt;--&lt;/span&gt;&lt;span style="color: #000000"&gt;],ArrayInput[i]);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span style="color: #0000ff"&gt;while&lt;/span&gt;&lt;span style="color: #000000"&gt;(i&lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt;j);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ArrayInput[i]&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;nTemp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;Quick&amp;nbsp;sort&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Quick_sort(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ArrayInput[],&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;nLow,&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;nHigh)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(nLow&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;nHigh)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;Partition(ArrayInput&amp;nbsp;,&amp;nbsp;nLow,&amp;nbsp;nHigh);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Quick_sort(ArrayInput&amp;nbsp;,&amp;nbsp;nLow,&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Quick_sort(ArrayInput&amp;nbsp;,&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;nHigh);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;_tmain(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;argc,&amp;nbsp;_TCHAR&lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;argv[])&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ArrayInput[]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;3&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;4&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;8&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;8&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;9&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;7&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;6&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;5&lt;/span&gt;&lt;span style="color: #000000"&gt;};&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;nNum&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;10&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Quick_sort(ArrayInput,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;nNum&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;(i&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;nNum;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;ArrayInput[i]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;endl;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none" &gt;&lt;font face="Simsun"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none" &gt;&lt;font face="Simsun"&gt;&lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; margin: 0in 0in 0pt"&gt;&lt;/p&gt; &lt;img src="http://www.cnblogs.com/pugang/aggbug/2085394.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/pugang/archive/2011/06/20/2085394.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/pugang/archive/2011/04/22/2024884.html</id><title type="text">C# 实现Domain Login 验证用户权限与Domain Mode读取</title><summary type="text">1. Domain Login 验证用户权限publicboolValidateDomainUser(stringUserName,stringPassword,stringDomain){boolbValid=false;using(PrincipalContextcontext=newPrincipalContext(ContextType.Domain,Domain)){bValid=context.ValidateCredentials(UserName,Password);}returnbValid;}2. Domain Mode读取privatevoidDomainModeChec</summary><published>2011-04-22T06:23:00Z</published><updated>2011-04-22T06:23:00Z</updated><author><name>SolidMango</name><uri>http://www.cnblogs.com/pugang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/pugang/archive/2011/04/22/2024884.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/pugang/archive/2011/04/22/2024884.html"/><content type="html">&lt;p style="line-height: normal; margin: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="font-size: 12pt"&gt;1. Domain Login &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: SimSun; font-size: 12pt"&gt;验证用户权限&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 12pt"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ValidateDomainUser(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;UserName,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Password,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Domain)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;bValid&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(PrincipalContext&amp;nbsp;context&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;PrincipalContext(ContextType.Domain,&amp;nbsp;Domain))&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bValid&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;context.ValidateCredentials(UserName,&amp;nbsp;Password);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;bValid;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Calibri"&gt;2. Domain Mode&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-family: SimSun; font-size: 12pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin" lang="ZH-CN"&gt;读取&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-family: SimSun; font-size: 12pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin" lang="ZH-CN"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;DomainModeCheck(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;UserName,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Password,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Domain)&lt;br /&gt;{&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DirectoryContext&amp;nbsp;oContext&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oContext&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;DirectoryContext(DirectoryContextType.Domain,&amp;nbsp;Domain,&amp;nbsp;UserName,&amp;nbsp;Password);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DomainMode&amp;nbsp;DM&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;System.DirectoryServices.ActiveDirectory.Domain.GetDomain(oContext).DomainMode;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show(DM.ToString());&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;font face="Simsun"&gt;&lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt" &gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 8pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'" lang="ZH-CN"&gt;注：本代码经过测试，运行结果正确无误，但是在&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Consolas; font-size: 8pt; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'"&gt;Windows Server 2003 &lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 8pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'" lang="ZH-CN"&gt;冗余&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Consolas; font-size: 8pt; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'"&gt;Domain Servers&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 8pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'" lang="ZH-CN"&gt;的环境中当主&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Consolas; font-size: 8pt; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'"&gt;Domain Server(PDC)&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 8pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'" lang="ZH-CN"&gt;断网的情况下，使用从&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Consolas; font-size: 8pt; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'"&gt;Domain Server (BDC)&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 8pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'" lang="ZH-CN"&gt;进行权限验证，&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Consolas; font-size: 8pt; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'"&gt;ValidateDomainUser()&lt;/span&gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 8pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'" lang="ZH-CN"&gt;无法对用户权限进行验证，并且有异常抛出。&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Consolas; font-size: 8pt; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0in 0in 10pt" &gt;&lt;span style="line-height: 115%; font-family: SimSun; font-size: 8pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'" lang="ZH-CN"&gt;欢迎朋友们对于此问题进行讨论&lt;/span&gt;&lt;span style="line-height: 115%; font-family: Consolas; font-size: 8pt; mso-no-proof: yes; mso-bidi-font-family: 'Times New Roman'"&gt;..&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;  &lt;img src="http://www.cnblogs.com/pugang/aggbug/2024884.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/pugang/archive/2011/04/22/2024884.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
