﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-adaiye-随笔分类-.NET</title><link>http://www.cppblog.com/adaiye/category/5026.html</link><description>If you think you can, you can!</description><language>zh-cn</language><lastBuildDate>Thu, 22 May 2008 18:40:30 GMT</lastBuildDate><pubDate>Thu, 22 May 2008 18:40:30 GMT</pubDate><ttl>60</ttl><item><title>《.NET设计规范》&amp;mdash;&amp;mdash;学习笔记(3) 命名规范</title><link>http://www.cppblog.com/adaiye/archive/2007/10/11/33928.html</link><dc:creator>adaiye</dc:creator><author>adaiye</author><pubDate>Thu, 11 Oct 2007 01:22:00 GMT</pubDate><guid>http://www.cppblog.com/adaiye/archive/2007/10/11/33928.html</guid><wfw:comment>http://www.cppblog.com/adaiye/comments/33928.html</wfw:comment><comments>http://www.cppblog.com/adaiye/archive/2007/10/11/33928.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/adaiye/comments/commentRss/33928.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/adaiye/services/trackbacks/33928.html</trackback:ping><description><![CDATA[<p>一组一致的的命名约定对框架的可用性及其重要。 名字要易于理解，同时必须传达每个元素的功能。</p> <h2>大小写约定</h2> <p>标识符的大小写规则</p> <p>PascalCasing：如HtmlTag&nbsp; IOStream</p> <p>camelCasing：如htmlTag&nbsp; ioStream</p> <ul> <li>要把PascalCasing用于由多个单词构成的名字空间、类型、以及成员的名字；  <li>要把camelCasing用于参数的名字。</li></ul> <h2>通用命名约定</h2> <h3><strong>单词的选择</strong></h3> <p>对框架中标识符的名字来说，很重要的一点是一目了然。</p> <p>名字的意思清楚比长度短更重要。名字应该与场景、系统的逻辑组成或物理组成以及为人熟知的概念相对应，而不应该与技术或框架相对应。</p> <ul> <li>要为标识符选择易于阅读的名字；  <li>要更看重可读性，而不是更看重简短性；  <li>不要使用下划线、连字符以及其他任何既非字母也非数字的字符；  <li>不要使用匈牙利命名法；  <li>避免使用与广泛使用的编程语言的关键字有冲突的标识符。</li></ul> <h3><strong>使用单词缩写和首字母缩写词</strong></h3> <p>一般来说，不要在标识符中使用单词缩写或首字母缩写：宁可名字长一点，也不要别人看不懂。&nbsp; 尤其不要使用未被广泛接受的单词缩写和首字母缩写词。</p> <ul> <li>不要使用缩写词或缩略词作为标识符名字的一部分<br>用GetWindow&nbsp; 不用GetWin  <li>不要使用未被广泛接受的首字母缩写词<br>多谓广泛接受：用搜索引擎在网上搜索该首字母缩写词，如果返回的前几个结果与期望相符，那么该首字母缩写词才有资格被称为众所周知。</li></ul> <h3><strong>避免使用语言特有的名字</strong></h3> <ul> <li>要给类型名使用语义上有意义的名字，而不要使用特有的关键字<br>GetLength比GetInt要好  <li>要使用CLR的通用类型名，而不要使用语言特有的别名  <li>要使用常见的名字，比如value或item，而不要重复类型的名字</li></ul> <h3><strong>为已有API的新版本命名</strong></h3> <p>当用新类型和新成员接替或取代已有的类型或成员时，如何选择名字：</p> <ul> <li>使用与旧API相似的名字  <li>要优先使用后缀而不是前缀来表示已有API的新版本<br>这样有助于在浏览文档或使用Intellisense时发现新版本：按字母排序  <li>可以考虑使用全新但有意义的标识符  <li>要使用数字后缀来表示已有API的新版本<br>有些名字（或工业标准）不宜添加后缀或改名  <li>不要在标识符中使用“Ex”“New”等类似的后缀来区分相同API的不同版本  <li>要在引入64位整数（long）而非32位整数进行操作的新版本API时使用“64”后缀，反之亦然。</li></ul> <h2>程序集和DLL的命名</h2> <p>程序集是一个部署单元，同时还代表托管代码程序的身份。虽然程序集可以分布一个或多个文件中，但一般来说一个程序集仅与一个DLL相对应。</p> <p>名字空间与DLL程序集的区别：</p> <blockquote> <p>名字空间：一组逻辑实体</p></blockquote> <blockquote> <p>DLL和程序集：打包和部署时的一个单</p></blockquote> <ul> <li>要为程序集和DLL选择提示性的名字，比如System.Data，这样很容易就知道它的大致功能。  <li>DLL命名：&lt;Company&gt;.&lt;Component&gt;.dll</li></ul> <h2>名字空间的命名</h2> <p>&lt;Company&gt;.(&lt;Product&gt;|&lt;Technology&gt;)[.&lt;Feature&gt;][.&lt;Subnamespace&gt;]</p> <ul> <li>要用公司名称作为名字空间的前缀，不要用缩写  <li>要用稳定的与版本无关的产品名称作为名字空间的第二层  <li>不要根据公司的组织架构来决定名字空间的层次结构，因为公司内部组织的名称一般来说不会持续太长的时间  <li>要使用PascalCasing大小写风格，并用点号来分隔名字空间的各部分。<br>如Microsoft.Office.PowerPoint  <li>考虑适当的时候在名字空间中使用复数形式。&nbsp; 首字母缩写词例外<br>System.Collections<br>System.IO  <li>不要用相同的名字来命名名字空间与位于该名字空间中的类型<br>如：不要将名字空间命名为Debug，然后又在该名字空间中提供一个名为Debug的类。</li></ul> <h3><strong>名字空间和类型冲突</strong></h3> <ul> <li>不要引入太一般化的类型名，比如Element、Node、Log以及Message。</li></ul> <p>不同类型的名字空间，有不同的规范来避免类型名的冲突：</p> <ul> <li>应用程序模型名字空间（application model namespace）<br>属于单个应用程序模型的名字空间经常一起使用，但是它们几乎不合属于其他应用程序模型的名字空间一起使用<br>System.Windows*<br>System.UI*  <li>基础设施名字空间（infrastructure namespace）<br>此类别包含一些在开发常用应用程序时很少会导入的名字空间  <li>核心名字空间（core namespace）<br>包含了所有的System名字空间，但应用程序模块名字空间和基础设施名字空间除外。&nbsp; 包括System、System.IO、System.Xml以及System.Net等等  <li>技术名字空间组（technology namespace group）<br>此类别包含所有那些以相同的两个前缀（&lt;Company&gt;.&lt;Technology&gt;*）开始的名字空间。</li></ul> <h2>类、结构和接口的命名</h2> <p>一般来说类型名应该是名词词组。如果无法为类型找到一个名词词组，那么应该重新考虑类型的总体设计。</p> <p>另一个中重要的考虑因素：最易于识别的名字应该用于最常用的类型。</p> <p>最常用的类型名应该反映出使用场景，而不是继承层次。</p> <ul> <li>要用名词词组来给类型命名。使用PascalCasing风格  <li>不要给类名加前缀<br>只有接口才能（可以）被加前缀“I”，那是因为.NET框架受到COM及Java的影响  <li>考虑让派生类的名字以其基类结尾<br>public class FileStream : Stream {...}  <li>要确保一对类/接口的名字只差一个“I”前缀，如果该类是该接口的标准实现。<br>public interface IComponent {...}<br>public class Component : IComponent {...}</li></ul> <h3><strong>泛型类型参数的命名</strong></h3> <ul> <li>要用描述性的名字来命名  <li>考虑用T来命名参数类型  <li>要给描述性的类型参数名加上T前缀  <li>考虑在类型参数中显示出施加于该类型参数上的限制</li></ul> <h3><strong>枚举类型的命名</strong></h3> <ul> <li>要用单数名词来命名枚举类型，除非它表示的是位域（bit field）  <li>不要给枚举类型的名字添加“Enum”后缀，也不要添加“Flag”、“Flags”等后缀  <li>不要给枚举类型值的名字添加前缀<br>此规范与C++中通常所使用的恰好相反。在C++中给枚举的每个成员加上完成的限定符是很重要的，因为它们可能在枚举名的作用域之外被访问。但是在托管代码中，枚举成员只能通过枚举名的作用域来访问。</li></ul> <h2>类型成员的命名</h2> <p>类型：方法、属性、事件、构造函数、字段</p> <h3><strong>方法的命名</strong></h3> <p>要尽量根据方法所对应的任务来给它们命名，而不要根据一些实现细节。</p> <ul> <li>要用动词或动词词组来命名方法</li></ul> <h3><strong>属性的命名</strong></h3> <ul> <li>要用名词、名词词组或形容词来命名属性  <li>不要让属性名看起来与“Get”方法的名字相似  <li>要用肯定性的短语（CanSeek而不是CantSeek）来命名布尔属性  <li>考虑用属性的类型名来命名属性<br>public enum Color {...}<br>public class Control<br>{<br>&nbsp;&nbsp;&nbsp; public Color Color<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get {...}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set {...}<br>&nbsp;&nbsp;&nbsp; }<br>}</li></ul> <h3><strong>事件的命名</strong></h3> <ul> <li>要用动词或动词短语来命名事件<br>事件总是表示一些动作，要么正在发生，要么已经发生  <li>要用现在时和过去时来赋予事件名之前和之后的概念<br>窗口关闭之前发生的close事件：Closing<br>窗口关闭之后发生的close时间：Closed  <li>不要用Before和After前缀或后缀来区分前置和后置事件  <li>要在命名事件处理函数（用作事件类型的委托）时加上“EventHandler”后缀  <li>要在事件处理函数中用sender和e作为两个参数的名字<br>sender：触发事件的对象，在整个.NET框架中，sender为object类型  <li>要在命名事件的参数类型时加上“EventArgs”后缀</li></ul> <h3><strong>字段的命名</strong></h3> <ul> <li>PascalCasing风格  <li>名词或名词短语  <li>不要给字段名添加前缀</li></ul> <h2>参数的命名</h2> <ul> <li>camelCasing风格  <li>要使用描述性的参数名<br>参数名要具备足够的描述性，使得在大多数情况下，用户根据参数的名字和类型就能够确定它的意思  <li>考虑根据参数的意思而不是参数的类型来命名参数</li></ul> <h2>资源的命名</h2> <p>本地化的资源就好比是属性，可以通过特定的对象来引用。因此，它的命名规范与属性的相似。</p> <ul> <li>要在命名属性关键字（resource key）时使用PascalCasing大小写风格  <li>要使标识符的名字具有描述性而不是使名字变短  <li>不要使用各主要CLR编程语言特有的关键字  <li>要在命名资源时使用字母、数字和下划线  <li>要用点号来给标识符清楚地划分层次  <li>要在为异常消息资源命名是遵循下面的命名约定：<br>资源标识符应该是异常的类型名加一个简短的异常标识符，之间以点号分隔</li></ul><img src ="http://www.cppblog.com/adaiye/aggbug/33928.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/adaiye/" target="_blank">adaiye</a> 2007-10-11 09:22 <a href="http://www.cppblog.com/adaiye/archive/2007/10/11/33928.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>漫谈C#之关键字（1）</title><link>http://www.cppblog.com/adaiye/archive/2007/09/20/32568.html</link><dc:creator>adaiye</dc:creator><author>adaiye</author><pubDate>Thu, 20 Sep 2007 09:12:00 GMT</pubDate><guid>http://www.cppblog.com/adaiye/archive/2007/09/20/32568.html</guid><wfw:comment>http://www.cppblog.com/adaiye/comments/32568.html</wfw:comment><comments>http://www.cppblog.com/adaiye/archive/2007/09/20/32568.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/adaiye/comments/commentRss/32568.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/adaiye/services/trackbacks/32568.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 每一种语言都有非常多的关键字，而且这些关键字也都大同小异，不过毕竟还是有些许的不一样。有些关键字大家碰到的多了，自然就熟悉了，但是有些关键字用得不大多，或者是新引入的，所以就不大熟悉了。我平常在用的时候，就是会碰到一些关键字，感觉有点生疏，平常也会把这些我不懂的关键字的用法了解一下并记录下来。想到应该也有很多跟我同样的人，所以就把我的记录跟大家分享一下。请各位tx多多指正！<br><strong>访问关键字</strong><br>&nbsp;&nbsp;&nbsp; base：用于派生类中访问基类的成员  <ul> <li>调用基类上已被其他方法重写的方法  <p>1 public override void&nbsp;GetInfo()<br>2 {<br>3 base.GetInfo();&nbsp;//&nbsp;调用基类上的GetInfo方法<br>4 }</p> <li>指定创建派生类实例时应用的基类构造函数  <p>1 public&nbsp;MyDerived()&nbsp;:&nbsp;base()&nbsp;//&nbsp;调用基类的构造函数<br>2 {<img alt="" src="http://www.cnblogs.com/Images/dot.gif">}</p></li></ul>&nbsp;&nbsp;&nbsp; 从静态方法中使用base关键字是错误的。<br><strong>转换关键字<br></strong>explicit：用于声明用户定义的显式类型转换运算符  <p>1 class&nbsp;MyType<br>2 {<br>3 public static explicit operator&nbsp;MyType(int&nbsp;i)<br>4 &nbsp;&nbsp;&nbsp;&nbsp;{<br>5 //&nbsp;从int转换到MyType类型的代码<br>6 &nbsp;&nbsp;&nbsp;&nbsp;}<br>7 }  <p><strong></strong>显式转换运算符必须通过类型转换调用  <p>1 int&nbsp;i;<br>2 MyType&nbsp;x&nbsp;=&nbsp;(MyType)i;&nbsp;//&nbsp;int到MyType类型的转换需要进行类型转换  <p>&nbsp;&nbsp;&nbsp; 如果转换操作可能导致异常或信息丢失，则应用explicit关键字标记它。<br>&nbsp;&nbsp;&nbsp; implicit：用于声明用户定义的隐式转换运算符&nbsp;  <p>1 class&nbsp;MyType<br>2 {<br>3 public static implicit operator int(MyType&nbsp;m)<br>4 &nbsp;&nbsp;&nbsp;&nbsp;{<br>5 //&nbsp;从MyType转换到int类型的代码<br>6 &nbsp;&nbsp;&nbsp;&nbsp;}<br>7 }  <p>1 MyType&nbsp;x;<br>2 int&nbsp;i&nbsp;=&nbsp;x;&nbsp;&nbsp;//&nbsp;隐式地调用MyType的MyType到int类型的转换运算符  <p><strong></strong>隐式转换可以通过消除不必要的类型转换来提高源代码的可读性。<br>&nbsp;&nbsp;&nbsp; 一般情况下，调用某一个隐式转换时，应当绝不会引发异常，并且不会造成信息丢失。否则，应将其标记为explicit。<br><strong>方法参数关键字</strong><br>&nbsp;&nbsp;&nbsp; 如果声明方法的参数时没有指明ref或out，该参数将具有与该方法相关的值。这个值在方法中能被更改，但是当程序返回到调用过程时，这种改动不会被保留。<br><strong><br></strong>&nbsp;&nbsp;&nbsp; params：用于指定在参数数目可变时带有参数的方法参数<br>&nbsp;&nbsp;&nbsp; 在方法声明中的params关键字之后不允许引入任何其他参数，但在其前面可以有其他参数。而且在方法声明中只允许使用一个params关键字。  <p>&nbsp;1 public static void&nbsp;UseParams(params int[]&nbsp;list)<br>&nbsp;2 {<br>&nbsp;3 for(int&nbsp;i&nbsp;= 0;&nbsp;i&nbsp;&lt;&nbsp;list.Length;&nbsp;i++)<br>&nbsp;4 &nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;5 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(list[i]);<br>&nbsp;6 &nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;7 }<br>&nbsp;8<br>&nbsp;9 public static void&nbsp;Main()<br>10 {<br>11 &nbsp;&nbsp;&nbsp;&nbsp;UseParams（1,2,3）;<br>12 int[]&nbsp;myArray&nbsp;= new int[3]&nbsp;{&nbsp;10,11,12&nbsp;};<br>13 &nbsp;&nbsp;&nbsp;&nbsp;UseParams(myArray);<br>14 }  <p>&nbsp;&nbsp;&nbsp; ref、out&nbsp; 使方法可以引用传递到该方法的那一个变量，当程序转至调用方法时，在方法中对参数所做的任何改动都将传给该变量。<br>&nbsp;&nbsp;&nbsp; ref参数的值将被传递到ref参数，故必须首先初始化；而out参数不然，它的值不会被传递到该out参数，故不必首先初始化，但它必须在方法返回以前为out参数赋值。<br>&nbsp;&nbsp;&nbsp; 属性不是变量，不能作为ref/out参数。</p><img src ="http://www.cppblog.com/adaiye/aggbug/32568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/adaiye/" target="_blank">adaiye</a> 2007-09-20 17:12 <a href="http://www.cppblog.com/adaiye/archive/2007/09/20/32568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《.NET设计规范》&amp;mdash;&amp;mdash;学习笔记（2.5）框架设计基础</title><link>http://www.cppblog.com/adaiye/archive/2007/09/07/31766.html</link><dc:creator>adaiye</dc:creator><author>adaiye</author><pubDate>Fri, 07 Sep 2007 09:06:00 GMT</pubDate><guid>http://www.cppblog.com/adaiye/archive/2007/09/07/31766.html</guid><wfw:comment>http://www.cppblog.com/adaiye/comments/31766.html</wfw:comment><comments>http://www.cppblog.com/adaiye/archive/2007/09/07/31766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/adaiye/comments/commentRss/31766.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/adaiye/services/trackbacks/31766.html</trackback:ping><description><![CDATA[<p>这篇文章在一定程度上是对前面几篇文章的一个总结。</p> <p>一个成功的通用框架必须是为广大具有不同的需求、技能和背景的开发人员而设计的。框架设计师面临的最大挑战是为这些多样化的用户群提供即简单又功能强大的框架。</p> <ul> <li>要设计即功能强大又易于使用的框架。<br>80/20原则。 要把精力集中在框架中使用最为频繁的部分（20%）  <li>要明确地为具有不同编程风格、需求、技能以及使用不同编程语言的开发人员设计框架。  <li>要了解哪些使用多语言框架的广大开发人员。<br>我们往往会只为自己设计API，而没有清楚地考虑用户的真正需求。</li></ul> <p>渐进框架</p> <blockquote> <p>针对不同的使用场景，为不同的开发团体提供不同的产品，这种多框架的方法在某种程度上说是成功的，比如MS有Visual Basic程序库，有Win32程序库，也有MFC和ATL，但它也存在严重的缺点：多框架使得使用某个框架的开发人员难以将他们的知识转移到下一个技能等级或使用场景（这通常需要另一个框架）。</p> <ul> <li>.NET框架所做的是把VB、MFC、ATL、ASP等这些模型统一起来。无论开发人员使用何种编程语言或者选择何种编程模型，可供使用的API始终都是一致的。<br>一个更好的方法是提供渐进框架（Progresive framework）。&nbsp; 从无到有，慢慢积累知识，并应用到以后更高级的使用场景中去。  <li>.NET框架就是一个渐进框架。<br>渐进框架的目标是覆盖广大的开发人员，但并不是所有可能的开发人员。<br>这也应了没有十全十美这句话：不可能满足每一个开发人员的需求。</li></ul></blockquote> <p>框架设计的基本原则：</p> <blockquote> <p>对用户而言，真正的开发效率来自能够轻易地创造非凡的产品，而并非来自能够轻易地创造垃圾。</p></blockquote> <ol> <li><a href="http://www.blogjava.net/adaiye/archive/2007/08/29/141014.html" target="_blank">场景驱动设计原则</a>  <li><a href="http://www.blogjava.net/adaiye/archive/2007/09/03/142204.html" target="_blank">低门栏原则</a>  <li><a href="http://www.blogjava.net/adaiye/archive/2007/09/05/142869.html" target="_blank">自说明对象原则</a>  <li><a href="http://www.blogjava.net/adaiye/archive/2007/09/05/142941.html" target="_blank">分层架构原则</a></li></ol><img src ="http://www.cppblog.com/adaiye/aggbug/31766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/adaiye/" target="_blank">adaiye</a> 2007-09-07 17:06 <a href="http://www.cppblog.com/adaiye/archive/2007/09/07/31766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《.NET设计规范》&amp;mdash;&amp;mdash;学习笔记（2.4）分层架构原则</title><link>http://www.cppblog.com/adaiye/archive/2007/09/05/31631.html</link><dc:creator>adaiye</dc:creator><author>adaiye</author><pubDate>Wed, 05 Sep 2007 08:54:00 GMT</pubDate><guid>http://www.cppblog.com/adaiye/archive/2007/09/05/31631.html</guid><wfw:comment>http://www.cppblog.com/adaiye/comments/31631.html</wfw:comment><comments>http://www.cppblog.com/adaiye/archive/2007/09/05/31631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/adaiye/comments/commentRss/31631.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/adaiye/services/trackbacks/31631.html</trackback:ping><description><![CDATA[<p>分层设计使得在单个框架中同时提供强大的功能和易用性成为可能。</p>
<ul>
    <li>考虑对框架进行分层，使高层API能提供最佳的开发效率，低层API能提供最强大的功能和最丰富的表现力。<br>通俗地讲，象我这样的菜鸟只能用高层API，太低层都不懂，而牛人们都是想用也更愿意用低层API的强大功能的（个人意见）。ps：这边的高层跟低层不是指高深的意思。而是从易用性方面考虑的！  </li>
    <li>避免把低层API和高层API混在同一名字空间中，如果低层API非常复杂的话（即包含了许多类型）。  </li>
    <li>要确保单个特性域中不同的层能很好的集成在一起。</li>
