<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_DotNetEden</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/22378/rss</id><updated>2012-02-07T05:44:38Z</updated><author><name>张荣华</name><uri>http://www.cnblogs.com/zhangronghua/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangronghua/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/22378/rss"/><entry><id>http://www.cnblogs.com/zhangronghua/archive/2012/02/07/ReadingNotesForPragmaticVersionControl.html</id><title type="text">Pragmatic Version Control Using Subversion</title><summary type="text">对于能自动生成的文件不要添加到版本控制中，如bin目录，obj目录。svnadmin create /Users/zhangronghua/documents/svntest 可以创建一个Repository.在指定的目录下运行svn import . file:///users/zhangronghua/documents/svntest -m &amp;quot;the first import&amp;quot; 可以将当前目录加入到SVN中。svn co file:///users/zhangronghua/documents/svntest sesame 可以在当前目录下新建一个sesame目录并将</summary><published>2012-02-07T05:43:00Z</published><updated>2012-02-07T05:43:00Z</updated><author><name>张荣华</name><uri>http://www.cnblogs.com/zhangronghua/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangronghua/archive/2012/02/07/ReadingNotesForPragmaticVersionControl.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangronghua/archive/2012/02/07/ReadingNotesForPragmaticVersionControl.html"/><content type="html">&lt;ol&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;对于能自动生成的文件不要添加到版本控制中，如bin目录，obj目录。&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svnadmin create /Users/zhangronghua/documents/svntest &amp;nbsp;可以创建一个Repository.&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;在指定的目录下运行svn import &amp;nbsp;. &amp;nbsp;file:///users/zhangronghua/documents/svntest -m "the first import" 可以将当前目录加入到SVN中。&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn co file:///users/zhangronghua/documents/svntest sesame &amp;nbsp;可以在当前目录下新建一个sesame目录并将repository中的内容checkout(co)到新建的sesame目录中。&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn status filename.txt 可以查看filename.txt文件的状态。&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn diff filename.txt 可以diff文件&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn commit -m "The Commit Note" 可以commit 变化&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn log filename.txt 可以查看日志，svn log --verbose filename.txt可以在查看日志时显示动作（如M,A...)&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn &amp;nbsp;update 可以update当前目录&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn add *** 可以添加内容到svn中&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn支持以下的协议：svn, svn+ssh, http/https&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn propset &amp;nbsp;checked-by "imzrh" filaname.txt 可以添加属性&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn propedit checked-by filename.txt 可以编辑属性&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn proplist filename.txt 可以列举属性名&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn propget checked-by filename.txt 可以得到属性的值&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn propedit svn:ignore directory 可以设置忽略哪些类型的文件。&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn propedit svn:eol-style 可以设置行结束符的样式（native,CRLF(Windows),LF(Mac/Linux),CR(old Mac))&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn copy sourcefile targetfile 可以copy文件&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn move sroucefile targetfile 可以rename文件&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn blame filename.txt 显示文件的第一行是在什么revision生成的，提交人是谁，内容是什么。（line-by-line history)&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn merge -r 27:26 . 可以还原当前目录下所有的文件从27版本到26版本，即抛弃27版本的修改。&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;如果在Tag中checkin了代码，那么tag会自动变为一个branch,不过并不会自动转移到branch目录中。&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn mkdir -m "create branches directory on first branch creating" file:///users/zhangronghua/documents/sesame 在repository中新建一个branches目录。&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn copy &amp;nbsp;-m "create release branch for 1.0 " file:///users/zhangronghua/documents/sesame file:///users/zhangronghua/documents/sesame/branches/re-1.0 会建立一个rh-1.0的branch.&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;svn switch file:///users/zhangronghua/documents/sesame/branches/re-1.0 会将当前目录变为re-1.0的local copy&lt;/li&gt;&#xD;
&lt;li style="font-size: 16px;"&gt;set SVN.EDITOR = sublime2.app 可以设置注释的默认编辑器，不过只在当前Terminal中起作用，要想一直起作用，请新建一个SVN.EDITOR的环境变量。&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;img src="http://www.cnblogs.com/zhangronghua/aggbug/2341393.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangronghua/archive/2012/02/07/ReadingNotesForPragmaticVersionControl.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhangronghua/archive/2012/02/01/ReadingNotesForEffectiveCSharp2nd.html</id><title type="text">Effective C#  2nd</title><summary type="text">ReadingNotesForEffectiveCSharp2nd</summary><published>2012-02-01T01:49:00Z</published><updated>2012-02-01T01:49:00Z</updated><author><name>张荣华</name><uri>http://www.cnblogs.com/zhangronghua/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangronghua/archive/2012/02/01/ReadingNotesForEffectiveCSharp2nd.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangronghua/archive/2012/02/01/ReadingNotesForEffectiveCSharp2nd.html"/><content type="html">&lt;p &gt;&lt;span &gt;1 &lt;/span&gt;&lt;span &gt;尽量用&lt;/span&gt;&lt;span &gt;Property&lt;/span&gt;&lt;span &gt;而不是用&lt;/span&gt;&lt;span &gt;Public Field&lt;/span&gt;&lt;span &gt;，因为&lt;/span&gt;&lt;span &gt;Property&lt;/span&gt;&lt;span &gt;更符合&lt;/span&gt;&lt;span &gt;OO&lt;/span&gt;&lt;span &gt;的封装性，更可控。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;2 &lt;/span&gt;&lt;span &gt;尽量用&lt;/span&gt;&lt;span &gt;ReadOnly&lt;/span&gt;&lt;span &gt;，而不是用&lt;/span&gt;&lt;span &gt;Const&lt;/span&gt;&lt;span &gt;，&lt;/span&gt;&lt;span &gt;ReadOnly&lt;/span&gt;&lt;span &gt;虽说有稍微的性能损失，但更灵活，不会出现发布新版本时必须要求调用者也重新编译的问题。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;3 &lt;/span&gt;&lt;span &gt;尽量用&lt;/span&gt;&lt;span &gt;as/is&lt;/span&gt;&lt;span &gt;来做类型转换而不是用&lt;/span&gt;&lt;span &gt;Cast&lt;/span&gt;&lt;span &gt;的方式，&lt;/span&gt;&lt;span &gt;as/is&lt;/span&gt;&lt;span &gt;可以避免类型转换中产生的运行时异常。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;4 &lt;/span&gt;&lt;span &gt;使用&lt;/span&gt;&lt;span &gt;Condition Attribute&lt;/span&gt;&lt;span &gt;来代替&lt;/span&gt;&lt;span &gt;#if/&lt;/span&gt;&lt;span &gt;＃&lt;/span&gt;&lt;span &gt;endif&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;5 &lt;/span&gt;&lt;span &gt;在创建类时总是重写&lt;/span&gt;&lt;span &gt;ToString()&lt;/span&gt;&lt;span &gt;方法，&lt;/span&gt;&lt;span &gt;Object.ToString()&lt;/span&gt;&lt;span &gt;只返回&lt;/span&gt;&lt;span &gt;TypeName&lt;/span&gt;&lt;span &gt;是不合适。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;6 &lt;/span&gt;&lt;span &gt;理解多个&lt;/span&gt;&lt;span &gt;Equalsy&lt;/span&gt;&lt;span &gt;方法的区别&lt;br /&gt;&lt;/span&gt;&lt;span &gt;Object.ReferenceEquals&lt;/span&gt;&lt;span &gt;比较引用地址相同。&lt;br /&gt;&lt;/span&gt;&lt;span &gt;Object.Equals(object a, object b)&lt;/span&gt;&lt;span &gt;比较两个只有你在运行时才能确定的类型的相等性&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('7c2aa644-a24a-4ae8-abf4-17484f726061')"&gt;&#xD;
&lt;div id="cnblogs_code_open_7c2aa644-a24a-4ae8-abf4-17484f726061" &gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; Equals(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; left, &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; right)&lt;br /&gt;{&lt;br /&gt;       &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;check object identity&lt;/span&gt; &lt;br /&gt;       &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(Object.ReferenceEquals(left, right))&lt;br /&gt;       {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; ture;&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; both null reference handled above&lt;/span&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(Object.ReferenceEquals(left, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) || Object.ReferenceEquals(right, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;))&lt;br /&gt;    {&lt;br /&gt;           &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;　 left.Equals(right);&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p &gt;&lt;span &gt;Equals(object right) &lt;/span&gt;&lt;span &gt;方法&lt;br /&gt;&lt;/span&gt;&lt;span &gt;Object&lt;/span&gt;&lt;span &gt;中类似于&lt;/span&gt;&lt;span &gt;ReferenceEquals&lt;/span&gt;&lt;span &gt;；&lt;br /&gt;在&lt;/span&gt;&lt;span &gt;ValueType&lt;/span&gt;&lt;span &gt;中是利用反射来比较所有的字段，效率比较低。所以在定义&lt;/span&gt;&lt;span &gt;ValueType&lt;/span&gt;&lt;span &gt;时要&lt;/span&gt;&lt;span &gt;Override Equals(object)&lt;/span&gt;&lt;span &gt;方法，&lt;br /&gt;&lt;/span&gt;&lt;span &gt;ReferenceType.Equals(object right&lt;/span&gt;&lt;span &gt;）等同于&lt;/span&gt;&lt;span &gt;ReferenceEquals()&lt;/span&gt;&lt;span &gt;，不过&lt;/span&gt;&lt;span &gt;String DataRow&lt;/span&gt;&lt;span &gt;等做了&lt;/span&gt;&lt;span &gt;Overrite&lt;/span&gt;&lt;span &gt;，比较内容，而不是比较&lt;/span&gt;&lt;span &gt;Reference.&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;operator==()&lt;/span&gt;&lt;span &gt;类似于&lt;/span&gt;&lt;span &gt;Equals(object)&lt;/span&gt;&lt;span &gt;，同样的原因我们要对&lt;/span&gt;&lt;span &gt;ValueType&lt;/span&gt;&lt;span &gt;进行重写。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;综上，&lt;/span&gt;&lt;span &gt;ReferenceEquals&lt;/span&gt;&lt;span &gt;、&lt;/span&gt;&lt;span &gt;Static Equals&lt;/span&gt;&lt;span &gt;永不需重写，&lt;/span&gt;&lt;span &gt;Equals&lt;/span&gt;&lt;span &gt;、&lt;/span&gt;&lt;span &gt;Operator==()&lt;/span&gt;&lt;span &gt;对于&lt;/span&gt;&lt;span &gt;Value Type&lt;/span&gt;&lt;span &gt;需要重写，重写时记得同时重写&lt;/span&gt;&lt;span &gt;GetHashCode&lt;/span&gt;&lt;span &gt;方法&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;7 GetHashCode&lt;/span&gt;&lt;span &gt;（）&lt;br /&gt;&lt;span &gt;ReferenceType&lt;/span&gt;&lt;span &gt;的&lt;/span&gt;&lt;span &gt;GetHashCode&lt;/span&gt;&lt;span &gt;是在构造函数里生成一个整数，来&lt;/span&gt;&lt;span &gt;GetHashCode,&lt;/span&gt;&lt;span &gt;是&lt;/span&gt;&lt;span &gt;working but inefficient,ValueType.GetHashCode&lt;/span&gt;&lt;span &gt;取的第一 &amp;nbsp; &amp;nbsp;个&lt;/span&gt;&lt;span &gt;Member&lt;/span&gt;&lt;span &gt;的&lt;/span&gt;&lt;span &gt;HashCode,&lt;/span&gt;&lt;span &gt;所以只有当&lt;/span&gt;&lt;span &gt;frist member&lt;/span&gt;&lt;span &gt;是&lt;/span&gt;&lt;span &gt;readonly or immutable&lt;/span&gt;&lt;span &gt;时才正确&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;8 &lt;/span&gt;&lt;span &gt;优先使用查询语法（&lt;/span&gt;&lt;span &gt;Query Syntex&lt;/span&gt;&lt;span &gt;）而不是优化使用循环（&lt;/span&gt;&lt;span &gt;Loops),Query Syntex&lt;/span&gt;&lt;span &gt;语义更清楚，更有可读性。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;9 &lt;/span&gt;&lt;span &gt;在&lt;/span&gt;&lt;span &gt;API&lt;/span&gt;&lt;span &gt;中避免给类型增加类型转换功能（&lt;/span&gt;&lt;span &gt;implicit and explicit),&lt;/span&gt;&lt;span &gt;因为类型转换带来的类可置换性可能会引起一些不必要的错误。要想提供类的转换时，使用构造函数。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;10 &lt;/span&gt;&lt;span &gt;利用&lt;/span&gt;&lt;span &gt;Optional Parameter&lt;/span&gt;&lt;span &gt;和&lt;/span&gt;&lt;span &gt;Named Parameter&lt;/span&gt;&lt;span &gt;来减少重载的次数，并增加方法的语义性。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;11 &lt;/span&gt;&lt;span &gt;多重构，多写小方法，而不是写一个大的方法，小方法可读性好，可利用&lt;/span&gt;&lt;span &gt;JIT&lt;/span&gt;&lt;span &gt;来做&lt;/span&gt;&lt;span &gt;Inline Compiler. &lt;/span&gt;&lt;span &gt;关于&lt;/span&gt;&lt;span &gt;InlineCompiler&lt;/span&gt;&lt;span &gt;有一点需要注意就算方法很小，很清晰，但只要方法内有&lt;/span&gt;&lt;span &gt;try/catch&lt;/span&gt;&lt;span &gt;或者方法是&lt;/span&gt;&lt;span &gt;virtual&lt;/span&gt;&lt;span &gt;的就不会被&lt;/span&gt;&lt;span &gt;Inline Compiler.&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;12 &lt;/span&gt;&lt;span &gt;要理解&lt;/span&gt;&lt;span &gt;GC&lt;/span&gt;&lt;span &gt;，&lt;/span&gt;&lt;span &gt;GC&lt;/span&gt;&lt;span &gt;负责&lt;/span&gt;&lt;span &gt;Management Resource&lt;/span&gt;&lt;span &gt;管理，&lt;/span&gt;&lt;span &gt;Unmanagement&lt;/span&gt;&lt;span &gt;的还是需要自己管理。&lt;/span&gt;&lt;span &gt;GC&lt;/span&gt;&lt;span &gt;分&lt;/span&gt;&lt;span &gt;Generation0,1,2.&lt;/span&gt;&lt;span &gt;每次&lt;/span&gt;&lt;span &gt;GC&lt;/span&gt;&lt;span &gt;在单独的进程里清理资源时如果&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;对象没有&lt;/span&gt;&lt;span &gt;Finalizer&lt;/span&gt;&lt;span &gt;方法则直接清理，如果有&lt;/span&gt;&lt;span &gt;Finalizer&lt;/span&gt;&lt;span &gt;则将对象放到下一个&lt;/span&gt;&lt;span &gt;Generation&lt;/span&gt;&lt;span &gt;并在一个单独的进程里运行对象的&lt;/span&gt;&lt;span &gt;Finalizer&lt;/span&gt;&lt;span &gt;。另外每次的&lt;/span&gt;&lt;span &gt;GC&lt;/span&gt;&lt;span &gt;清理时&lt;/span&gt;&lt;span &gt;GC&lt;/span&gt;&lt;span &gt;还压缩&lt;/span&gt;&lt;span &gt;Heap&lt;/span&gt;&lt;span &gt;的空间，以便新分配的对象可以得到连续的空间。&lt;/span&gt;&lt;span &gt;GC&lt;/span&gt;&lt;span &gt;的执行时间是不确定的，&lt;/span&gt;&lt;span &gt;G0&lt;/span&gt;&lt;span &gt;执行最频繁，&lt;/span&gt;&lt;span &gt;G1&lt;/span&gt;&lt;span &gt;次之，&lt;/span&gt;&lt;span &gt;G2&lt;/span&gt;&lt;span &gt;执行最少。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;13 &lt;/span&gt;&lt;span &gt;在声明变量的时候就初始化。&lt;/span&gt;&lt;span &gt;有几种情况需要避免，声明变量的值为&lt;/span&gt;&lt;span &gt;0&lt;/span&gt;&lt;span &gt;或是&lt;/span&gt;&lt;span &gt;null&lt;/span&gt;&lt;span &gt;时，因为&lt;/span&gt;&lt;span &gt;C# CLR&lt;/span&gt;&lt;span &gt;会用&lt;/span&gt;&lt;span &gt;low level&lt;/span&gt;&lt;span &gt;的&lt;/span&gt;&lt;span &gt;cpu&lt;/span&gt;&lt;span &gt;指令来做这些事，会比我们做的更高效；优先使用自动属性，自动属性可读性好，&lt;/span&gt;&lt;span &gt;JIT&lt;/span&gt;&lt;span &gt;编译时效率也更高；需要做异常处理的初始化。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;14 &lt;/span&gt;&lt;span &gt;静态变量的初始化，先在定义时初始化，如果逻辑复杂或是需要异常处理，则定义&lt;/span&gt;&lt;span &gt;static constructor.&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;15 &lt;/span&gt;&lt;span &gt;如果需要多个构造函数，那么声明一个公用带参数的构造函数，然后在其它构造函数里调用公用的构造函数，不要在多个构造函数里重复代码。如果是&lt;/span&gt;&lt;span &gt;.NET4.0&lt;/span&gt;&lt;span &gt;的话，也可以考虑用参数默认值来完成相同的操作。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;16 &lt;/span&gt;&lt;span &gt;利用&lt;/span&gt;&lt;span &gt;using&lt;/span&gt;&lt;span &gt;或是&lt;/span&gt;&lt;span &gt;try/finally&lt;/span&gt;&lt;span &gt;来释放&lt;/span&gt;&lt;span &gt;Unmanaged resource.&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;17 &lt;/span&gt;&lt;span &gt;避免声明不必要的对象，尤其是&lt;/span&gt;&lt;span &gt;heap based object.&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;18 &lt;/span&gt;&lt;span &gt;理解&lt;/span&gt;&lt;span &gt;Dispose&lt;/span&gt;&lt;span &gt;和&lt;/span&gt;&lt;span &gt;Finalizer&lt;/span&gt;&lt;span &gt;的区别，前者由调用方直接显示调用，负责释放&lt;/span&gt;&lt;span &gt;Managed&amp;amp;Unmanaged Resource,&lt;/span&gt;&lt;span &gt;后者由&lt;/span&gt;&lt;span &gt;GC&lt;/span&gt;&lt;span &gt;自动调用，只负责释放&lt;/span&gt;&lt;span &gt;Unmanaged Resource.&lt;/span&gt;&lt;span &gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('89a5eec6-d193-462b-b1b7-a8e3417e02ee')"&gt;&#xD;
&lt;div id="cnblogs_code_open_89a5eec6-d193-462b-b1b7-a8e3417e02ee" &gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Foo: IDisposable&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; disposed = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Dispose()&lt;br /&gt;    {&lt;br /&gt;        dispose(&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;);&lt;br /&gt;        GC.SuppressFinalize(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    protecte &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; dispose(&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; disposing)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!disposed)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(displosing)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; elided. to release Managed resource.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            }&lt;br /&gt;    &lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; elided. to release Unmanaged resource.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;br /&gt;            disposed = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    ~Foo()&lt;br /&gt;    {&lt;br /&gt;        dispose(&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p &gt;&lt;span &gt;19 &lt;/span&gt;&lt;span &gt;理解&lt;/span&gt;&lt;span &gt;Value Type and Reference Type&lt;/span&gt;&lt;span &gt;的区别，&lt;/span&gt;&lt;span &gt;Value Type&lt;/span&gt;&lt;span &gt;用来定义数据，尽量不包括行为，&lt;/span&gt;&lt;span &gt;Value Type&lt;/span&gt;&lt;span &gt;并不老是分配在&lt;/span&gt;&lt;span &gt;Stack&lt;/span&gt;&lt;span &gt;上，例如类的&lt;/span&gt;&lt;span &gt;Field&lt;/span&gt;&lt;span &gt;就是跟着类分配在&lt;/span&gt;&lt;span &gt;Heap&lt;/span&gt;&lt;span &gt;上&lt;/span&gt;&lt;span &gt;; Reference Typee&lt;/span&gt;&lt;span &gt;用来定义数据，可以包括行为，总是在&lt;/span&gt;&lt;span &gt;Stack&lt;/span&gt;&lt;span &gt;上分配一个引用，然后在&lt;/span&gt;&lt;span &gt;Heap&lt;/span&gt;&lt;span &gt;上分配具体的内容。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;20 &lt;/span&gt;&lt;span &gt;在创建&lt;/span&gt;&lt;span &gt;Value Type&lt;/span&gt;&lt;span &gt;时确保&lt;/span&gt;&lt;span &gt;0&lt;/span&gt;&lt;span &gt;是有效的值，比如在创建&lt;/span&gt;&lt;span &gt;enum&lt;/span&gt;&lt;span &gt;时，第一个值总是&lt;/span&gt;&lt;span &gt;0&lt;/span&gt;&lt;span &gt;，要不可能会引用运行时的异常或者使用不方便，因为默认的构造函数是将&lt;/span&gt;&lt;span &gt;enum&lt;/span&gt;&lt;span &gt;的实例赋值为&lt;/span&gt;&lt;span &gt;0&lt;/span&gt;&lt;span &gt;。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;21 Prefer immutable atomic data types.&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;22 &lt;/span&gt;&lt;span &gt;总是暴露最少的成员，给成员以最小的可见性，比如能&lt;/span&gt;&lt;span &gt;internal&lt;/span&gt;&lt;span &gt;的尽量不要&lt;/span&gt;&lt;span &gt;public.&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;23 &lt;/span&gt;&lt;span &gt;优先使用&lt;/span&gt;&lt;span &gt; interface &lt;/span&gt;&lt;span &gt;而不是用&lt;/span&gt;&lt;span &gt; virtual class.&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;24 &lt;/span&gt;&lt;span &gt;要理解&lt;/span&gt;&lt;span &gt;virtual/abstruct/interface&lt;/span&gt;&lt;span &gt;的区别。&lt;/span&gt;&lt;span &gt; interface&lt;/span&gt;&lt;span &gt;定义一组协议，可以被一组类显式或是隐式实现，&lt;/span&gt;&lt;span &gt;interface&lt;/span&gt;&lt;span &gt;的成员全是&lt;/span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span &gt;的，并且无构造函数。&lt;/span&gt;&lt;span &gt;abstruct&lt;/span&gt;&lt;span &gt;实现了子类必须要实现的功能，必须在抽象类中定义，抽象类不能实例化。&lt;/span&gt;&lt;span &gt;virtual&lt;/span&gt;&lt;span &gt;定义子类的功能，可以提供实现，子类可以&lt;/span&gt;&lt;span &gt;override&lt;/span&gt;&lt;span &gt;也可以不&lt;/span&gt;&lt;span &gt;override. &lt;/span&gt;&lt;span &gt;感觉&lt;/span&gt;&lt;span &gt;interface&lt;/span&gt;&lt;span &gt;是面向一组类的，&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;这组类可以不在一个继承链上，&lt;/span&gt;&lt;span &gt;virtual/abstruct&lt;/span&gt;&lt;span &gt;都是&lt;/span&gt;&lt;span &gt;baseclass&lt;/span&gt;&lt;span &gt;对&lt;/span&gt;&lt;span &gt;DerivedClass&lt;/span&gt;&lt;span &gt;的要求。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;25 &lt;/span&gt;&lt;span &gt;了解&lt;/span&gt;&lt;span &gt;delegate/event&lt;/span&gt;&lt;span &gt;的作用及区别，&lt;/span&gt;&lt;span &gt;event&lt;/span&gt;&lt;span &gt;是一个特殊的&lt;/span&gt;&lt;span &gt;delegate&lt;/span&gt;&lt;span &gt;，比&lt;/span&gt;&lt;span &gt;delegate&lt;/span&gt;&lt;span &gt;多了限制，当你声明一个&lt;/span&gt;&lt;span &gt;Public event&lt;/span&gt;&lt;span &gt;时&lt;/span&gt;&lt;span &gt;CLR&lt;/span&gt;&lt;span &gt;会类似于对待自动属性一样给&lt;/span&gt;&lt;span &gt;event&lt;/span&gt;&lt;span &gt;添加&lt;/span&gt;&lt;span &gt;add/remove&lt;/span&gt;&lt;span &gt;方法，除了这两个方法不能再对&lt;/span&gt;&lt;span &gt;event&lt;/span&gt;&lt;span &gt;所代表的&lt;/span&gt;&lt;span &gt;delegate&lt;/span&gt;&lt;span &gt;做更多的操作，为的是防止调用类破坏&lt;/span&gt;&lt;span &gt;event&lt;/span&gt;&lt;span &gt;的&lt;/span&gt;&lt;span &gt;multicast chain.&lt;/span&gt;&lt;span &gt;所以&lt;/span&gt;&lt;span &gt;event&lt;/span&gt;&lt;span &gt;一般用在观察者模式类似的场景上，&lt;/span&gt;&lt;span &gt;delegate&lt;/span&gt;&lt;span &gt;的应用场景要广。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;26 &lt;/span&gt;&lt;span &gt;对&lt;/span&gt;&lt;span &gt;Interal Class Objects&lt;/span&gt;&lt;span &gt;要避免返回引用类型的参数&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;27 &lt;/span&gt;&lt;span &gt;尽量使自定义的类型为可序列化的。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;28 &lt;/span&gt;&lt;span &gt;在进行&lt;/span&gt;&lt;span &gt;Server/Client&lt;/span&gt;&lt;span &gt;的通信时要精心设计&lt;/span&gt;&lt;span &gt;API&lt;/span&gt;&lt;span &gt;，减少通信的次数以及每次通信传输的数据集大小。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;29 Covariant(&lt;/span&gt;&lt;span &gt;协变&lt;/span&gt;&lt;span &gt;) Contravariant(&lt;/span&gt;&lt;span &gt;逆变&lt;/span&gt;&lt;span &gt;)&lt;/span&gt;&lt;span &gt;是为了弥补在&lt;/span&gt;&lt;span &gt;4.0&lt;/span&gt;&lt;span &gt;之前的范型是&lt;/span&gt;&lt;span &gt;invariant&lt;/span&gt;&lt;span &gt;的缺点而在&lt;/span&gt;&lt;span &gt;4.0&lt;/span&gt;&lt;span &gt;引入的。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;如果一个可变性和子类到父类转换的方向一样，就称作协变；而如果和子类到父类的转换方向相反，就叫反变性。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;用&lt;/span&gt;&lt;span &gt;Out&lt;/span&gt;&lt;span &gt;来描述仅能作为返回值的类型参数，用&lt;/span&gt;&lt;span &gt;In&lt;/span&gt;&lt;span &gt;来描述仅能作为方法参数的类型参数。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;由子类向父类方向转变是协变&lt;/span&gt;&lt;span &gt;协变用于返回值类型用&lt;/span&gt;&lt;span &gt;out&lt;/span&gt;&lt;span &gt;关键字&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;由父类向子类方向转变是逆变&lt;/span&gt;&lt;span &gt;逆变用于方法的参数类型用&lt;/span&gt;&lt;span &gt;in&lt;/span&gt;&lt;span &gt;关键字&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;30 &lt;/span&gt;&lt;span &gt;在给类添加事件时，优先使用重与的方法，而不是优先使用&lt;/span&gt;&lt;span &gt;+=&lt;/span&gt;&lt;span &gt;的方法。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;protected override void OnMouseDown(MouseButtonEventArgs e)//&lt;/span&gt;&lt;span &gt;优先使用&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;this.MouseDown += OnMouseDown //&lt;/span&gt;&lt;span &gt;优先级低。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;重写的方式更高效，也更清晰一些，不过声明式的书写因为可以在前台文件（如&lt;/span&gt;&lt;span &gt;aspx,xmal&lt;/span&gt;&lt;span &gt;）中书写，所以方便分工合作时&lt;/span&gt;&lt;span &gt;desinger&lt;/span&gt;&lt;span &gt;来书写。并且因为可以在运行时改变也更灵活一些。所以我个人还是喜欢声明式的方法多些。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;31 &lt;/span&gt;&lt;span &gt;当类型有可能会被排序时，让类型同进继承&lt;/span&gt;&lt;span &gt;IComparable&lt;/span&gt;&lt;span &gt;和&lt;/span&gt;&lt;span &gt;IComparable&amp;lt;T&amp;gt;&lt;/span&gt;&lt;span &gt;接口，实现&lt;/span&gt;&lt;span &gt;IComparable&lt;/span&gt;&lt;span &gt;是为了兼容以前的代码，&lt;/span&gt;&lt;span &gt;IComparable&lt;/span&gt;&lt;span &gt;的方法需要用到&lt;/span&gt;&lt;span &gt;unbox&lt;/span&gt;&lt;span &gt;和&lt;/span&gt;&lt;span &gt;box&lt;/span&gt;&lt;span &gt;所以效率不高。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;32 Once a type supports ICloneable, all it's derived types must do the same. all it's member tpes must also support ICloneable or have some other mechanism to create a copy.&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;所以实现&lt;/span&gt;&lt;span &gt;ICloneable&lt;/span&gt;&lt;span &gt;接口很麻烦，如非必要，尽量不要实现它。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;shallow copy &amp;amp; deep copy. &lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;33 new&lt;/span&gt;&lt;span &gt;关键字可以隐藏父类的方法，可以并不代表我们需要，一般来说&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span &gt;只适用用你的代码已经分发出去有很多的调用方，并且你对调用方的代码没有修改权限，这时在未来的某个时候你的代码的基类新增了一个和你同名的方法，&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;这时可以考虑用&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span &gt;隐藏掉基类新增加的谅地，不过还是尽量避免使用&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span &gt;关键字吧，因为同一个方法名实际上却是两个不同的方法，太容易让人引起歧义了。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;34 &lt;/span&gt;&lt;span &gt;尽量避免&lt;/span&gt;&lt;span &gt;Overload&lt;/span&gt;&lt;span &gt;在父类中定义的方法，否则可能会引起难发现的&lt;/span&gt;&lt;span &gt;bug.&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;35 &lt;/span&gt;&lt;span &gt;了解&lt;/span&gt;&lt;span &gt;PLinq&lt;/span&gt;&lt;span &gt;相关的知识&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;partition&lt;/span&gt;&lt;span &gt;分为四种算法：&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;Range partitioning &lt;/span&gt;&lt;span &gt;最简单，&lt;/span&gt;&lt;span &gt;item&lt;/span&gt;&lt;span &gt;平均分配到每个&lt;/span&gt;&lt;span &gt;cpu&lt;/span&gt;&lt;span &gt;资源&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;Chunk partitioning &lt;/span&gt;&lt;span &gt;在任何可能的时间给请求的资源更多的&lt;/span&gt;&lt;span &gt;item.&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;Strip partitioning Range&lt;/span&gt;&lt;span &gt;的变得，可以按&lt;/span&gt;&lt;span &gt;1&lt;/span&gt;&lt;span &gt;，&lt;/span&gt;&lt;span &gt;3&lt;/span&gt;&lt;span &gt;，&lt;/span&gt;&lt;span &gt;5&lt;/span&gt;&lt;span &gt;；&lt;/span&gt;&lt;span &gt; 2&lt;/span&gt;&lt;span &gt;，&lt;/span&gt;&lt;span &gt;4&lt;/span&gt;&lt;span &gt;，&lt;/span&gt;&lt;span &gt;6&lt;/span&gt;&lt;span &gt;这样的方式给两个&lt;/span&gt;&lt;span &gt;cpu&lt;/span&gt;&lt;span &gt;分配&lt;/span&gt;&lt;span &gt;item.&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;Hash partitioning &lt;/span&gt;&lt;span &gt;为有&lt;/span&gt;&lt;span &gt;join, groupjoin,groupby&lt;/span&gt;&lt;span &gt;，&lt;/span&gt;&lt;span &gt;distinct,except&lt;/span&gt;&lt;span &gt;，&lt;/span&gt;&lt;span &gt;inion&lt;/span&gt;&lt;span &gt;操作的表达式准备的，&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;执行时有三种算法：&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;Pipelining &lt;/span&gt;&lt;span &gt;各个&lt;/span&gt;&lt;span &gt;cpu&lt;/span&gt;&lt;span &gt;顺序执行&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;Stop&amp;amp;Go &lt;/span&gt;&lt;span &gt;当对表达式执行&lt;/span&gt;&lt;span &gt;ToList/ToArray&lt;/span&gt;&lt;span &gt;时会用这种方式&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;Inverted Enumeration &lt;/span&gt;&lt;span &gt;添加一些操作在每个项的结果上。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;var nums = from n in Enumerable.Range&lt;/span&gt;&lt;span &gt;（&lt;/span&gt;&lt;span &gt;1&lt;/span&gt;&lt;span &gt;，&lt;/span&gt;&lt;span &gt;1000).AsParallel&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;select n&lt;/span&gt;&lt;span &gt;＊&lt;/span&gt;&lt;span &gt;n;&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;nums.ForAll(item =&amp;gt; Console.WriteLine(item))&lt;br /&gt;&lt;/span&gt;&lt;span &gt;Linq2Objects&lt;/span&gt;&lt;span &gt;是只编译，当要用到每一项时才长每一项，&lt;/span&gt;&lt;span &gt;PLinq&lt;/span&gt;&lt;span &gt;和&lt;/span&gt;&lt;span &gt;Linq2Sql&lt;/span&gt;&lt;span &gt;一样执行第一个时顺带把全部的结果一块执行出来。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;PLinq&lt;/span&gt;&lt;span &gt;还是适合项可以并行执行，对顺序没有要求的集合。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;36 Dynamic can be thought of as "System.Object with runtime binding"&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;left the safety of the type system behind&lt;/span&gt;&lt;span &gt;，&lt;/span&gt;&lt;span &gt;所有的错误只能在运行时发现。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;Dynamic&lt;/span&gt;&lt;span &gt;应该只用在我们在编译时不知道类型信息的下，如果我们在运行时知道类型信息，那么完全可以用范型搭配&lt;/span&gt;&lt;span &gt;Lambda&lt;/span&gt;&lt;span &gt;表达式来完成。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;37 Select().Cast() cannot access any user-defined conversions on the runtime type of its argument. &lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;the only conversions it can make are reference conversions and boxing conversions.&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;Cast&amp;lt;T&amp;gt; cannot access any user-defined conversions because it can only assume that T contains the members&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;defined in System.Object. System.Object does not contain any user-defined conversions.&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;所以当要&lt;/span&gt;&lt;span &gt;Cast&lt;/span&gt;&lt;span &gt;的类型有自定义的类型转换时，我们应该用&lt;/span&gt;&lt;span &gt;.NET4&lt;/span&gt;&lt;span &gt;中新增的&lt;/span&gt;&lt;span &gt;Convert&amp;lt;T&amp;gt;&lt;/span&gt;&lt;span &gt;方法，这个方法的内部实现中调用了类型转换，&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;所以可以调用类型自定义的类型转换，不会出现运行时的异常。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;38 one of the shortcoming of anonymous types has been that you cannot easily write method &lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;using them as parameters or return types.&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;但是如果你的方法换成&lt;/span&gt;&lt;span &gt;dynamic&lt;/span&gt;&lt;span &gt;的参数或是返回值的话就没有这个限制了。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;39 &lt;/span&gt;&lt;span &gt;尽量多用范型来避免产生&lt;/span&gt;&lt;span &gt;box and unbox&lt;/span&gt;&lt;span &gt;操作。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;40 &lt;/span&gt;&lt;span &gt;尽量要求最少的权限，对于一些&lt;/span&gt;&lt;span &gt;unmanaged resources&lt;/span&gt;&lt;span &gt;如果不是必需，则不申请，否则当程序集通过&lt;/span&gt;&lt;span &gt;internet&lt;/span&gt;&lt;span &gt;分发时会遇到一些在开发时遇不到的&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;权限问题。&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;41 Perfer CLS(Common Language Subsystem)-Compliant Assemblies.&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;[assembly: System.CLSComplianta(true)]&lt;/span&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span &gt;42 Prefer Smaller, Cohensive Assemblies.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhangronghua/aggbug/2334152.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangronghua/archive/2012/02/01/ReadingNotesForEffectiveCSharp2nd.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhangronghua/archive/2012/01/07/AppsForMac.html</id><title type="text">Mac平台个人常用软件推荐</title><summary type="text">今年五月份刚从卓越上买的MBP(型号：MC700，价钱8千左右），用了将近半年了，觉得很爽，不一样的系统带来不一样的使用体验，带来不一样的感受，这篇文章是Windows平台个人常用软件推荐的姊妹篇，总结一下个人觉得比较好用的Mac平台常用软件，下面的软件大部分是免费软件，有一部分是限免时收的，剩下的1Password、MarsEdit、TextExpander我可耻的使用了盗版。</summary><published>2012-01-07T04:40:00Z</published><updated>2012-01-07T04:40:00Z</updated><author><name>张荣华</name><uri>http://www.cnblogs.com/zhangronghua/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangronghua/archive/2012/01/07/AppsForMac.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangronghua/archive/2012/01/07/AppsForMac.html"/><content type="html">&lt;p style="font-size: 15px;"&gt;今年五月份刚从卓越上买的MBP(型号：MC700，价钱8千左右），用了将近半年了，觉得很爽，不一样的系统带来不一样的使用体验，带来不一样的感受，这篇文章是&lt;a href="http://www.cnblogs.com/zhangronghua/archive/2008/09/17/Utilitiys.html"&gt;Windows平台个人常用软件推荐&lt;/a&gt;的姊妹篇，总结一下个人觉得比较好用的Mac平台常用软件，下面的软件大部分是免费软件，有一部分是限免时收的，剩下的1Password、MarsEdit、TextExpander我可耻的使用了盗版。&lt;/p&gt;&#xD;
&lt;div style="background-color: transparent;"&gt;&lt;ol&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh3.googleusercontent.com/6FWtvWbJX8Jm_PA8Y_IlKhMj9bmcvU7lNpfSTJZRL4LgtWObzz2v-vEXxHFIig0sgmSqcevn3ych1PclLZQZiLSRVXmQZFIsh16ValWbXBrGH0rZmL8" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;1Password &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;3.8.12 //密码管理，在时常爆库的今天太有必要了。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh4.googleusercontent.com/ayTQCpiwJp3PF74ONQl8MASaRL3q6RoWZaD6UNCjqV_KTd71O_YZFaCdFB3k86DIrwpvuwbuJRkxxD-FGaqSBYydQyPd4_DT5D-T6tVno4UMwaoisUI" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Adium &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;1.4.4 //IM集成，用来登录Gtalk, MSN, Yahoo Messager。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh5.googleusercontent.com/t-K57Vv_iCyAisMYEKaWw8kT1TTIC9BcUdYYUrUjheeYDq9b1BPHEHTouV3Pe1pDtqzUOJGF9dbW0mZxRmtdjczQ03sTlORr7pt_UyNxLbMHAjmhRrQ" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Alfred &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;1.0 // 快速启动， 巨好用。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;div style="background-color: transparent;"&gt;&lt;strong id="internal-source-marker_0.42050701077096164" style="font-weight: normal;"&gt;&lt;img src="https://lh5.googleusercontent.com/6UT1tCV1nV04YwAaaeCpC6MfK3ECgP6ExBAe4XZNGb4e_tygpkVTG9EQdabmfHjUPsChRteybo0p8Wj9E7o8afIJ4y33NZkursE23J3-8M7P9Xs3Arw" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;AliWangwang &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;1.0.80&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh4.googleusercontent.com/FnAD3TV2nV_Z_mNjoInOQqzU4Zn7MRVz3LJcSRt2NaZL48aw0nsnuzOkOvrjXNGQpl00UqRo-L_DCqMvYTiiZcbQ5cS9sHIwjW1YhO5eLOPT-qXXdXQ" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;AppCleaner &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;2.0.5 // 删除程序专用。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh5.googleusercontent.com/AmGfky56zQd7VAZ2kBXmN-ixTvs7vdF5TUZqI469b4aZDfL2tKiXyHgn30XPVQY_VCalK5qNUSezA1Qr5q-Gn4piXAHLfmke-uXZdLISq1UfZ0R-wZI" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;AppFresh &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;0.9 //查询并更新应用程序。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh4.googleusercontent.com/16MWc_B8Zn9HjUkRYvbFfpXxywTS2OTpDXs2As4lLQnmnfqkSdDM0kQX1OvbsEFaOhBm5ALIvqxqsAC0z398R8pDTqgg6eDCEGuk3NOLF4Ap_vtmo1E" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Blackmagic Disk Speed Test &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;2.1 //测磁盘速度。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh5.googleusercontent.com/D6f6wpHJLEtF0jRI0d5mnuTiXrrI6pk9LzVmOpE920F_13FBtT8VGiDluQJJv8iiN2awkLwN_m5VYSz6HaQ-rPJDWkopayMMPQxMBSnRxE_q7ZZjzWc" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;CCleaner &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;1.0.0.77 //系统清理。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh5.googleusercontent.com/RZvgo9iribwuH2P4ppfC8KtkX-OlTdl1EsF4NJ80SfFv3TjNdmmkC0LlxlqoGhjqoVpNGmIvMgAxdfu9D0tjYjCj-OZBqotrR97E0OU-EMh5ZsANHJA" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;CHM View &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;2.1 // 查看*.chm文件的。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh5.googleusercontent.com/ky0-xb631XbYURAyXq7lYTN1cEZToSTgme3MwWQgPc1TKYUmNkHKf9QPbCz6b5ZfK_bVcHNqnho8D97jmeXdgstUVKeHAKmJW2ERUaYMqsnTu1Tpv1E" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;ClipMenu &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;0.4.3 // Clipboard增加软件。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh3.googleusercontent.com/wIRPVdf2JS7k4jVMz3AjsE6r5707qUqXf3d0QdX4ps6LA22WIMFt2VY8STHqIJV-xLJV9HEoVedqA9hjd98KjHy9aQCVituPZD-JGgJEgXNMkTMj0jU" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;coconutBattery &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;2.7 // 查看电池信息。&lt;/span&gt;&lt;/strong&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;div style="background-color: transparent;"&gt;&lt;strong id="internal-source-marker_0.42050701077096164" style="font-weight: normal;"&gt;&lt;img src="https://lh3.googleusercontent.com/_fr__WAFaq8WB2TGcQul_IFhiql6OoKdYt860gjzWVjnpxNsf6YCcSs8V-4Yr7CvSk9uBczFg_T-aGmvoYgiX5d9bHIYINXxZDSZFKptymtYUG_bk4E" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;diumoo &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;1.0 // douban FM。&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;div style="background-color: transparent;"&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh3.googleusercontent.com/BdX4zKRfm_jd6U6rpbMsEiw3oVWwrmwkIKeuy4vzfYMR3XPcN-7Y92X5keNKVS_T4bQok8Y-aEuxUIP5m6AiayNI-Z7skV6VKpCVorps-WBMQ9w5WD4" alt="" width="21px;" height="21px;" /&gt; &lt;span style="font-family: Helvetica; white-space: normal; font-size: medium;"&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Dropbox &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;1.1.45 // 最好用的云存储软件。&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh4.googleusercontent.com/LHJs1D7bjW-R7OyCSW_dJQntURaLKtN_Dnn2bcvDm9W_ZuZW0ojMv10mIVk_OWiLVV0x2gBTnSoNluRwZoSh_mpWiyyF-EutJWR2ofo8zQ_OLoj9D1k" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Evernote &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;3.0.3 // 最好用的笔记软件。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh3.googleusercontent.com/upGI0I11IVzObJu2pQ3RPS5rOpO410rHYq3oNTdtEa6waLTyqxo3DT4C9DGumduXnnhlBxQb3pNQtT9b03J4Vxz7Mkommh4C6awF_V3nbOXHQ9Q9VTw" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Google Chrome &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;15.0.874.121 // 配合iSSH+SwitchySharp过墙很好用。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh6.googleusercontent.com/TZ0oe6TWubJJfLKROgur0IgDISvAzjE7q08PWfF-YNF8GsAibWhR5solEuI9zOoYorTxhZ4sYH5EvZ7VtHk4JQR7OCzi2mBOd-dIhNdY4OgnNKlPo2E" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;iFunia AudioConverter &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;3.2 // 音频格式转换。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;div style="background-color: transparent;"&gt;&lt;strong id="internal-source-marker_0.42050701077096164" style="font-weight: normal;"&gt;&lt;img src="https://lh3.googleusercontent.com/D5BP5E_OnVrohX890GYjOtMvSRM3-g3ultw8USXjbNckKjp9Joo11088qRc0z7zr0AoOQit3_KZ6EzqGrEYyBfhhBO8ZKJb8-Ki1EIYoNJZpUpknBJ8" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;iSSH &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;3.1 // SSH客户端&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh5.googleusercontent.com/x2Dyht87JIGaqDooyXO98hUxEXlncUKoTk93wzcdlncWjA-O7hfh10yVVHgcpDmz2qpBlRww8RMNPOWANWfo6oNf212kkwFTTj4Mkuynx4lizsz1z3Y" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;MarsEdit &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;3.3 // 写博客专用。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh5.googleusercontent.com/s63jGt_ZFCJYUrPxbF04xEOUjYtf3VC-jAGcymrZyC_QKDVQaRjFSqK0-GVendv5jXy_DYTcqXl6Ecb85U5DxAVII9AznKqMpwFOY7sBrlvIuc2cOhM" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;MindNode &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;1.7.4 // 思维导图。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh5.googleusercontent.com/VygRx6pAdJ6d6zRCB9D2C25DIfGBZ2Resc3ile_uVzIpkHbIdOu-mTdJeRT7NWkYVx1ARhhaMQolVfI_OOrThL_pFrfn6X5mwRuiDxoOINOmJsNw1gM" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;MPlayerX &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;1.0.10 // 看电影专用。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;div style="background-color: transparent;"&gt;&lt;strong id="internal-source-marker_0.42050701077096164" style="font-weight: normal;"&gt;&lt;img src="https://lh6.googleusercontent.com/UgJk8LfvahglV1xWXT9ssZvx_ZeDVzWlXjl0cFVbe7mPYO9fDcOG7r7FZRY7MLg4JDPoYsgfPyBJJPsXLw9mcXXVY8ZOZTPZJmJvMp_SFqCBVktNxDE" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Mr.Zipper &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;2.20 // 压缩、解压缩。&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;div style="background-color: transparent;"&gt;&lt;strong id="internal-source-marker_0.42050701077096164" style="font-weight: normal;"&gt;&lt;img src="https://lh6.googleusercontent.com/TXT_Fy55p_yFMg0WJAhJEDr8QrfXa5VqGuOJeQNxI-zvxk6B8upFTF1HkSDJLsoYAqnPxFWG5qXxs_llhLqDhL5Bmxl7XSO2yGUTapOQAe1QRv69pXI" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;nexTab &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;4.0 // 触控板增加，可用手势打开、关闭、新建tab页，用@aiww债主的福利换的。&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img style="border: 0px initial initial;" src="https://lh4.googleusercontent.com/TRufi7d6GA5bIn-laPMYbEhLWx-_gQVga3f4_CkT8PnCmbDAM7EvDLyTi1oQAaAS7zclNcJJxfQSnnXwaZeFipdjngxCZB1yZX1HwnR6XQdTG0h2bjc" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Paintbrush &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;2.1.1 // 相当于Windows上的画图。&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;div style="background-color: transparent;"&gt;&lt;strong id="internal-source-marker_0.42050701077096164" style="font-weight: normal;"&gt;&lt;img src="https://lh3.googleusercontent.com/ULKb_IIt-3Emq-3kY5Y0aBnvj6UOtLzfnFt3YmHVqXyWO4GDzXQrEuS9qJiRo9H6sSEKNQNLPCCA57A5NMdJ_zcm-VkfVl74p_cMbj1iftw7XNtol68" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Parallels Desktop &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;7.0 // 最好用的虚拟机软件了，我现在在PD的虚拟机里进行.NET开发。&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh6.googleusercontent.com/0IwszTTIaJzmTm3aR58wC9YJzpVF6gBftvNA8mPQyMkGtEnPopDxb2jEmFwkqozqlfsqLhGa-PR7vQGMy3du29jButpOf-95obzcbjpC6VPaSWwV1Qk" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;QQ &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;1.4 // 比Windows上的版本好用。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh5.googleusercontent.com/oY_1-nTPN19KIqMm9mk4MTpD2n15WdbOKxXvnB3rTuOg2ORYpBEgblIbDgvVAq5NSrRD3-4zsJVZBsRuxpfWdNr9BrXsdAXWNtZ9qUEO_nM_67o-MRY" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;NTFS for Mac OS X &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;r82 // 用来打开NTFS格式的磁盘。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;div style="background-color: transparent;"&gt;&lt;strong id="internal-source-marker_0.42050701077096164" style="font-weight: normal;"&gt;&lt;img src="https://lh5.googleusercontent.com/mBRy4Nx7CzOFbiPVpi2IOtTG_cJ5cVG72CP6Hsri6mMr66cfNTVZL2PopBMMAHbLDqB0_ZIvp9lmdqL4oT48BByvDYYO4gePY9-XftQqp7Mn7lNRur4" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Reeder &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;1.0 // 在Google Reader变的巨难用的今天，Reeder显的更重要了，看GR的第一选择啊。&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh4.googleusercontent.com/iWStFoT6GlopyGuISJtmoJN9N_MprosKcsxxp-jvF6lyVl2ifH86QJWlqJOT_98NkJOu1p4o0FinNr_23LhWPoRhn5L0XAuhXybkcBnUNR927jAjlzU" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Skitch &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;1.0.7 // 巨好用的截图软件。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh4.googleusercontent.com/0vuHUxlqzTu3X2Y5dVUeHBPiErF1N0e06Y89WLngWbE1L-Auh2lokz2BS8QF0xvObO1RAyeN4UbUYCwzi-TFOX4Rm1lwfeG7c0LDPRW-pTFkS1gPvTg" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Skype &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;5.2.0.1523 &lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;div style="background-color: transparent;"&gt;&lt;strong id="internal-source-marker_0.42050701077096164" style="font-weight: normal;"&gt;&lt;img src="https://lh4.googleusercontent.com/NXTa4EjQGejinTF9MIbFu2vyoJZgZ-vUhaZyOyBXy397IffamwonqZIF8sCgHzOECiw_Xawv7chzsov94BsfCeXvLBiV_mQtZIxtTt5hwRa_bo_TOdA" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Screeny &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;1.2.1 //录屏软件。&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh3.googleusercontent.com/ZNnEfugZU1Iv2JZLCiOSFuYaBpcZlyEcArF5tx2OLG23OMn03kgbI7s2yONgx2ZuMhAjYsuE2KFQXRxxu3sIGXYNOEOnPH-0zRwgoCRLKV-UGScQtl8" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;TextExpander &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;3.3.3 // 文本输入增加软件，可快速输入设定好的文本片断。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh6.googleusercontent.com/irKcFRtTICuU7frfM6G8IXR_TjJanE5TyAo6M-ejqUZfc9XkA7iqcnoHZeASXIhT9VsLZi55p80zi5hDF35a3WscxTLxL9EJUf0xF5ftb25LVffVZ5E" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;The Unarchiver &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;2.7 // 解压专用。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh5.googleusercontent.com/YIyndrnHjsPBlsjWYb0O4Y7SuM6Lt8E9Zco21qSOJHYne533GXBWAljLq9fBFV4vQ2dxxqlO8h5LIbFdv7pmGaKQGASRJMyARjVDVHzYEwU2xi4c3wc" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Thunder &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;1.1 // 可惜不支持离线。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh5.googleusercontent.com/1dicoM1ulmUa8njy_EfXRaHvMOeJZxfLf0Trev6RL9PdfIHJIGMO-xmZfkU5GQL8yB2WseP6SrjoZfEszVW_5cL_tvJ5mvwZflncEzos9ZtOuGmhItY" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Total Video Converter &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;2.8.5 // 视频格式转换。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh5.googleusercontent.com/32ve0cXWskN0S-yFkBqaKqZFPlj32srW3qfKBUjbFB_wDeqCoHFzaKP264UUeEyns5GBboEiImJOTBMQf6GljVsdpJ-5urKNshtpmtuFNklcVDXkLXg" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Twitter &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;2.1.1 // 官方客户端。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;div style="background-color: transparent;"&gt;&lt;strong id="internal-source-marker_0.42050701077096164" style="font-weight: normal;"&gt;&lt;img src="https://lh3.googleusercontent.com/2OOtzVsBd_lghEoV0FjHf26n0gmca2KXYuPwSdC12BtC2mrVsQ3gDTah9691z05wRqta3hm1lA241F69bwils8ErguszgEZ8PKBTmbvHYjS0oHOAOxw" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Window Tidy &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;1.10 // 窗体布局用的。&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong id="internal-source-marker_0.37348616775125265" style="font-weight: normal;"&gt;&lt;img src="https://lh5.googleusercontent.com/4zdFR8chqpsYhJjeUWPkMjUnsjgdSk-Xtsjm2ytdAR0CZGNVXysU_hUKXgqK92DXpwTgBjuOYi4pkwLX_hrmD9-RcElAMZ-k3TMw9I6q5cJz1gFdRus" alt="" width="21px;" height="21px;" /&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;YoruFukurou &lt;/span&gt;&lt;span style="font-size: 16px; font-family: Verdana; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;2.69 // Twitter第三方客户端,好用。&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/zhangronghua/aggbug/2315650.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangronghua/archive/2012/01/07/AppsForMac.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhangronghua/archive/2011/12/31/Summaryof2011.html</id><title type="text">2011年年终总结</title><summary type="text">有了女儿，初为人父，感觉很奇妙，女儿很乖很漂亮，是今年最大的收获，感谢老婆给了我这么好的女儿。美帝流亡三个月，见识了美帝的腐朽生活，真心不想归来，希望女儿长大后可以去腐朽的资本主义社会生活。中了电子设备的毒，买了iPod Touch, MBP, Kindle KeyBoard 3G,HTC Android手机。还短暂的玩过BlackBerry 8310，8900，9000，9700，9780，9800。后来把黑莓手机都转手卖了，全键盘虽有爱，但App太少了。开始购买了自己的第一个正版App---iDaily Pro, 然后又买了其它的几个，最贵的是DataBase.Net 19$一个Licen</summary><published>2011-12-31T03:38:00Z</published><updated>2011-12-31T03:38:00Z</updated><author><name>张荣华</name><uri>http://www.cnblogs.com/zhangronghua/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangronghua/archive/2011/12/31/Summaryof2011.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangronghua/archive/2011/12/31/Summaryof2011.html"/><content type="html">&lt;p style="font-size: 15px;"&gt;有了女儿，初为人父，感觉很奇妙，女儿很乖很漂亮，是今年最大的收获，感谢老婆给了我这么好的女儿。&lt;/p&gt;&#xD;
&lt;p style="font-size: 15px;"&gt;美帝流亡三个月，见识了美帝的腐朽生活，真心不想归来，希望女儿长大后可以去腐朽的资本主义社会生活。&lt;/p&gt;&#xD;
&lt;p style="font-size: 15px;"&gt;中了电子设备的毒，买了iPod Touch, MBP, Kindle KeyBoard 3G,HTC Android手机。还短暂的玩过BlackBerry 8310，8900，9000，9700，9780，9800。后来把黑莓手机都转手卖了，全键盘虽有爱，但App太少了。&lt;/p&gt;&#xD;
&lt;p style="font-size: 15px;"&gt;开始购买了自己的第一个正版App---iDaily Pro, 然后又买了其它的几个，最贵的是DataBase.Net 19$一个License,仍然有一些软件是使用的盗版，仍需努力啊。&lt;/p&gt;&#xD;
&lt;p style="font-size: 15px;"&gt;参加了一次济南推友聚会，认识了很多有意思的推友，Twitter变成了我的主力SNS和IM，真心喜欢Twitter和推友啊。&lt;/p&gt;&#xD;
&lt;p style="font-size: 15px;"&gt;产品团队解散， 被迫换工作，从美企又回到了油田这个圈子，今年的工作平平淡淡，没有什么值得说的，技术上也没有太多的进步，惟一值得说的是业余学的Silverlight处理CCFlow流程设计器带来了一些收入，希望明年可以进步一些。&lt;/p&gt;&#xD;
&lt;p style="font-size: 15px;"&gt;驾照考完科目二了，过完年后再考一下科目三就坐等买车了。&lt;/p&gt;&#xD;
&lt;p style="font-size: 15px;"&gt;当了两回@aiww的债主，希望他还钱时还设计一个还钱凭证吧。&lt;/p&gt;&#xD;
&lt;p style="font-size: 15px;"&gt;回顾整个2011年平平淡淡，普普通通，也许这就是生活吧，把普通的生活过的好些就是我等普通青年的理想吧。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;----------------------------------------------------------------------------------------------------------&lt;/p&gt;&#xD;
&lt;p style="font-size: 15px;"&gt;2012年目标：&lt;/p&gt;&#xD;
&lt;p style="font-size: 15px;"&gt;学习iOS,从购买了MBP就开始想学习，不过随着女儿的出生和驾照的学习就把这事给耽误了，2012年一定要努力学习，拖延症患者伤不起啊。&lt;/p&gt;&#xD;
&lt;p style="font-size: 15px;"&gt;将手头上的纸质书读完，读完之前不再买新书，2012年希望自己可以看10本左右的专业书籍。若干本其它类的电子书籍。&lt;/p&gt;&#xD;
&lt;p style="font-size: 15px;"&gt;驾照考完。&lt;/p&gt;&#xD;
&lt;p style="font-size: 15px;"&gt;买个iPad或是别的平板电脑，先暂定为iPad吧，如果Android给力也可以考虑。&lt;/p&gt;&#xD;
&lt;p style="font-size: 15px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="font-size: 15px;"&gt;PS: 写的较随意，想到啥写啥，所以先后顺序没有优先级。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhangronghua/aggbug/2308578.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangronghua/archive/2011/12/31/Summaryof2011.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhangronghua/archive/2011/12/13/DisplaySVNIconOnTc.html</id><title type="text">TotalCommander中显示SVN图标</title><summary type="text">要想在TC(Total Commander)中显示SVN的图标需要做以下两步：在”SVN Settings”-&amp;gt;“Icon Overlays”中保证”Show overlays and context menu only in explorer”没有被选中。Total Commander7.5 中在“设置“-&amp;gt;”选项“-&amp;gt;”显示“-&amp;gt;”图标”中把&amp;quot;显示层叠图标&amp;quot;选上就可以了！</summary><published>2011-12-13T02:38:00Z</published><updated>2011-12-13T02:38:00Z</updated><author><name>张荣华</name><uri>http://www.cnblogs.com/zhangronghua/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangronghua/archive/2011/12/13/DisplaySVNIconOnTc.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangronghua/archive/2011/12/13/DisplaySVNIconOnTc.html"/><content type="html">&lt;p&gt;要想在TC(Total Commander)中显示SVN的图标需要做以下两步：&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;在&amp;rdquo;SVN Settings&amp;rdquo;-&amp;gt;&amp;ldquo;Icon Overlays&amp;rdquo;中保证&amp;rdquo;Show overlays and context menu only in explorer&amp;rdquo;没有被选中。&lt;/li&gt;&#xD;
&lt;li&gt;Total Commander7.5 中在&amp;ldquo;设置&amp;ldquo;-&amp;gt;&amp;rdquo;选项&amp;ldquo;-&amp;gt;&amp;rdquo;显示&amp;ldquo;-&amp;gt;&amp;rdquo;图标&amp;rdquo;中把"显示层叠图标"选上就可以了！&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhangronghua/aggbug/2285708.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangronghua/archive/2011/12/13/DisplaySVNIconOnTc.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhangronghua/archive/2011/12/05/DiableUpgradeDialogofStyleCop.html</id><title type="text">禁用StyleCop的升级对话框</title><summary type="text">公司用的StyleCop因为有自定义规则集，为了保持自定义规则集的兼容性不能每次都更新最新的StyleCop。所以需要禁用StyleCop的升级对话框，找了找在StyleCop设置和Visual Studio设置里都没有找到设置的地方，最后只能请出注册表了，修改方法如下：运行&amp;quot;RegEdit&amp;quot;,找开注册表编辑器，前往KEY_CURRENT_USER\Software\CodePlex\StyleCop，找到AlwaysCheckForUpdatesWhenVisualStudioStarts，将其值从1改为0就可以了。</summary><published>2011-12-05T01:14:00Z</published><updated>2011-12-05T01:14:00Z</updated><author><name>张荣华</name><uri>http://www.cnblogs.com/zhangronghua/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangronghua/archive/2011/12/05/DiableUpgradeDialogofStyleCop.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangronghua/archive/2011/12/05/DiableUpgradeDialogofStyleCop.html"/><content type="html">&lt;p&gt;公司用的StyleCop因为有自定义规则集，为了保持自定义规则集的兼容性不能每次都更新最新的StyleCop。所以需要禁用StyleCop的升级对话框，找了找在StyleCop设置和Visual Studio设置里都没有找到设置的地方，最后只能请出注册表了，修改方法如下：&lt;/p&gt;&#xD;
&lt;p&gt;运行"RegEdit",找开注册表编辑器，前往KEY_CURRENT_USER\Software\CodePlex\StyleCop，找到AlwaysCheckForUpdatesWhenVisualStudioStarts，将其值从1改为0就可以了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhangronghua/aggbug/2276358.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangronghua/archive/2011/12/05/DiableUpgradeDialogofStyleCop.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhangronghua/archive/2011/11/23/CustomTreeViewToSupportDragAndMultiSelect.html</id><title type="text">TreeView控件实现按Ctrl和Shift键多选功能</title><summary type="text">继上次定制TreeView控件，实现节点样式自定义及节点级别的单选、复选后继续对TreeView控件，这次实现的功能是树节点可以按Ctrl/Shift键多选和树节点的拖动。相对于上次的代码，这次主要新增加也以下几个属性和方法：IsMultiSelect属性：树是否需要使用多选功能SelectedNodeList属性：多选时被选中的节点的集合TreeNodeCanAcceptDragedHandler事件：拖动时用来判断目标节点是否接受拖动IsNodeCanAcceptDragHandler事件：拖动成功后要执行的事件，一般用来将新的关系持久化到数据库或其它地方。实现比较简单，各位直接看代码吧。</summary><published>2011-11-23T07:44:00Z</published><updated>2011-11-23T07:44:00Z</updated><author><name>张荣华</name><uri>http://www.cnblogs.com/zhangronghua/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangronghua/archive/2011/11/23/CustomTreeViewToSupportDragAndMultiSelect.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangronghua/archive/2011/11/23/CustomTreeViewToSupportDragAndMultiSelect.html"/><content type="html">&lt;p&gt;继上次&lt;a href="http://www.cnblogs.com/zhangronghua/archive/2011/08/15/CustomTreeView.html"&gt;定制TreeView控件，实现节点样式自定义及节点级别的单选、复选&lt;/a&gt;后继续对TreeView控件，这次实现的功能是树节点可以按Ctrl/Shift键多选和树节点的拖动。相对于上次的代码，这次主要新增加也以下几个属性和方法：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;IsMultiSelect属性：树是否需要使用多选功能&lt;/li&gt;&#xD;
&lt;li&gt;SelectedNodeList属性：多选时被选中的节点的集合&lt;/li&gt;&#xD;
&lt;li&gt;TreeNodeCanAcceptDragedHandler事件：拖动时用来判断目标节点是否接受拖动&lt;/li&gt;&#xD;
&lt;li&gt;IsNodeCanAcceptDragHandler事件：拖动成功后要执行的事件，一般用来将新的关系持久化到数据库或其它地方。&lt;/li&gt;&#xD;
&lt;/ul&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;" onclick="cnblogs_code_show('9c588f0a-d538-43cc-b109-f851fce236dd')"&gt;&#xD;
&lt;div id="cnblogs_code_open_9c588f0a-d538-43cc-b109-f851fce236dd" &gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.ComponentModel;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Drawing;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Windows.Forms;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; GADPlatSystem.Navigate;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; GADPlatSystem.Tools&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 导航树控件&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;    [DesignTimeVisible(&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;)]&lt;br /&gt;    [Serializable]&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; GTreeView  : TreeView&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; 成员变量&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 存储多选时选择的节点&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; IList&amp;lt;TreeNode&amp;gt; selectedNodeList = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;TreeNode&amp;gt;();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 当前节点&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; TreeNode currentNode = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; 属性&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 是否是多选&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; IsMultiSelect { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;   &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;   选择的节点的集合&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; IList&amp;lt;TreeNode&amp;gt; SelectedNodeList&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; selectedNodeList; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; Delegate &amp;amp; Event&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 节点被拖动后要处理事件的Delegate&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="sourceNode"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;被拖动的节点&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="targetNode"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;目标节点&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnDragNodeSucceed(TreeNode sourceNode, TreeNode targetNode);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 判断目标节点是否接受拖动的Delegate&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="targetNode"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; IsNodeCanAcceptDrag(TreeNode targetNode);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 节点被拖动后要处理事件&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;event&lt;/span&gt; OnDragNodeSucceed TreeNodeCanAcceptDragedHandler;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 判断目标节点是否接受拖动的事件处理&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;event&lt;/span&gt; IsNodeCanAcceptDrag IsNodeCanAcceptDragHandler;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; 类函数&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 构造函数&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; TreeViewExt()&lt;br /&gt;            : &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.DrawMode = TreeViewDrawMode.OwnerDrawText;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 鼠标单击事件&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="e"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;TreeNodeMouseClickEventArgs对象类&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnNodeMouseClick(TreeNodeMouseClickEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.SelectedNode = e.Node;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isSingleSelected = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 如果是多选，则根据按钮情况设置节点的选择状态&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (IsMultiSelect)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!(SelectedNodeList.Count == &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;amp;&amp;amp; SelectedNodeList[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] == SelectedNode))&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; ((Control.ModifierKeys &amp;amp; Keys.Control) != &lt;span style="color: #800080;"&gt;0&lt;/span&gt; || e.Button == MouseButtons.Right)&lt;br /&gt;                    {&lt;br /&gt;                        ctrlMultiSelectNodes(SelectedNode, e.Button == MouseButtons.Right);&lt;br /&gt;                    }&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; ((Control.ModifierKeys &amp;amp; Keys.Shift) != &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;                    {&lt;br /&gt;                        shiftMultiSelectNodes(SelectedNode, e.Button == MouseButtons.Right);&lt;br /&gt;                    }&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                    {&lt;br /&gt;                        isSingleSelected = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;                        singleSelectNode(SelectedNode);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                isSingleSelected = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                singleSelectNode(SelectedNode);&lt;br /&gt;                setCurrentNode(SelectedNode);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Invalidate();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 重绘,主要是在Checkbox/RadioButton前面有图片&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="e"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;DrawTreeNodeEventArgs对象类&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnDrawNode(DrawTreeNodeEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (e.Bounds.X == -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            e.DrawDefault = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            Font font = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Font;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (e.Node.NodeFont != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) font = e.Node.NodeFont;&lt;br /&gt;&lt;br /&gt;            Color color = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ForeColor;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (SelectedNodeList.Contains(e.Node))&lt;br /&gt;            {&lt;br /&gt;                color = SystemColors.HighlightText;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (e.Node.ForeColor != Color.Empty)&lt;br /&gt;            {&lt;br /&gt;                color = e.Node.ForeColor;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            Graphics g = e.Graphics;&lt;br /&gt;            Rectangle textBounds = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Rectangle();&lt;br /&gt;&lt;br /&gt;            GTreeNode extNode = e.Node &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; GTreeNode;&lt;br /&gt;&lt;br /&gt;            textBounds.X = e.Bounds.X;&lt;br /&gt;            textBounds.Y = e.Bounds.Y;&lt;br /&gt;            textBounds.Width = e.Bounds.Width;&lt;br /&gt;            textBounds.Height = e.Bounds.Height;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 绘制节点的文本&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (SelectedNodeList.Contains(e.Node))&lt;br /&gt;            {&lt;br /&gt;                g.FillRectangle(SystemBrushes.Highlight, textBounds);&lt;br /&gt;                ControlPaint.DrawFocusRectangle(g, textBounds, color, SystemColors.Highlight);&lt;br /&gt;                TextRenderer.DrawText(g, e.Node.Text, font, textBounds, color, TextFormatFlags.Default);&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                g.FillRectangle(SystemBrushes.Window, textBounds);&lt;br /&gt;                TextRenderer.DrawText(g, e.Node.Text, font, textBounds, color, TextFormatFlags.Default);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;控件初始化&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; InitializeComponent()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.SuspendLayout();&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GTreeViewExt&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Indent = &lt;span style="color: #800080;"&gt;25&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ItemHeight = &lt;span style="color: #800080;"&gt;25&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ResumeLayout(&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; 鼠标拖动节点移动&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 拖动节点移动,在鼠标拖放操作结束时发生&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="drgevent"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;DragEventArgs对象&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnDragDrop(DragEventArgs drgevent)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.OnDragDrop(drgevent);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; moveNode = (TreeNode)drgevent.Data.GetData(&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(TreeNode));&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;根据鼠标坐标确定要移动到的目标节点 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            Point point = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.PointToClient(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Point(drgevent.X, drgevent.Y));&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; targetNode = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.GetNodeAt(point);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 如果目标节点不接受拖动，则返回&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (IsNodeCanAcceptDragHandler != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!IsNodeCanAcceptDragHandler(targetNode))&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 确定落下的节点不是被拖拽节点本身或者被拖拽节点的子节点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!moveNode.Equals(targetNode) &amp;amp;&amp;amp; !containsNode(moveNode, targetNode))&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; newMoveNode = (TreeNode)moveNode.Clone();&lt;br /&gt;                targetNode.Nodes.Insert(targetNode.Index, newMoveNode);&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;更新当前拖动的节点选择 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.SelectedNode = newMoveNode;&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;移除拖放的节点 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                moveNode.Remove();&lt;br /&gt;                moveNode = newMoveNode;&lt;br /&gt;                newMoveNode.Expand();&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (TreeNodeCanAcceptDragedHandler != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;                {&lt;br /&gt;                    TreeNodeCanAcceptDragedHandler(moveNode, targetNode);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 拖动节点移动,在用鼠标将某项拖动到该控件的工作区时发生&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="drgevent"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;DragEventArgs对象&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnDragEnter(DragEventArgs drgevent)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.OnDragEnter(drgevent);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (drgevent.Data.GetDataPresent(&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(TreeNode)))&lt;br /&gt;            {&lt;br /&gt;                drgevent.Effect = DragDropEffects.Move;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                drgevent.Effect = DragDropEffects.None;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 拖动节点移动，在用户开始拖动项时发生&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="e"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;ItemDragEventArgs对象&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnItemDrag(ItemDragEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.OnItemDrag(e);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (e.Button == MouseButtons.Left)&lt;br /&gt;            {&lt;br /&gt;                DoDragDrop(e.Item, DragDropEffects.Move);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt; 鼠标拖动节点移动&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; Private Methods&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;   &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;   按ctrl键多选的方法 &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;   &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param   name="node"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;   &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param   name="mustSelect"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; ctrlMultiSelectNodes(TreeNode node, &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; mustSelect)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (SelectedNodeList.Contains(node) &amp;amp;&amp;amp; !mustSelect)&lt;br /&gt;            {&lt;br /&gt;                SelectedNodeList.Remove(node);&lt;br /&gt;                setCurrentNode((TreeNode)SelectedNodeList[SelectedNodeList.Count - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;]);&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!mustSelect)&lt;br /&gt;            {&lt;br /&gt;                SelectedNodeList.Add(node);&lt;br /&gt;                setCurrentNode(node);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 按shift键多选的方法 &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="node"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="mustSelect"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; shiftMultiSelectNodes(TreeNode node, &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; mustSelect)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (mustSelect)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (SelectedNodeList.Contains(node))&lt;br /&gt;            {&lt;br /&gt;                SelectedNodeList.Remove(node);&lt;br /&gt;                setCurrentNode((TreeNode)SelectedNodeList[SelectedNodeList.Count - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;]);&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (node.Parent == currentNode.Parent)&lt;br /&gt;                {&lt;br /&gt;&lt;br /&gt;                    TreeNode addNode = node;&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = System.Math.Abs(currentNode.Index - node.Index); i &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i--)&lt;br /&gt;                    {&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!SelectedNodeList.Contains(addNode))&lt;br /&gt;                        {&lt;br /&gt;                            SelectedNodeList.Add(addNode);&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                        addNode = currentNode.Index &amp;gt; node.Index ? addNode.NextNode : addNode.PrevNode;&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    setCurrentNode(node);&lt;br /&gt;                }&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;                    singleSelectNode(SelectedNode);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;   &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; single select   &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;   &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param   name="node"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; singleSelectNode(TreeNode node)&lt;br /&gt;        {&lt;br /&gt;            SelectedNodeList.Clear();&lt;br /&gt;            SelectedNodeList.Add(node);&lt;br /&gt;            setCurrentNode(node);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;   &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;   Set current node   &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;   &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param   name="node"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; setCurrentNode(TreeNode node)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;if (isMulSelect)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;    SelectedNode = null;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (currentNode != node)&lt;br /&gt;            {&lt;br /&gt;                currentNode = node &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; TreeNode;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 确定一个节点是否是另一个节点的祖先节点&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="parentNode"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="childNode"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; containsNode(TreeNode parentNode, TreeNode childNode)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (childNode.Parent == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (childNode.Parent.Equals(parentNode)) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; containsNode(parentNode, childNode.Parent);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&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;" onclick="cnblogs_code_show('fd2442ec-cc94-4df2-a2fc-211406de79f6')"&gt;&#xD;
&lt;div id="cnblogs_code_open_fd2442ec-cc94-4df2-a2fc-211406de79f6" &gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;       private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Form1_Load(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; gTreeView1 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; GTreeViewExt();&lt;br /&gt;            gTreeView1.AllowDrop = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;            gTreeView1.IsMultiSelect = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;            gTreeView1.TreeNodeDragedHandler += (source, target) =&amp;gt;&lt;br /&gt;                                                       { listBox1.Items.Add(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;将&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + source.Text + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;拖动到了&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + target.Text); };&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;10&lt;/span&gt;; i++)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; cNode = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TreeNode();&lt;br /&gt;                cNode.Tag = i;&lt;br /&gt;                cNode.Text = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Node&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + i;&lt;br /&gt;                cNode.ImageIndex = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;                cNode.SelectedImageIndex = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;                gTreeView1.Nodes.Add(cNode);&lt;br /&gt;            &lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; i; j++)&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; innerNode = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TreeNode();&lt;br /&gt;                    innerNode.Tag = i;&lt;br /&gt;                    innerNode.Text = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;InnerNode&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; +   i + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;-&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + j;&lt;br /&gt;                    innerNode.ImageIndex = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;                    innerNode.SelectedImageIndex = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;                    cNode.Nodes.Add(innerNode);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            gTreeView1.ExpandAll();&lt;br /&gt;            gTreeView1.Width = &lt;span style="color: #800080;"&gt;400&lt;/span&gt;;&lt;br /&gt;            gTreeView1.Dock = DockStyle.Left;&lt;br /&gt;            Controls.Add(gTreeView1);&lt;br /&gt;        }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhangronghua/aggbug/2259021.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangronghua/archive/2011/11/23/CustomTreeViewToSupportDragAndMultiSelect.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhangronghua/archive/2011/11/22/IntroduceOfDataBaseNET.html</id><title type="text">软文：数据库管理软件Database.NET介绍</title><summary type="text">如果你像我一样平常工作时需要用到Sql Server、 Oracle、 SqlLite等多种数据库，并且对每种数据库的主要使用都是维护数据结构、执行查询语句、Profiler等基本操作。而你又和我一样不想用Sql Server时去安装庞大的Sql Server Management Studio,用Oracle时去安装PL/Sql Developer，用SqlLite时去安装SqlExpert等软件，而是想使用一个统一的软件来进行数据库操作。最后如果你也像我一样不想每次用到一个数据库软件都去网上找管理器的破解版本的话，可以试试我最近在用的Database.NET这个软件，台湾人开发的，我用着挺</summary><published>2011-11-22T14:15:00Z</published><updated>2011-11-22T14:15:00Z</updated><author><name>张荣华</name><uri>http://www.cnblogs.com/zhangronghua/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangronghua/archive/2011/11/22/IntroduceOfDataBaseNET.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangronghua/archive/2011/11/22/IntroduceOfDataBaseNET.html"/><content type="html">&lt;div&gt;&#xD;
&lt;p&gt;如果你像我一样平常工作时需要用到Sql Server、 Oracle、 SqlLite等多种数据库，并且对每种数据库的主要使用都是维护数据结构、执行查询语句、Profiler等基本操作。而你又和我一样不想用Sql Server时去安装庞大的Sql Server Management Studio,用Oracle时去安装PL/Sql Developer，用SqlLite时去安装SqlExpert等软件，而是想使用一个统一的软件来进行数据库操作。最后如果你也像我一样不想每次用到一个数据库软件都去网上找管理器的破解版本的话，可以试试我最近在用的&lt;a href="http://fishcodelib.com/Database.htm"&gt;Database.NET&lt;/a&gt;这个软件，台湾人开发的，我用着挺好用，绿色无需安装，支持常见的所有数据库，免费版本无自动完成，无Profiler等功能，一个License19$.&lt;/p&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/zhangronghua/aggbug/2259525.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangronghua/archive/2011/11/22/IntroduceOfDataBaseNET.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhangronghua/archive/2011/11/22/SilverlightRemoveConfigDependency.html</id><title type="text">Silverlight引用WebService时取消对ServiceReferences.ClientConfig文件的依赖</title><summary type="text">做过Silverlight项目的朋友都知道一般来说我们在Silverlight项目中都需要引用WebService或是WCF,引用的方式是在Visual Studio窗口中通过“添加服务引用”来添加引用，这时Visual Studio会生成一个 ServiceReferences.ClientConfig 配置文件，这个文件中存储了WebService的地址，绑定等信息，我们在Silverlight中实例化WebService的代理类时需要用到这个文件，没有这个文件WebService代理类的实例化就会失败。使用ServiceReferences.ClientConfig的方式来实例化WebService代理类比较简单，但是也有一个缺点，就是每次将Silverlight项目上线时都需要手工打开生成的XAF包，将ServiceReferences.ClientConfig文件中的WebService地址从http://Localhost/YourProject/YourWebService.asmx的形式改为http://YourDomain/YourProject/YourWe</summary><published>2011-11-22T13:49:00Z</published><updated>2011-11-22T13:49:00Z</updated><author><name>张荣华</name><uri>http://www.cnblogs.com/zhangronghua/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangronghua/archive/2011/11/22/SilverlightRemoveConfigDependency.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangronghua/archive/2011/11/22/SilverlightRemoveConfigDependency.html"/><content type="html">&lt;p&gt;做过Silverlight项目的朋友都知道一般来说我们在Silverlight项目中都需要引用WebService或是WCF,引用的方式是在Visual Studio窗口中通过“添加服务引用”来添加引用，这时Visual Studio会生成一个 ServiceReferences.ClientConfig 配置文件，这个文件中存储了WebService的地址，绑定等信息，我们在Silverlight中实例化WebService的代理类时需要用到这个文件，没有这个文件WebService代理类的实例化就会失败。&lt;/p&gt;&#xD;
&lt;p&gt;使用ServiceReferences.ClientConfig的方式来实例化WebService代理类比较简单，但是也有一个缺点，就是每次将Silverlight项目上线时都需要手工打开生成的XAF包，将ServiceReferences.ClientConfig文件中的WebService地址从http://&lt;span style="color: #ff0000;"&gt;Localhost&lt;/span&gt;/YourProject/YourWebService.asmx的形式改为http://&lt;span style="color: #ff0000;"&gt;YourDomain&lt;/span&gt;/YourProject/YourWebService.asmx，如果某次你忘记了修改，可能会导致你的Siverlight项目在线上无法正常运行。那么有没有一种简单的方式让我们不需要每次上线都修改ServiceReferences.ClientConfig文件，让我们摆脱对ServiceReferences.ClientConfig的信赖呢？下面就说一下我的实现方式。&lt;/p&gt;&#xD;
&lt;p&gt;实现原理很简单，就是在一个类里手工的构造WebService的EndPoint, Binding等信息，将ServiceReferences.ClientConfig的作用用代码来代替，示例实现代码如下，代码很简单，各位一看就明白。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('206ab42e-1326-441b-91bd-3b78e18a4b56')"&gt;&#xD;
&lt;div id="cnblogs_code_open_206ab42e-1326-441b-91bd-3b78e18a4b56" &gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="white-space: pre;"&gt;	&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;span style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 得到WebService对象&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;span style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 以后实例化WebService代理时请用var serviceClient = Utility.GetDesignerServiceInstance();的形式，&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="white-space: pre;"&gt;	&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;     不要再用默认的 var serviceClient = new WSDesignerSoapClient();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="white-space: pre;"&gt;	&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 后一种形式会报错，因为我们删除了ServiceReferences.ClientConfig文件&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="white-space: pre;"&gt;	&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="white-space: pre;"&gt;	&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; WSDesignerSoapClient GetDesignerServiceInstance()&lt;br /&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; basicBinding = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; BasicHttpBinding() { MaxBufferSize = &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;.MaxValue, MaxReceivedMessageSize = &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;.MaxValue, Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;WSDesignerSoap&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; };&lt;br /&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;             basicBinding.Security.Mode = BasicHttpSecurityMode.None;&lt;br /&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; endPoint = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; EndpointAddress(getHostUrl() + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/WebService.asmx&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; ctor =&lt;br /&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt; (WSDesignerSoapClient).GetConstructor(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Type[] {&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt; (Binding), &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt; (EndpointAddress)});&lt;br /&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (WSDesignerSoapClient) ctor.Invoke(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;[] {basicBinding, endPoint});&lt;br /&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;      &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="white-space: pre;"&gt;	&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 得到当前所在网站的根目录，如Http://localhost/flow&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="white-space: pre;"&gt;	&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 注意站点名字必须是Flow,否则会报错。&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;span style="white-space: pre;"&gt;	&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;span style="white-space: pre;"&gt;	&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;  &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; getHostUrl()&lt;br /&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; location = (HtmlPage.Window.GetProperty(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;location&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)) &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; ScriptObject;&lt;br /&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; hrefObject = location.GetProperty(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;href&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; url = hrefObject.ToString().Substring(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, hrefObject.ToString().IndexOf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Flow/&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;) + &lt;span style="color: #800080;"&gt;5&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; url;&lt;br /&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt;         }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;PS:本文在写作中参考了：&lt;a href="http://www.cnblogs.com/RChen/archive/2008/10/24/1318658.html" target="_blank"&gt;[Silverlight]摆脱对 ServiceReferences.ClientConfig 的依赖&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhangronghua/aggbug/2258675.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangronghua/archive/2011/11/22/SilverlightRemoveConfigDependency.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhangronghua/archive/2011/11/04/DisableContentMenuOfSilverlight.html</id><title type="text">在Silverlight项目中禁止默认的右键菜单</title><summary type="text">有时需要在Silverlight项目中禁止掉默认的右键菜单，解决方法很简单，只要给根节点加上MouseRightButtonDown事件处理程序即可，代码如下：LayoutRoot.MouseRightButtonDown += (sender,e) =&amp;gt; { e.Handled=true; };</summary><published>2011-11-04T03:16:00Z</published><updated>2011-11-04T03:16:00Z</updated><author><name>张荣华</name><uri>http://www.cnblogs.com/zhangronghua/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangronghua/archive/2011/11/04/DisableContentMenuOfSilverlight.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangronghua/archive/2011/11/04/DisableContentMenuOfSilverlight.html"/><content type="html">&lt;p&gt;有时需要在Silverlight项目中禁止掉默认的右键菜单，解决方法很简单，只要给根节点加上MouseRightButtonDown事件处理程序即可，代码如下：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;LayoutRoot.MouseRightButtonDown += (sender,e) =&amp;gt;&#xD;
                {&#xD;
                    e.Handled=true;&#xD;
                };&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/zhangronghua/201111/201111041115306579.png"&gt;&lt;img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/zhangronghua/201111/20111104111530449.png" alt="image" width="244" height="45" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhangronghua/aggbug/2235844.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangronghua/archive/2011/11/04/DisableContentMenuOfSilverlight.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