</ul><img src ="http://www.cppblog.com/adaiye/aggbug/31631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/adaiye/" target="_blank">adaiye</a> 2007-09-05 16:54 <a href="http://www.cppblog.com/adaiye/archive/2007/09/05/31631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ListView 日期,数字,字符排序</title><link>http://www.cppblog.com/adaiye/archive/2007/09/05/31629.html</link><dc:creator>adaiye</dc:creator><author>adaiye</author><pubDate>Wed, 05 Sep 2007 08:36:00 GMT</pubDate><guid>http://www.cppblog.com/adaiye/archive/2007/09/05/31629.html</guid><wfw:comment>http://www.cppblog.com/adaiye/comments/31629.html</wfw:comment><comments>http://www.cppblog.com/adaiye/archive/2007/09/05/31629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/adaiye/comments/commentRss/31629.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/adaiye/services/trackbacks/31629.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ListView 日期,数字,字符排序&nbsp;&nbsp;<a href='http://www.cppblog.com/adaiye/archive/2007/09/05/31629.html'>阅读全文</a><img src ="http://www.cppblog.com/adaiye/aggbug/31629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/adaiye/" target="_blank">adaiye</a> 2007-09-05 16:36 <a href="http://www.cppblog.com/adaiye/archive/2007/09/05/31629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《.NET设计规范》&amp;mdash;&amp;mdash;学习笔记（2.3）自说明对象原则</title><link>http://www.cppblog.com/adaiye/archive/2007/09/05/31613.html</link><dc:creator>adaiye</dc:creator><author>adaiye</author><pubDate>Wed, 05 Sep 2007 05:09:00 GMT</pubDate><guid>http://www.cppblog.com/adaiye/archive/2007/09/05/31613.html</guid><wfw:comment>http://www.cppblog.com/adaiye/comments/31613.html</wfw:comment><comments>http://www.cppblog.com/adaiye/archive/2007/09/05/31613.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/adaiye/comments/commentRss/31613.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/adaiye/services/trackbacks/31613.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在简单的使用场景中，一定要让框架无需文档就能使用。<br><br>    * 要确保API是直观的，无需查阅参考文档就能用于基本场景<br>      你总不希望写个“Hello World”都去查阅API文档吧。<br>    * 要为所有的API提供优秀的文档。<br>      一方面，并非所有的API都能自说明。不同的人会认为不同的API是自说明的；<br>      另一方面，有些人想在开始使用API之前完全理解它们。&nbsp;&nbsp;<a href='http://www.cppblog.com/adaiye/archive/2007/09/05/31613.html'>阅读全文</a><img src ="http://www.cppblog.com/adaiye/aggbug/31613.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/adaiye/" target="_blank">adaiye</a> 2007-09-05 13:09 <a href="http://www.cppblog.com/adaiye/archive/2007/09/05/31613.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《.NET设计规范》&amp;mdash;&amp;mdash;学习笔记（2.2）低门栏原则</title><link>http://www.cppblog.com/adaiye/archive/2007/09/03/31441.html</link><dc:creator>adaiye</dc:creator><author>adaiye</author><pubDate>Mon, 03 Sep 2007 02:01:00 GMT</pubDate><guid>http://www.cppblog.com/adaiye/archive/2007/09/03/31441.html</guid><wfw:comment>http://www.cppblog.com/adaiye/comments/31441.html</wfw:comment><comments>http://www.cppblog.com/adaiye/archive/2007/09/03/31441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/adaiye/comments/commentRss/31441.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/adaiye/services/trackbacks/31441.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 框架必须以易于使用的方式来为普通用户提供一个低门栏。&nbsp;&nbsp;<a href='http://www.cppblog.com/adaiye/archive/2007/09/03/31441.html'>阅读全文</a><img src ="http://www.cppblog.com/adaiye/aggbug/31441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/adaiye/" target="_blank">adaiye</a> 2007-09-03 10:01 <a href="http://www.cppblog.com/adaiye/archive/2007/09/03/31441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>连接数据库和相关数据库操作——之我的方法 利用OLEDB</title><link>http://www.cppblog.com/adaiye/archive/2007/08/31/31284.html</link><dc:creator>adaiye</dc:creator><author>adaiye</author><pubDate>Fri, 31 Aug 2007 04:28:00 GMT</pubDate><guid>http://www.cppblog.com/adaiye/archive/2007/08/31/31284.html</guid><wfw:comment>http://www.cppblog.com/adaiye/comments/31284.html</wfw:comment><comments>http://www.cppblog.com/adaiye/archive/2007/08/31/31284.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/adaiye/comments/commentRss/31284.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/adaiye/services/trackbacks/31284.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 数据库连接和操作！&nbsp;&nbsp;<a href='http://www.cppblog.com/adaiye/archive/2007/08/31/31284.html'>阅读全文</a><img src ="http://www.cppblog.com/adaiye/aggbug/31284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/adaiye/" target="_blank">adaiye</a> 2007-08-31 12:28 <a href="http://www.cppblog.com/adaiye/archive/2007/08/31/31284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《.NET设计规范》——学习笔记（2）框架设计的基本原则</title><link>http://www.cppblog.com/adaiye/archive/2007/08/29/31173.html</link><dc:creator>adaiye</dc:creator><author>adaiye</author><pubDate>Wed, 29 Aug 2007 09:48:00 GMT</pubDate><guid>http://www.cppblog.com/adaiye/archive/2007/08/29/31173.html</guid><wfw:comment>http://www.cppblog.com/adaiye/comments/31173.html</wfw:comment><comments>http://www.cppblog.com/adaiye/archive/2007/08/29/31173.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/adaiye/comments/commentRss/31173.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/adaiye/services/trackbacks/31173.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 对用户而言，真正的开发效率来自能够轻易地创造出非凡的产品，而并非来自能够轻易地创造垃圾。&nbsp;&nbsp;<a href='http://www.cppblog.com/adaiye/archive/2007/08/29/31173.html'>阅读全文</a><img src ="http://www.cppblog.com/adaiye/aggbug/31173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/adaiye/" target="_blank">adaiye</a> 2007-08-29 17:48 <a href="http://www.cppblog.com/adaiye/archive/2007/08/29/31173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《.NET设计规范》&amp;mdash;&amp;mdash;学习笔记（1）</title><link>http://www.cppblog.com/adaiye/archive/2007/08/28/31017.html</link><dc:creator>adaiye</dc:creator><author>adaiye</author><pubDate>Tue, 28 Aug 2007 06:23:00 GMT</pubDate><guid>http://www.cppblog.com/adaiye/archive/2007/08/28/31017.html</guid><wfw:comment>http://www.cppblog.com/adaiye/comments/31017.html</wfw:comment><comments>http://www.cppblog.com/adaiye/archive/2007/08/28/31017.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/adaiye/comments/commentRss/31017.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/adaiye/services/trackbacks/31017.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 如果框架的设计者能够站在使用者背后解释应该如何使用框架，那么就不需要同规范了。&nbsp;&nbsp;<a href='http://www.cppblog.com/adaiye/archive/2007/08/28/31017.html'>阅读全文</a><img src ="http://www.cppblog.com/adaiye/aggbug/31017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/adaiye/" target="_blank">adaiye</a> 2007-08-28 14:23 <a href="http://www.cppblog.com/adaiye/archive/2007/08/28/31017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows编程&amp;mdash;&amp;mdash;Windows编程基础（3）</title><link>http://www.cppblog.com/adaiye/archive/2007/08/15/30077.html</link><dc:creator>adaiye</dc:creator><author>adaiye</author><pubDate>Wed, 15 Aug 2007 06:05:00 GMT</pubDate><guid>http://www.cppblog.com/adaiye/archive/2007/08/15/30077.html</guid><wfw:comment>http://www.cppblog.com/adaiye/comments/30077.html</wfw:comment><comments>http://www.cppblog.com/adaiye/archive/2007/08/15/30077.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/adaiye/comments/commentRss/30077.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/adaiye/services/trackbacks/30077.html</trackback:ping><description><![CDATA[<p>续。。。。。。。。</p><p><script type="text/javascript"><!--google_ad_client = "pub-2823374497557651";google_ad_width = 336;google_ad_height = 280;google_ad_format = "336x280_as";google_ad_type = "text_image";//2007-08-26: youhuagoogle_ad_channel = "1405522066";google_color_border = "FFFFFF";google_color_bg = "FFFFFF";google_color_link = "000000";google_color_text = "000000";google_color_url = "008000";//--></script><script type="text/javascript"&#160; src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script></p>&#160;<p><strong>4. TextBox控件</strong></p>
<p>文本框的主要用途是让用户输入文本，用户可以输入任何字符，也可以限制用户只输入数值。</p>
<p>.NET Framework内置了两个基本控件来提取用户输入的文本：TextBox和RichTextBox。这两个控件都派生于TextBoxBase，而TextBoxBase又派生于Control。</p>
<p>TextBoxBase提供了在文本框中处理文本的基本能力，例如选择文本、剪切和从剪切板上粘帖，以及许多事情。</p>
<p><strong>4.1 TextBox控件的属性</strong></p>
<p>常用属性：</p>
<ul>
    <li>CausesValidation：当控件的这个属性为true，且该控件获得了焦点时，会引发两个事件：Validating和Validated。可以处理这些事件，以便验证失去焦点的控件中数据的有效性。  </li>
    <li>CharacterCasing：这个值表示TextBox是否会改变输入的文本的大小写。可能的值有：</li>
</ul>
<ol>
    <ol>
        <li>Lower：文本框中输入的所有文本都转换为小写；  </li>
        <li>Normal：不变；  </li>
        <li>Upper：都转换为大写。</li>
    </ol>
</ol>
<ul>
    <li>MaxLength：这个值指定输入到TextBox中的文本的最大字符长度。如果设为0，表示最大字符长度仅受限于可用的内存。  </li>
    <li>Multiline：表示该控件是否是一个多行控件。多行控件可以显示多行文本。  </li>
    <li>PasswordChar：指定是否用密码字符替换在单行文本框中输入的字符。如果Multiline属性为true，这个属性就不起作用。  </li>
    <li>ReadOnly：这个Boolean值表示文本是否为只读。  </li>
    <li>ScrollBars：指定多行文本框是否显示滚动条。  </li>
    <li>SelectedText：在文本框中选择的文本。  </li>
    <li>SelectionLength：在文本中选择的字符数。如果这个值设置得比文本中的字符数大，则控件会把它重新设置为字符总数减去SelectionStart的值。  </li>
    <li>SelectionStart：文本框中被选中文本的开头。  </li>
    <li>WordWrap：指定在多行文本框中，如果一行的宽度超出了控件的宽度，其文本是否应自动换行。</li>
</ul>&#160;
<p><strong>4.2 TextBox控件的事件</strong></p>
<p>TextBox提供了以下所示的事件：</p>
<ul>
    <li>Enter、Leave、Validating、Validated：这4个事件按照列出的顺序引发。它们统称为焦点事件，当控件的焦点发生改变时引发，但有两个例外：Validating和Validated仅在控件接收了焦点，且其CausesValidation属性设置为true时引发。接收焦点的控件引发事件的原因是有时即使焦点改变了，我们也不希望验证控件的有效性。  </li>
    <li>KeyDown、KeyPress、KeyUp：这三个事件称为&#8220;键事件&#8221;。它们可以监视和改变输入到控件中的内容。KeyDown和KeyUp接收与所按下键对应的键码，这样就可以确定是否按下了特殊的键Shift或Control和F1。另一方面，KeyPress接收与键对应的字符。这表示字母a的值与A的值不同。  </li>
    <li>Change：只要文本框的文本发生了改变，就会引发该事件。</li>
</ul><img src ="http://www.cppblog.com/adaiye/aggbug/30077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/adaiye/" target="_blank">adaiye</a> 2007-08-15 14:05 <a href="http://www.cppblog.com/adaiye/archive/2007/08/15/30077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows编程&amp;mdash;&amp;mdash;Windows编程基础（2）</title><link>http://www.cppblog.com/adaiye/archive/2007/08/13/29890.html</link><dc:creator>adaiye</dc:creator><author>adaiye</author><pubDate>Mon, 13 Aug 2007 02:31:00 GMT</pubDate><guid>http://www.cppblog.com/adaiye/archive/2007/08/13/29890.html</guid><wfw:comment>http://www.cppblog.com/adaiye/comments/29890.html</wfw:comment><comments>http://www.cppblog.com/adaiye/archive/2007/08/13/29890.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/adaiye/comments/commentRss/29890.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/adaiye/services/trackbacks/29890.html</trackback:ping><description><![CDATA[<p>续：</p>
<p><strong>2. Button控件</strong></p>
<p>按钮主要用于执行3类任务：</p>
<ul>
    <li>用某种状态关闭对话框（如OK和Cancel按钮）。</li>
    <li>给对话框上输入的数据执行操作（如，输入一些搜索条件后，单击Search）。</li>
    <li>打开另一个对话框或应用程序（如Help按钮）。</li>
</ul>
<p><strong>2.1 Button控件的属性：</strong></p>
<p>Buttom类最常用的属性，它们都是在ButtonBase基类中定义的。</p>
<ul>
    <li>FlatStyle：改变按钮的样式。</li>
    <li>Enabled：把Enabled设置为false，则该按钮就会灰显，单击它，不会起任何作用。此属性派生于Control。</li>
    <li>Image：可以指定一个在按钮上显示的图像（位图、图标等）。</li>
    <li>ImageAlign：按钮上图像的显示位置。</li>
</ul>
<p><strong>2.2 Button控件的事件：</strong></p>
<p>private void button1_Click(object sender, EventArgs e)</p>
<p>{...}</p>
<p>对于Click事件，第一个参数Object sender包含被单击的控件。另一个参数EventArgs e包含所发生事件的信息。</p>
<p><strong>3. Label和LinkLabel控件</strong></p>
<p>Label控件（标签）是一个简单的控件，其用途只有一个：在窗体上显示文本。</p>
<p>.NET Framework包含两个标签控件，它们可以用两种截然不同的方式显示：</p>
<ul>
    <li>Label是标准的Windows标签。</li>
    <li>LinkLabel以Internet链接的方式显示（超链接）。</li>
</ul>
<p>尽管Label通常不需要添加任何事件处理代码，但它也支持事件。</p>
<p>Label控件常用的属性：</p>
<ul>
    <li>BorderStyle：指定标签边框的样式。默认为无边框。</li>
    <li>FlatStyle：控制显示控件的方式。</li>
    <li>Image：指定要在标签上显示的图像（位图、图标等）。</li>
    <li>ImageAlign：图像显示在标签的什么位置。</li>
    <li>LinkArea：（只用于LinkLabel）文本中显示为链接的部分。</li>
    <li>LinkColor：（只用于LinkLabel）链接的颜色。</li>
    <li>Links：（只用于LinkLabel）LinkLabel可以包含多个链接。利用这个属性可以查找需要的链接。控件会跟踪显示文本中的链接，不能在设计期间使用。</li>
    <li>LinkVisited：（只用于LinkLabel）把它设置为true，单击控件，链接就会显示为另一种颜色。</li>
    <li>TextAlign：文本显示在控件中的什么位置</li>
    <li>VisitedLinkColor：（只用于LinkLabel）用户单击LinkLabel后控件的颜色</li>
</ul><img src ="http://www.cppblog.com/adaiye/aggbug/29890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/adaiye/" target="_blank">adaiye</a> 2007-08-13 10:31 <a href="http://www.cppblog.com/adaiye/archive/2007/08/13/29890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows编程&amp;mdash;&amp;mdash;Windows编程基础（1）</title><link>http://www.cppblog.com/adaiye/archive/2007/08/12/29830.html</link><dc:creator>adaiye</dc:creator><author>adaiye</author><pubDate>Sun, 12 Aug 2007 08:11:00 GMT</pubDate><guid>http://www.cppblog.com/adaiye/archive/2007/08/12/29830.html</guid><wfw:comment>http://www.cppblog.com/adaiye/comments/29830.html</wfw:comment><comments>http://www.cppblog.com/adaiye/archive/2007/08/12/29830.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/adaiye/comments/commentRss/29830.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/adaiye/services/trackbacks/29830.html</trackback:ping><description><![CDATA[<p><strong>1. 控件</strong></p>
<p>在使用Windows窗体时，就是在使用System.Windows.Forms命名空间。</p>
<p>.NET中的大多数控件都派生于System.Windows.Form.Control类。这个类定义了控件的基本功能。还有一些控件称为定制或用户控件，派生于另一个类System.Windows.Forms.UserControl。这个类本身派生于Control类，提供了创建控件所需要的功能。另外，用于设计Web用户界面的控件派生于另一个类System.Web.UI.Control。</p>
<p><img src="mk:@MSITStore:E:\Programming%20Language\DotNet\Wrox.Beginning.Visual.C.Sharp.2005.Nov.2005.eBook-BBL\Wrox.Beginning.Visual.C.Sharp.2005.Nov.2005.chm::/11787/images/fig14_01_0.jpg"></p>
<p><strong>1.1 属性</strong></p>
<p>所有控件都有许多属性，用于处理控件的操作。</p>
<p>下面是Control类最常见的属性：</p>
<p>Anchor：指定当控件的容器的大小发生变化时，该控件如何响应。 </p>
<p>BackColor：背景色 </p>
<p>Bottom：指定控件的底部距离窗口的顶部有多远。这与指定控件的高度不同 </p>
<p>Dock：可以使控件停靠在窗口的边界上</p>
<p>Enabled：把Enable设为true通常表示该控件可以接收用户的输入。把Enable设置为false通常表示不能接收用户的输入 </p>
<p>ForeColor：前景色 </p>
<p>Height：控件从底部到顶部的距离（是控件本身的距离） </p>
<p>Left：控件的左边界到窗口左边界的距离 </p>
<p>Name：控件的名称，这个名称可以在代码中用于引用该控件 </p>
<p>Parent：控件的父控件 </p>
<p>Right：控件的右边界到窗口右边界的距离 </p>
<p>TabIndex：控件在容器中的标签顺序号 </p>
<p>TabStop：指定控件是否可以用Tab键访问 </p>
<p>Tag：这个值通常不由控件本身使用，而是在控件中存储该控件的信息。当通过Windows Form设计器给这个属性赋值时，就只能给它赋一个字符串值 </p>
<p>Top：控件的顶部距离窗口顶部的距离 </p>
<p>Visible：指定控件是否在运行期间可见 </p>
<p>Width：控件的宽度 </p>
<p>另外，.NET的所有内部控件都使用Text属性来设置显示的文本。 </p>
<p><strong>1.2 控件的定位、停靠和对齐</strong> </p>
<p>在Visual Studio 2005中，窗体设计器默认改为使用栅格状的界面，并使用捕捉线来定位控件，使控件整齐地排列在界面上。 </p>
<p>在窗体设计中，Anchor和Dock属性特别有用。 </p>
<p>Anchor属性可以指定如果控件重新设置了大小，就根据控件的边界锁定它，或者其大小不变，当根据窗口的边界来锚定它的位置。 </p>
<p>Dock属性用于指定控件应停放在容器的边框上。如果用户重新设置了窗口的大小，该控件将继续停放在窗口的边框上。 </p>
<p><strong>1.3 事件</strong> </p>
<p>下面所列的是Control类所定义的最常见的事件： </p>
<p>Click：在单击控件时引发。在某些情况下，这个事件也会在用户按下Enter键时引发。 </p>
<p>DoubleClick：在双击控件时引发。处理某些控件上的Click事件，例如Button控件，表示永远不会调用DoubleClick事件。 </p>
<p>DragDrop：在完成拖放操作时引发。换言之，当一个对象被拖到控件上，然后用户释放鼠标按钮后，引发该事件。 </p>
<p>DragEnter：在被拖动的对象进入控件的边界时引发。 </p>
<p>DragLeave：在被拖动的对象移出控件的边界时引发。 </p>
<p>DragOver：在被拖动的对象放在控件上时引发。 </p>
<p>KeyDown：当控件有焦点时，按下一个键时引发该事件，这个事件总是在KeyPress和KeyUp之前发生。 </p>
<p>KeyPress：当控件有焦点时，按下一个键发生该事件，这个事件总是在KeyDown之后、KeyUp之前引发。KeyDown和KeyPress的区别是KeyDown传送被按下的键的键盘码，而KeyPress传送被按下键的char值。 </p>
<p>KeyUp：当控件有焦点时，释放一个键时发生该事件，这个事件总是在KeyDown和KeyPress之后引发。 </p>
<p>GotFocus：在控件接收焦点时引发。不要用这个事件执行控件的有效性验证，而应使用Validating和Validated。 </p>
<p>LostFocus：在控件丢失焦点时引发。不要用这个事件执行控件的有效性验证，而应使用Validating和Validated。 </p>
<p>MouseDown：在鼠标指针指向一个控件，且鼠标按钮被按下时引发。这与Click事件不同，因为在按钮被按下之后，且未被释放之前引发MouseDown。 </p>
<p>MouseMove：在鼠标划过控件时引发。 </p>
<p>MouseUp：在鼠标指针位于控件上，且鼠标按钮被释放时引发。 </p>
<p>Paint：绘制控件时引发。 </p>
<p>Validated：当控件的CausesValidation属性设置为true，且该控件获得焦点时，引发该事件。它在Validating事件之后发生，表示有效性验证已经完成。 </p>
<p>Validating：当控件的CausesValidation属性设置为true，且该控件获得焦点时，引发该事件。需要注意的是，被验证有效性的控件是失去焦点的控件，而不是获得焦点的控件。 </p>
<p>&nbsp; </p>
<p>&nbsp; </p>
<p>待续.................................</p><img src ="http://www.cppblog.com/adaiye/aggbug/29830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/adaiye/" target="_blank">adaiye</a> 2007-08-12 16:11 <a href="http://www.cppblog.com/adaiye/archive/2007/08/12/29830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>