<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_TianFang</title><subtitle type="text">相濡以沫，不如相忘于江湖</subtitle><id>http://feed.cnblogs.com/blog/u/15688/rss</id><updated>2012-02-07T00:18:52Z</updated><author><name>天方</name><uri>http://www.cnblogs.com/TianFang/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TianFang/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/15688/rss"/><entry><id>http://www.cnblogs.com/TianFang/archive/2012/02/06/2340684.html</id><title type="text">通过编程计算一个游戏的胜率</title><summary type="text">以前庙会上经常有一个这样的游戏：摆摊人拿出四种不同颜色的球，每种5个，然后放在一个袋子里，让观众摸出十个来，然后按颜色分类，统计每种颜色的个数，根据不同组合可以拿到不同的奖品，但如果是1234或3322这两种组合的时候，则需要给摆摊人几块钱。其实一看到这个游戏就大致猜到这是个概率游戏了，1234和3322绝对是该规则下出现的较大的两个概率，摆摊人则无需使用任何作弊手段。但这两种组合的概率是多大，到一直没有细考虑过。其实上学的时候尝试算过，但当时数学没学好，愣是没算出来，便很快放弃了，现在上几年班后就自然更算不出来了。今天编了个小程序简单的算了个粗略的结果：程序如下：1classProgram2</summary><published>2012-02-06T15:13:00Z</published><updated>2012-02-06T15:13:00Z</updated><author><name>天方</name><uri>http://www.cnblogs.com/TianFang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TianFang/archive/2012/02/06/2340684.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TianFang/archive/2012/02/06/2340684.html"/><content type="html">&#xD;
&lt;p&gt;以前庙会上经常有一个这样的游戏：&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(128, 128, 0);"&gt;摆摊人拿出四种不同颜色的球，每种5个，然后放在一个袋子里，让观众摸出十个来，然后按颜色分类，统计每种颜色的个数，根据不同组合可以拿到不同的奖品，但如果是1234或3322这两种组合的时候，则需要给摆摊人几块钱。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(128, 128, 0);"&gt;&lt;/span&gt;其实一看到这个游戏就大致猜到这是个概率游戏了，1234和3322绝对是该规则下出现的较大的两个概率，摆摊人则无需使用任何作弊手段。但这两种组合的概率是多大，到一直没有细考虑过。其实上学的时候尝试算过，但当时数学没学好，愣是没算出来，便很快放弃了，现在上几年班后就自然更算不出来了。今天编了个小程序简单的算了个粗略的结果：&lt;/p&gt;&lt;p&gt;程序如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt;&amp;nbsp;Program&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt;&amp;nbsp;Main(&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;[]&amp;nbsp;args)&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt;&amp;nbsp;query&amp;nbsp;=&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;from&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;in&lt;/span&gt;&amp;nbsp;Enumerable.Range(&lt;span style="color: rgb(128, 0, 128);"&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style="color: rgb(128, 0, 128);"&gt;100&lt;/span&gt;&amp;nbsp;*&amp;nbsp;&lt;span style="color: rgb(128, 0, 128);"&gt;10000&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;result&amp;nbsp;=&amp;nbsp;Test()&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;group&amp;nbsp;result&amp;nbsp;by&amp;nbsp;result&amp;nbsp;into&amp;nbsp;g&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;value&amp;nbsp;=&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt;&amp;nbsp;{&amp;nbsp;Result&amp;nbsp;=&amp;nbsp;g.Key.ToString(&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;0000&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;),&amp;nbsp;Count&amp;nbsp;=&amp;nbsp;(&lt;span style="color: rgb(0, 0, 255);"&gt;double&lt;/span&gt;)g.Count()&amp;nbsp;/&amp;nbsp;&lt;span style="color: rgb(128, 0, 128);"&gt;10000&lt;/span&gt;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;orderby&lt;/span&gt;&amp;nbsp;value.Count&amp;nbsp;descending&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;select&lt;/span&gt;&amp;nbsp;value;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;11&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;12&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt;&amp;nbsp;item&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;in&lt;/span&gt;&amp;nbsp;query)&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;13&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;14&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(item);&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;15&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;16&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;17&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;18&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt;&amp;nbsp;Random&amp;nbsp;rnd&amp;nbsp;=&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt;&amp;nbsp;Random();&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;19&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt;&amp;nbsp;Test()&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;20&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;21&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt;&amp;nbsp;numbers&amp;nbsp;=&amp;nbsp;Enumerable.Range(&lt;span style="color: rgb(128, 0, 128);"&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style="color: rgb(128, 0, 128);"&gt;20&lt;/span&gt;).OrderBy(_&amp;nbsp;=&amp;gt;&amp;nbsp;rnd.Next()).Take(&lt;span style="color: rgb(128, 0, 128);"&gt;10&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;随机抽取十个&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;22&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;23&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt;&amp;nbsp;query&amp;nbsp;=&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;from&lt;/span&gt;&amp;nbsp;n&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;in&lt;/span&gt;&amp;nbsp;numbers&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;统计每种花色的张数&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;24&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;color&amp;nbsp;=&amp;nbsp;n&amp;nbsp;%&amp;nbsp;&lt;span style="color: rgb(128, 0, 128);"&gt;4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;25&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;value&amp;nbsp;=&amp;nbsp;n&amp;nbsp;/&amp;nbsp;&lt;span style="color: rgb(128, 0, 128);"&gt;4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;26&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;group&amp;nbsp;value&amp;nbsp;by&amp;nbsp;color&amp;nbsp;into&amp;nbsp;g&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;27&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;select&lt;/span&gt;&amp;nbsp;g.Count();&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;28&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;29&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt;&amp;nbsp;query.OrderBy(i&amp;nbsp;=&amp;gt;&amp;nbsp;i).Aggregate(&lt;span style="color: rgb(128, 0, 128);"&gt;0&lt;/span&gt;,&amp;nbsp;(value,&amp;nbsp;i)&amp;nbsp;=&amp;gt;&amp;nbsp;value&amp;nbsp;*&amp;nbsp;&lt;span style="color: rgb(128, 0, 128);"&gt;10&lt;/span&gt;&amp;nbsp;+&amp;nbsp;i);&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;30&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;31&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;该程序的输出结果如下：&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;{ Result = 2233, Count = 32.5512 }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;nbsp;{ Result = 1234, Count = 32.4215 }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;nbsp;{ Result = 1333, Count = 10.8416 }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;nbsp;{ Result = 2224, Count = 10.766 }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;nbsp;{ Result = 1225, Count = 3.2447 }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;nbsp;{ Result = 0334, Count = 3.2204 }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;nbsp;{ Result = 1144, Count = 2.0338 }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;nbsp;{ Result = 0244, Count = 1.6388 }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;nbsp;{ Result = 1135, Count = 1.6385 }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;nbsp;{ Result = 0235, Count = 1.3121 }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;nbsp;{ Result = 0145, Count = 0.3284 }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;nbsp;{ Result = 0055, Count = 0.003 }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;也就是说，3322和1234这两种组合将近占了65%，只要摆摊人把1333和2224这两种组合设置为比较小的奖项，基本上就稳赚不赔了，而最大奖0055，只有0.003%的概率，确实很难一见。&lt;/p&gt;&lt;p&gt;&lt;/p&gt; &#xD;
 &#xD;
 &#xD;
 &#xD;
&lt;img src="http://www.cnblogs.com/TianFang/aggbug/2340684.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TianFang/archive/2012/02/06/2340684.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TianFang/archive/2011/12/20/2294603.html</id><title type="text">通过NTP协议进行时间同步</title><summary type="text">最近发现手机的时间不是很准了，便到网上下了一个同步时间的小程序，简单了看了一下它的原理，是通过NTP协议来实现校时的，就顺便学习了一下NTP协议，用C#写了个简单的实现。NTP（Network Time Protocol，网络时间协议）是由RFC 1305定义的时间同步协议，用来在分布式时间服务器和客户端之间进行时间同步。</summary><published>2011-12-20T05:29:00Z</published><updated>2011-12-20T05:29:00Z</updated><author><name>天方</name><uri>http://www.cnblogs.com/TianFang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TianFang/archive/2011/12/20/2294603.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TianFang/archive/2011/12/20/2294603.html"/><content type="html">&lt;p&gt;最近发现手机的时间不是很准了，便到网上下了一个同步时间的小程序，简单了看了一下它的原理，是通过NTP协议来实现校时的，就顺便学习了一下NTP协议，用C#写了个简单的实现。&lt;/p&gt;&#xD;
&lt;p&gt;NTP（Network Time Protocol，网络时间协议）是由&lt;a href="http://www.faqs.org/rfcs/rfc1305.html"&gt;RFC 1305&lt;/a&gt;定义的时间同步协议，用来在分布式时间服务器和客户端之间进行时间同步。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;NTP工作原理&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;NTP&lt;span style="font-family: 宋体"&gt;的基本工作原理如下图&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;所示。&lt;/span&gt;Device A&lt;span style="font-family: 宋体"&gt;和&lt;/span&gt;Device B&lt;span style="font-family: 宋体"&gt;通过网络相连，它们都有自己独立的系统时钟，需要通过&lt;/span&gt;NTP&lt;span style="font-family: 宋体"&gt;实现各自系统时钟的自动同步。为便于理解，作如下假设：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: 宋体"&gt;在&lt;/span&gt;Device A&lt;span style="font-family: 宋体"&gt;和&lt;/span&gt;Device B&lt;span style="font-family: 宋体"&gt;的系统时钟同步之前，&lt;/span&gt;Device A&lt;span style="font-family: 宋体"&gt;的时钟设定为&lt;/span&gt;10:00:00am&lt;span style="font-family: 宋体"&gt;，&lt;/span&gt;Device B&lt;span style="font-family: 宋体"&gt;的时钟设定为&lt;/span&gt;11:00:00am&lt;span style="font-family: 宋体"&gt;。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Device B&lt;span style="font-family: 宋体"&gt;作为&lt;/span&gt;NTP&lt;span style="font-family: 宋体"&gt;时间服务器，即&lt;/span&gt;Device A&lt;span style="font-family: 宋体"&gt;将使自己的时钟与&lt;/span&gt;Device B&lt;span style="font-family: 宋体"&gt;的时钟同步。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;NTP&lt;span style="font-family: 宋体"&gt;报文在&lt;/span&gt;Device A&lt;span style="font-family: 宋体"&gt;和&lt;/span&gt;Device B&lt;span style="font-family: 宋体"&gt;之间单向传输所需要的时间为&lt;/span&gt;1&lt;span style="font-family: 宋体"&gt;秒。&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img border="0" alt="" src="http://www.h3c.com.cn/res/201104/25/20110425_1187306_image001_713515_30005_0.png" width="412" longdesc="" height="380" /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li&gt;Device A&lt;span style="font-family: 宋体"&gt;发送一个&lt;/span&gt;NTP&lt;span style="font-family: 宋体"&gt;报文给&lt;/span&gt;Device B&lt;span style="font-family: 宋体"&gt;，该报文带有它离开&lt;/span&gt;Device A&lt;span style="font-family: 宋体"&gt;时的时间戳，该时间戳为&lt;/span&gt;10:00:00am&lt;span style="font-family: 宋体"&gt;（&lt;/span&gt;T&lt;sub&gt;1&lt;/sub&gt;&lt;span style="font-family: 宋体"&gt;）。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: 宋体"&gt;当此&lt;/span&gt;NTP&lt;span style="font-family: 宋体"&gt;报文到达&lt;/span&gt;Device B&lt;span style="font-family: 宋体"&gt;时，&lt;/span&gt;Device B&lt;span style="font-family: 宋体"&gt;加上自己的时间戳，该时间戳为&lt;/span&gt;11:00:01am&lt;span style="font-family: 宋体"&gt;（&lt;/span&gt;T&lt;sub&gt;2&lt;/sub&gt;&lt;span style="font-family: 宋体"&gt;）。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: 宋体"&gt;当此&lt;/span&gt;NTP&lt;span style="font-family: 宋体"&gt;报文离开&lt;/span&gt;Device B&lt;span style="font-family: 宋体"&gt;时，&lt;/span&gt;Device B&lt;span style="font-family: 宋体"&gt;再加上自己的时间戳，该时间戳为&lt;/span&gt;11:00:02am&lt;span style="font-family: 宋体"&gt;（&lt;/span&gt;T&lt;sub&gt;3&lt;/sub&gt;&lt;span style="font-family: 宋体"&gt;）。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: 宋体"&gt;当&lt;/span&gt;Device A&lt;span style="font-family: 宋体"&gt;接收到该响应报文时，&lt;/span&gt;Device A&lt;span style="font-family: 宋体"&gt;的本地时间为&lt;/span&gt;10:00:03am&lt;span style="font-family: 宋体"&gt;（&lt;/span&gt;T&lt;sub&gt;4&lt;/sub&gt;&lt;span style="font-family: 宋体"&gt;）。&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;至此，&lt;/span&gt;Device A&lt;span style="font-family: 宋体"&gt;已经拥有足够的信息来计算两个重要的参数：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li&gt;NTP&lt;span style="font-family: 宋体"&gt;报文的往返时延&lt;/span&gt;Delay=&lt;span style="font-family: 宋体"&gt;（&lt;/span&gt;T&lt;sub&gt;4&lt;/sub&gt;-T&lt;sub&gt;1&lt;/sub&gt;&lt;span style="font-family: 宋体"&gt;）&lt;/span&gt;-&lt;span style="font-family: 宋体"&gt;（&lt;/span&gt;T&lt;sub&gt;3&lt;/sub&gt;-T&lt;sub&gt;2&lt;/sub&gt;&lt;span style="font-family: 宋体"&gt;）&lt;/span&gt;=2&lt;span style="font-family: 宋体"&gt;秒。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Device A&lt;span style="font-family: 宋体"&gt;相对&lt;/span&gt;Device B&lt;span style="font-family: 宋体"&gt;的时间差&lt;/span&gt;offset=&lt;span style="font-family: 宋体"&gt;（（&lt;/span&gt;T&lt;sub&gt;2&lt;/sub&gt;-T&lt;sub&gt;1&lt;/sub&gt;&lt;span style="font-family: 宋体"&gt;）&lt;/span&gt;+&lt;span style="font-family: 宋体"&gt;（&lt;/span&gt;T&lt;sub&gt;3&lt;/sub&gt;-T&lt;sub&gt;4&lt;/sub&gt;&lt;span style="font-family: 宋体"&gt;））&lt;/span&gt;/2=1&lt;span style="font-family: 宋体"&gt;小时。&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/span&gt;NTP的报文格式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;NTP有两种不同类型的报文，一种是时钟同步报文，另一种是控制报文（仅用于需要网络管理的场合，与本文无关，这里不做介绍）。&lt;/p&gt;&#xD;
&lt;p&gt;NTP基于UDP报文进行传输，使用的UDP端口号为123；时钟同步报文封装在UDP报文中，其格式如下图所示。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://www.h3c.com.cn/res/201104/25/20110425_1187308_image003_713515_30005_0.png" width="490" longdesc="" height="359" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;主要字段的解释如下：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li&gt;LI&lt;span style="font-family: 宋体"&gt;（&lt;/span&gt;Leap Indicator&lt;span style="font-family: 宋体"&gt;）：长度为&lt;/span&gt;2&lt;span style="font-family: 宋体"&gt;比特，值为&amp;#8220;&lt;/span&gt;11&lt;span style="font-family: 宋体"&gt;&amp;#8221;时表示告警状态，时钟未被同步。为其他值时&lt;/span&gt;NTP&lt;span style="font-family: 宋体"&gt;本身不做处理。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;VN&lt;span style="font-family: 宋体"&gt;（&lt;/span&gt;Version Number&lt;span style="font-family: 宋体"&gt;）：长度为&lt;/span&gt;3&lt;span style="font-family: 宋体"&gt;比特，表示&lt;/span&gt;NTP&lt;span style="font-family: 宋体"&gt;的版本号，目前的最新版本为&lt;/span&gt;3&lt;span style="font-family: 宋体"&gt;。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Mode&lt;span style="font-family: 宋体"&gt;：长度为&lt;/span&gt;3&lt;span style="font-family: 宋体"&gt;比特，表示&lt;/span&gt;NTP&lt;span style="font-family: 宋体"&gt;的工作模式。不同的值所表示的含义分别是：&lt;/span&gt;0&lt;span style="font-family: 宋体"&gt;未定义、&lt;/span&gt;1&lt;span style="font-family: 宋体"&gt;表示主动对等体模式、&lt;/span&gt;2&lt;span style="font-family: 宋体"&gt;表示被动对等体模式、&lt;/span&gt;3&lt;span style="font-family: 宋体"&gt;表示客户模式、&lt;/span&gt;4&lt;span style="font-family: 宋体"&gt;表示服务器模式、&lt;/span&gt;5&lt;span style="font-family: 宋体"&gt;表示广播模式或组播模式、&lt;/span&gt;6&lt;span style="font-family: 宋体"&gt;表示此报文为&lt;/span&gt;NTP&lt;span style="font-family: 宋体"&gt;控制报文、&lt;/span&gt;7&lt;span style="font-family: 宋体"&gt;预留给内部使用。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Stratum&lt;span style="font-family: 宋体"&gt;：系统时钟的层数，取值范围为&lt;/span&gt;1&lt;span style="font-family: 宋体"&gt;～&lt;/span&gt;16&lt;span style="font-family: 宋体"&gt;，它定义了时钟的准确度。层数为&lt;/span&gt;1&lt;span style="font-family: 宋体"&gt;的时钟准确度最高，准确度从&lt;/span&gt;1&lt;span style="font-family: 宋体"&gt;到&lt;/span&gt;16&lt;span style="font-family: 宋体"&gt;依次递减，层数为&lt;/span&gt;16&lt;span style="font-family: 宋体"&gt;的时钟处于未同步状态，不能作为参考时钟。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Poll&lt;span style="font-family: 宋体"&gt;：轮询时间，即两个连续&lt;/span&gt;NTP&lt;span style="font-family: 宋体"&gt;报文之间的时间间隔。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Precision&lt;span style="font-family: 宋体"&gt;：系统时钟的精度。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Root Delay&lt;span style="font-family: 宋体"&gt;：本地到主参考时钟源的往返时间。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Root Dispersion&lt;span style="font-family: 宋体"&gt;：系统时钟相对于主参考时钟的最大误差。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Reference Identifier&lt;span style="font-family: 宋体"&gt;：参考时钟源的标识。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Reference Timestamp&lt;span style="font-family: 宋体"&gt;：系统时钟最后一次被设定或更新的时间。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Originate Timestamp&lt;span style="font-family: 宋体"&gt;：&lt;/span&gt;NTP&lt;span style="font-family: 宋体"&gt;请求报文离开发送端时发送端的本地时间。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Receive Timestamp&lt;span style="font-family: 宋体"&gt;：&lt;/span&gt;NTP&lt;span style="font-family: 宋体"&gt;请求报文到达接收端时接收端的本地时间。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Transmit Timestamp&lt;span style="font-family: 宋体"&gt;：应答报文离开应答者时应答者的本地时间。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Authenticator&lt;span style="font-family: 宋体"&gt;：验证信息。&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;NTP时间同步的实现&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;有了上述基础知识后，我们就可以实现自己的时间同步工具了，下文附了一个简单的C#的实现。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NptClient&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IPAddress&lt;/span&gt; ntpServer;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; NptClient(&lt;span style="color: #2b91af"&gt;IPAddress&lt;/span&gt; ntpServer)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt;.ntpServer = ntpServer;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt; GetServerTime()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; startTime = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; ntpTime = &lt;span style="color: #2b91af"&gt;NTPData&lt;/span&gt;.Test(ntpServer);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; recvTime = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; offset = ((ntpTime.ReceiveTimestamp - startTime) + (ntpTime.TransmitTimestamp - recvTime));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;offset = offset.Subtract(&lt;span style="color: #2b91af"&gt;TimeSpan&lt;/span&gt;.FromSeconds(offset.TotalSeconds / 2));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; recvTime + offset;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[&lt;span style="color: #2b91af"&gt;StructLayout&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;LayoutKind&lt;/span&gt;.Sequential)]&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NTPData&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;byte&lt;/span&gt; header = 0;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;byte&lt;/span&gt; Stratum = 1;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas"&gt;系统时钟的层数，取值范围为&lt;/span&gt;&lt;span style="font-family: Consolas; color: green; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;1&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas"&gt;～&lt;/span&gt;&lt;span style="font-family: Consolas; color: green; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;16&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas"&gt;，它定义了时钟的准确度&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;byte&lt;/span&gt; Poll = 1;&lt;span style="mso-tab-count: 4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas"&gt;轮询时间，即两个连续&lt;/span&gt;&lt;span style="font-family: Consolas; color: green; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;NTP&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas"&gt;报文之间的时间间隔&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;byte&lt;/span&gt; Precision = 1;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas"&gt;系统时钟的精度&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BigEndianUInt32&lt;/span&gt; rootDelay;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BigEndianUInt32&lt;/span&gt; referenceIdentifier;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BigEndianUInt32&lt;/span&gt; ReferenceIdentifier;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NtpTime&lt;/span&gt; ReferenceTimestamp { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NtpTime&lt;/span&gt; OriginateTimestamp { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NtpTime&lt;/span&gt; ReceiveTimestamp { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NtpTime&lt;/span&gt; TransmitTimestamp { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; NTPData()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt;.header = GetHeader();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;byte&lt;/span&gt; GetHeader()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; LI = &lt;span style="color: #a31515"&gt;"00"&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; VN = &lt;span style="color: #a31515"&gt;"011"&lt;/span&gt;;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;//NTP&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas"&gt;的版本号为&lt;/span&gt;&lt;span style="font-family: Consolas; color: green; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;3&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; Mode = &lt;span style="color: #a31515"&gt;"011"&lt;/span&gt;;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas"&gt;客户模式&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Convert&lt;/span&gt;.ToByte(LI + VN + Mode, 2);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NTPData&lt;/span&gt; Test(&lt;span style="color: #2b91af"&gt;IPAddress&lt;/span&gt; ntpServer)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; data = &lt;span style="color: #2b91af"&gt;MarshalExtend&lt;/span&gt;.GetData(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NTPData&lt;/span&gt;());&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; udp = &lt;span style="color: blue"&gt;new&lt;/span&gt; System.Net.Sockets.&lt;span style="color: #2b91af"&gt;UdpClient&lt;/span&gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;udp.Send(data, data.Length, &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IPEndPoint&lt;/span&gt;(ntpServer, 123));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; ep = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IPEndPoint&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;IPAddress&lt;/span&gt;.Any, 0);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; replyData = udp.Receive(&lt;span style="color: blue"&gt;ref&lt;/span&gt; ep);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MarshalExtend&lt;/span&gt;.GetStruct&amp;lt;&lt;span style="color: #2b91af"&gt;NTPData&lt;/span&gt;&amp;gt;(replyData, replyData.Length);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[&lt;span style="color: #2b91af"&gt;StructLayout&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;LayoutKind&lt;/span&gt;.Sequential)]&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NtpTime&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BigEndianUInt32&lt;/span&gt; seconds;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BigEndianUInt32&lt;/span&gt; fraction;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt; baseTime = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;(1900, 1, 1, 0, 0, 0, &lt;span style="color: #2b91af"&gt;DateTimeKind&lt;/span&gt;.Utc);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;implicit&lt;/span&gt; &lt;span style="color: blue"&gt;operator&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;NtpTime&lt;/span&gt; time) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;/* rfc1305&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas"&gt;的&lt;/span&gt;&lt;span style="font-family: Consolas; color: green; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;ntp&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas"&gt;时间中，时间是用&lt;/span&gt;&lt;span style="font-family: Consolas; color: green; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;64bit&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas"&gt;来表示的，&lt;/span&gt;&lt;span style="font-family: Consolas; color: green; font-size: 9.5pt; mso-font-kerning: 0pt"&gt; &lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas"&gt;记录的是&lt;/span&gt;&lt;span style="font-family: Consolas; color: green; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;1900&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas"&gt;年后的秒数（&lt;/span&gt;&lt;span style="font-family: Consolas; color: green; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;utc&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas"&gt;格式）&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; color: green; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;* &lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas"&gt;高&lt;/span&gt;&lt;span style="font-family: Consolas; color: green; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;32&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas"&gt;位是整数部分，低&lt;/span&gt;&lt;span style="font-family: Consolas; color: green; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;32&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas"&gt;位是小数部分&lt;/span&gt;&lt;span style="font-family: Consolas; color: green; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt; */&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; milliseconds = (&lt;span style="color: blue"&gt;int&lt;/span&gt;)(((&lt;span style="color: blue"&gt;double&lt;/span&gt;)time.fraction / &lt;span style="color: blue"&gt;uint&lt;/span&gt;.MaxValue) * 1000);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; baseTime.AddSeconds(time.seconds).AddMilliseconds(milliseconds).ToLocalTime();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; ToString()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; ((&lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;)&lt;span style="color: blue"&gt;this&lt;/span&gt;).ToString(&lt;span style="color: #a31515"&gt;"o"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt" &gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;当然，我这里只是在造重复轮子，网上是有不少功能完整的开源项目的。另外，如果对SNTPv4（&lt;a href="http://www.faqs.org/rfcs/rfc2030.html"&gt;RFC 2030&lt;/a&gt;）感兴趣的，可以参考一下这个页面上的实现&amp;#8212;&amp;#8212;&lt;a href="http://dotnet-snippets.com/dns/simple-network-time-ntp-protocol-client-SID571.aspx"&gt;Simple Network Time (NTP) Protocol Client&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;最后，附上几个可以使用（不保证，具体能用否还得看电信和方校长的心情）的NTP服务器：&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;133.100.11.8 prefer&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;&lt;/span&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;210.72.145.44&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;&lt;/span&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;203.117.180.36&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;&lt;/span&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;131.107.1.10&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;&lt;/span&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;time.asia.apple.com&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;&lt;/span&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;64.236.96.53&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;&lt;/span&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;130.149.17.21&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;&lt;/span&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;66.92.68.246&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;&lt;/span&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;18.145.0.30&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;&lt;/span&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;clock.via.net&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;&lt;/span&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;137.92.140.80&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;&lt;/span&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;133.100.9.2&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;&lt;/span&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;128.118.46.3&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;&lt;/span&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;ntp.nasa.gov&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;&lt;/span&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;129.7.1.66ntp-sop.inria.frserver &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;210.72.145.44(中国国家授时中心服务器IP地址)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;&lt;/span&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;ntp.sjtu.edu.cn (上海交通大学网络中心NTP服务器地址）&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #808000; font-size: 10pt"&gt;202.120.2.101 (上海交通大学网络中心NTP服务器地址）&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TianFang/aggbug/2294603.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TianFang/archive/2011/12/20/2294603.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TianFang/archive/2011/10/30/2229562.html</id><title type="text">猜数字的算法的一个简单实现</title><summary type="text">猜数字的算法的一个简单实现，用的最简单的算法，权当编程练习。1classGuessNumber2{3publicstaticIEnumerable&amp;lt;int&amp;gt;Guess(Func&amp;lt;int,int&amp;gt;testHanlder)4{5varvalidNumers=Enumerable.Range(1,9);//有效数字范围为1-96varcandicateNum=fromn1invalidNumers7fromn2invalidNumers8fromn3invalidNumers9fromn4invalidNumers10wherenewint[]{n1,n2,n3,n4}.Di</summary><published>2011-10-30T13:25:00Z</published><updated>2011-10-30T13:25:00Z</updated><author><name>天方</name><uri>http://www.cnblogs.com/TianFang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TianFang/archive/2011/10/30/2229562.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TianFang/archive/2011/10/30/2229562.html"/><content type="html">&lt;p&gt;猜数字的算法的一个简单实现，用的最简单的算法，权当编程练习。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;GuessNumber&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&amp;nbsp;IEnumerable&amp;lt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;gt;&amp;nbsp;Guess(Func&amp;lt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;gt;&amp;nbsp;testHanlder)&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;validNumers&amp;nbsp;=&amp;nbsp;Enumerable.Range(&lt;span style="color: #800080"&gt;1&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080"&gt;9&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;有效数字范围为1-9&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;candicateNum&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;from&lt;/span&gt;&amp;nbsp;n1&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;validNumers&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;from&lt;/span&gt;&amp;nbsp;n2&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;validNumers&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;from&lt;/span&gt;&amp;nbsp;n3&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;validNumers&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;from&lt;/span&gt;&amp;nbsp;n4&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;validNumers&lt;br /&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;where&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;[]&amp;nbsp;{&amp;nbsp;n1,&amp;nbsp;n2,&amp;nbsp;n3,&amp;nbsp;n4&amp;nbsp;}.Distinct().Count()&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800080"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: #008080"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&amp;nbsp;n1&amp;nbsp;*&amp;nbsp;&lt;span style="color: #800080"&gt;1000&lt;/span&gt;&amp;nbsp;+&amp;nbsp;n2&amp;nbsp;*&amp;nbsp;&lt;span style="color: #800080"&gt;100&lt;/span&gt;&amp;nbsp;+&amp;nbsp;n3&amp;nbsp;*&amp;nbsp;&lt;span style="color: #800080"&gt;10&lt;/span&gt;&amp;nbsp;+&amp;nbsp;n4;&lt;br /&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;while&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;num&amp;nbsp;=&amp;nbsp;candicateNum.First();&lt;br /&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;yield&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;num;&lt;br /&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;testHanlder(num);&lt;br /&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(result&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800080"&gt;40&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;yield&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;candicateNum&amp;nbsp;=&amp;nbsp;candicateNum.Where(i&amp;nbsp;=&amp;gt;&amp;nbsp;Test(i,&amp;nbsp;num)&amp;nbsp;==&amp;nbsp;result);&lt;br /&gt;&lt;span style="color: #008080"&gt;23&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;25&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;26&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&amp;nbsp;IEnumerable&amp;lt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;gt;&amp;nbsp;Guess(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;num)&lt;br /&gt;&lt;span style="color: #008080"&gt;27&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;28&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;Guess(i&amp;nbsp;=&amp;gt;&amp;nbsp;Test(i,&amp;nbsp;num));&lt;br /&gt;&lt;span style="color: #008080"&gt;29&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;30&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;31&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;为了简单返回值为int型，如2A1B则返回21&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;32&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;Test(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;num1,&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;num2)&lt;br /&gt;&lt;span style="color: #008080"&gt;33&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;34&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;value1&amp;nbsp;=&amp;nbsp;num1.ToString(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;0000&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080"&gt;35&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;value2&amp;nbsp;=&amp;nbsp;num2.ToString(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;0000&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080"&gt;36&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;37&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Contract.Assume((value1.Length&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800080"&gt;4&lt;/span&gt;)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;(value2.Length&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800080"&gt;4&lt;/span&gt;));&lt;br /&gt;&lt;span style="color: #008080"&gt;38&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;39&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;query&amp;nbsp;=&amp;nbsp;value1.Zip(value2,&amp;nbsp;(ch1,&amp;nbsp;ch2)&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;40&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;41&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MatchA&amp;nbsp;=&amp;nbsp;(ch1&amp;nbsp;==&amp;nbsp;ch2),&lt;br /&gt;&lt;span style="color: #008080"&gt;42&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MatchB&amp;nbsp;=&amp;nbsp;(ch1&amp;nbsp;!=&amp;nbsp;ch2)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;(value1.Contains(ch2))&lt;br /&gt;&lt;span style="color: #008080"&gt;43&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}).ToArray();&lt;br /&gt;&lt;span style="color: #008080"&gt;44&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;45&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;aCount&amp;nbsp;=&amp;nbsp;query.Count(i&amp;nbsp;=&amp;gt;&amp;nbsp;i.MatchA);&lt;br /&gt;&lt;span style="color: #008080"&gt;46&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;bCount&amp;nbsp;=&amp;nbsp;query.Count(i&amp;nbsp;=&amp;gt;&amp;nbsp;i.MatchB);&lt;br /&gt;&lt;span style="color: #008080"&gt;47&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;48&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;aCount&amp;nbsp;*&amp;nbsp;&lt;span style="color: #800080"&gt;10&lt;/span&gt;&amp;nbsp;+&amp;nbsp;bCount;&lt;br /&gt;&lt;span style="color: #008080"&gt;49&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080"&gt;50&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TianFang/aggbug/2229562.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TianFang/archive/2011/10/30/2229562.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TianFang/archive/2011/10/05/2199526.html</id><title type="text">一种简单的可控并发粒度的TaskScheduler的实现</title><summary type="text">当我们使用.net 4.0中的任务并行库的时候，有时候我们是需要自己控制并发粒度（调度线程数）的，这个时候往往就需要我们自己写TaskScheduler了，一个简单的实现如下：View Code publicsealedclassSimpleTaskScheduler:TaskScheduler,IDisposable{BlockingCollection&amp;lt;Task&amp;gt;_tasks=newBlockingCollection&amp;lt;Task&amp;gt;();List&amp;lt;Thread&amp;gt;_threads=newList&amp;lt;Thread&amp;gt;();publicSimpleTas</summary><published>2011-10-05T10:47:00Z</published><updated>2011-10-05T10:47:00Z</updated><author><name>天方</name><uri>http://www.cnblogs.com/TianFang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TianFang/archive/2011/10/05/2199526.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TianFang/archive/2011/10/05/2199526.html"/><content type="html">&lt;p&gt;&lt;span style="font-family: 宋体"&gt;当我们使用&lt;/span&gt;.net 4.0&lt;span style="font-family: 宋体"&gt;中的任务并行库的时候，有时候我们是需要自己控制并发粒度（调度线程数）的，这个时候往往就需要我们自己写&lt;/span&gt;TaskScheduler&lt;span style="font-family: 宋体"&gt;了，一个简单的实现如下：&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&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('f68156c8-8e2c-47f9-8d95-ee6fe4612e8c')"&gt;&lt;img style="display: none" id="code_img_opened_f68156c8-8e2c-47f9-8d95-ee6fe4612e8c"  onclick="cnblogs_code_hide('f68156c8-8e2c-47f9-8d95-ee6fe4612e8c',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_f68156c8-8e2c-47f9-8d95-ee6fe4612e8c" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;sealed&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;SimpleTaskScheduler&amp;nbsp;:&amp;nbsp;TaskScheduler,&amp;nbsp;IDisposable&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BlockingCollection&amp;lt;Task&amp;gt;&amp;nbsp;_tasks&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;BlockingCollection&amp;lt;Task&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;Thread&amp;gt;&amp;nbsp;_threads&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;List&amp;lt;Thread&amp;gt;();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;SimpleTaskScheduler(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;initNumberOfThreads&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080"&gt;3&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(initNumberOfThreads&amp;nbsp;&amp;lt;&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;ArgumentOutOfRangeException();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_threads.AddRange(Enumerable.Range(&lt;span style="color: #800080"&gt;0&lt;/span&gt;,&amp;nbsp;initNumberOfThreads).Select(_&amp;nbsp;=&amp;gt;&amp;nbsp;CreateThread()));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread&amp;nbsp;CreateThread()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;thread&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;Thread(()&amp;nbsp;=&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&amp;nbsp;(var&amp;nbsp;t&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;_tasks.GetConsumingEnumerable())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TryExecuteTask(t);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;thread.IsBackground&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;thread.Start();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;thread;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&amp;nbsp;IEnumerable&amp;lt;Task&amp;gt;&amp;nbsp;GetScheduledTasks()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;这个函数好像没有调过，返回null也不影响功能&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;_tasks.ToArray();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;QueueTask(Task&amp;nbsp;task)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_tasks.Add(task);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;nbsp;TryExecuteTaskInline(Task&amp;nbsp;task,&amp;nbsp;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;nbsp;taskWasPreviouslyQueued)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;TryExecuteTask(task);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;MaximumConcurrencyLevel&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;_threads.Count;&amp;nbsp;}&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;#region&lt;/span&gt;&amp;nbsp;IDisposable&amp;nbsp;成员&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;Dispose()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(_tasks&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_tasks.CompleteAdding();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_threads.ForEach(t&amp;nbsp;=&amp;gt;&amp;nbsp;t.Join());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_tasks.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_tasks&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;#endregion&lt;/span&gt;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;这个类实现并不复杂，但其实用得还是比较多的，这里记录一下，以备后续查询。&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span lang="EN-US"&gt;&lt;font face="Calibri"&gt;PS&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;：当前在&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Calibri"&gt;Parallel.ForEach&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;或&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Calibri"&gt;Parallel.For&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;等数据并发函数中可以通过&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Calibri"&gt;ParallelOptions.MaxDegreeOfParallelism&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;来控制并发粒度，但无法控制调度顺序。也可以通过类似这样的&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Calibri"&gt;TaskScheduler&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;来改变调度顺序。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt" &gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TianFang/aggbug/2199526.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TianFang/archive/2011/10/05/2199526.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TianFang/archive/2011/09/25/2190250.html</id><title type="text">在WPF的WebBrowser控件中抑制脚本错误</title><summary type="text">今天用WPF的WebBrowser控件的时候，发现其竟然没有ScriptErrorsSuppressed属性，导致其到处乱弹脚本错误的对话框，在MSDN上找到了如下解决方案：1staticvoidSuppressScriptErrors(WebBrowserwebBrowser,boolhide)2{3webBrowser.Navigating+=(s,e)=&amp;gt;4{5varfiComWebBrowser=typeof(WebBrowser).GetField(&amp;quot;_axIWebBrowser2&amp;quot;,System.Reflection.BindingFlags.Instan</summary><published>2011-09-25T07:02:00Z</published><updated>2011-09-25T07:02:00Z</updated><author><name>天方</name><uri>http://www.cnblogs.com/TianFang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TianFang/archive/2011/09/25/2190250.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TianFang/archive/2011/09/25/2190250.html"/><content type="html">&lt;p&gt;今天用WPF的WebBrowser控件的时候，发现其竟然没有ScriptErrorsSuppressed属性，导致其到处乱弹脚本错误的对话框，在MSDN上找到了如下&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/4f686de1-8884-4a8d-8ec5-ae4eff8ce6db/"&gt;解决方案&lt;/a&gt;：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;SuppressScriptErrors(WebBrowser&amp;nbsp;webBrowser,&amp;nbsp;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;nbsp;hide)&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;webBrowser.Navigating&amp;nbsp;+=&amp;nbsp;(s,&amp;nbsp;e)&amp;nbsp;=&amp;gt;&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;fiComWebBrowser&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(WebBrowser).GetField(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;_axIWebBrowser2&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;System.Reflection.BindingFlags.Instance&amp;nbsp;|&amp;nbsp;System.Reflection.BindingFlags.NonPublic);&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(fiComWebBrowser&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;nbsp;objComWebBrowser&amp;nbsp;=&amp;nbsp;fiComWebBrowser.GetValue(webBrowser);&lt;br /&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(objComWebBrowser&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;objComWebBrowser.GetType().InvokeMember(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Silent&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;System.Reflection.BindingFlags.SetProperty,&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;,&amp;nbsp;objComWebBrowser,&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;[]&amp;nbsp;{&amp;nbsp;hide&amp;nbsp;});&lt;br /&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TianFang/aggbug/2190250.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TianFang/archive/2011/09/25/2190250.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TianFang/archive/2011/09/18/2180741.html</id><title type="text">解决HttpWebRequest首次连接特别慢的问题</title><summary type="text">今天把我以前做的一个程序升级到了.NET 4.0的版本，里面有一段通过HttpWebRequest获取html的代码，第一次运行特别慢，后续运行就快了。在网上搜了一下，在http://blog.csdn.net/rrrfff/article/details/6170653中找到了原因：.NET4.0中的默认代理是开启的,使用默认代理时，只有等待超时后才会绕过代理,从而导致第一次连接特别慢。（不知道微软为什么要把这个打开）该文章中也提到了解决方案，一般有两种：1. 在配置文件中(.config)中添加相应配置，关闭默认代理：1&amp;lt;?xmlversion=&amp;quot;1.0&amp;quot;?&amp;gt</summary><published>2011-09-18T14:41:00Z</published><updated>2011-09-18T14:41:00Z</updated><author><name>天方</name><uri>http://www.cnblogs.com/TianFang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TianFang/archive/2011/09/18/2180741.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TianFang/archive/2011/09/18/2180741.html"/><content type="html">&lt;p&gt;今天把我以前做的一个程序升级到了.NET 4.0的版本，里面有一段通过HttpWebRequest获取html的代码，第一次运行特别慢，后续运行就快了。在网上搜了一下，在&lt;a href="http://blog.csdn.net/rrrfff/article/details/6170653"&gt;http://blog.csdn.net/rrrfff/article/details/6170653&lt;/a&gt;中找到了原因：.NET4.0中的默认代理是开启的,使用默认代理时，只有等待超时后才会绕过代理,从而导致第一次连接特别慢。（不知道微软为什么要把这个打开）&lt;/p&gt;&#xD;
&lt;p&gt;该文章中也提到了解决方案，一般有两种：&lt;/p&gt;&#xD;
&lt;p&gt;1. 在配置文件中(.config)中添加相应配置，关闭默认代理：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;xml&amp;nbsp;version="1.0"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;startup&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;supportedRuntime&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="v4.0"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;sku&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=".NETFramework,Version=v4.0"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;startup&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;system.net&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;defaultProxy&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;enabled&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="false"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff0000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;useDefaultCredentials&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="false"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;proxy&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;bypasslist&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;module&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;defaultProxy&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;system.net&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2. 通过编码的方式手动关闭Proxy。&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;req&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;WebRequest.Create(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;http://www.google.com&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&amp;nbsp;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;req.Proxy&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TianFang/aggbug/2180741.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TianFang/archive/2011/09/18/2180741.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TianFang/archive/2011/09/17/2179739.html</id><title type="text">Visual Studio 11 开发者预览版可以下载了</title><summary type="text">Visual Studio 11 开发者预览版可以下载了，下载地址为：点击下载，提供的是旗舰版，目前支持中文和日文。在虚拟机里装上去试了一下，界面上有少许微调，.net版本是4.5，新增特性比较少，除了支持async关键字外，没有什么太大亮点，而async前在visual studio 2010中也是能支持的。至于metro界面程序，官方说是支持的，但我却没有找到相关的工程模板，不知是否得在win8里面安装才有这个功能。详细信息在在MSDN上也有专栏介绍——Visual Studio 11 Developer Preview。感兴趣的可以看一下。总之这个版本没有什么大的亮点，感觉这个不是下一代</summary><published>2011-09-17T09:51:00Z</published><updated>2011-09-17T09:51:00Z</updated><author><name>天方</name><uri>http://www.cnblogs.com/TianFang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TianFang/archive/2011/09/17/2179739.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TianFang/archive/2011/09/17/2179739.html"/><content type="html">&lt;p&gt;Visual Studio 11 开发者预览版可以下载了，下载地址为：&lt;a href="http://www.microsoft.com/download/en/details.aspx?id=27535"&gt;点击下载&lt;/a&gt;，提供的是旗舰版，目前支持中文和日文。&lt;/p&gt;&#xD;
&lt;p&gt;在虚拟机里装上去试了一下，界面上有少许微调，.net版本是4.5，新增特性比较少，除了支持async关键字外，没有什么太大亮点，而async前在visual studio 2010中也是能支持的。&lt;/p&gt;&#xD;
&lt;p&gt;至于metro界面程序，官方说是支持的，但我却没有找到相关的工程模板，不知是否得在win8里面安装才有这个功能。详细信息在在MSDN上也有专栏介绍&amp;#8212;&amp;#8212;&lt;a href="http://msdn.microsoft.com/en-us/vstudio/hh127353"&gt;Visual Studio 11 Developer Preview&lt;/a&gt;。感兴趣的可以看一下。&lt;/p&gt;&#xD;
&lt;p&gt;总之这个版本没有什么大的亮点，感觉这个不是下一代的visual studio，而仅仅是为了支持win8的加强版本。自.net问世后，每次发布visual studio就会升级一次.net大版本，下一代visual studio应该会包含的.net 5.0吧，如果是这个版本的话卖点太少。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TianFang/aggbug/2179739.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TianFang/archive/2011/09/17/2179739.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TianFang/archive/2011/09/16/2179205.html</id><title type="text">一种在C#中实现类似多重继承功能的方法</title><summary type="text">在面向对象语言中，我们往往通过继承来实现代码的复用，下面代码就演示了一个简单的Log功能的例子： class Logger&amp;lt;T&amp;gt; { Subject&amp;lt;T&amp;gt; subject = new Subject&amp;lt;T&amp;gt;(); public void LogMessage(T msg) { subject.OnNext(msg); } public void Subscribe(Action&amp;lt;T&amp;gt; msgHanlder) { subject.Subscribe(msgHanlder); } } class MyClass1:Logger&amp;lt;string&amp;gt</summary><published>2011-09-16T12:42:00Z</published><updated>2011-09-16T12:42:00Z</updated><author><name>天方</name><uri>http://www.cnblogs.com/TianFang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TianFang/archive/2011/09/16/2179205.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TianFang/archive/2011/09/16/2179205.html"/><content type="html">&lt;p&gt;在面向对象语言中，我们往往通过继承来实现代码的复用，下面代码就演示了一个简单的Log功能的例子：&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Logger&lt;/span&gt;&amp;lt;T&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Subject&lt;/span&gt;&amp;lt;T&amp;gt; subject = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Subject&lt;/span&gt;&amp;lt;T&amp;gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; LogMessage(T msg)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;subject.OnNext(msg);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Subscribe(&lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;T&amp;gt; msgHanlder)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;subject.Subscribe(msgHanlder);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MyClass1&lt;/span&gt;:&lt;span style="color: #2b91af"&gt;Logger&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MyClass2&lt;/span&gt;:&lt;span style="color: #2b91af"&gt;Logger&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;然而，Log功能一般只是一种附加功能，在实际应用中，我们的子类往往需要从别的更复杂的类中继承而来，但此时如果要服用Log功能该怎么办呢？对于C++这种支持多重继承的语言来说，直接将Logger作为另一个父类即可附加该功能。然而，对于C#这种只支持单一父类的语言来说，一般只能采用组合的方式来复用Log功能了，基本方式如下：&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MyClass1&lt;/span&gt; : Base1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Logger&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; logger = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Logger&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; LogMessage(&lt;span style="color: blue"&gt;string&lt;/span&gt; msg)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;logger.LogMessage(msg);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Subscribe(&lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; msgHanlder)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;logger.Subscribe(msgHanlder);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MyClass2&lt;/span&gt; : Base2&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Logger&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; logger = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Logger&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; LogMessage(&lt;span style="color: blue"&gt;string&lt;/span&gt; msg)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;logger.LogMessage(msg);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Subscribe(&lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; msgHanlder)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;logger.Subscribe(msgHanlder);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这种方法带来的一个不好的地方在于：每一个子类都必须封装一遍LogMessage和Subscribe方法。如果子类较多，代码非常难看。好在C# 3.0带来了扩展属性的方法，通过它，则可以很容易类似C++之类的多重继承的功能。&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ILogger&lt;/span&gt;&amp;lt;T&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MyClass1&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;ILogger&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MyClass2&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;ILogger&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;LoggerExtend&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Subject&lt;/span&gt;&amp;lt;T&amp;gt; GetLoggerInfo&amp;lt;T&amp;gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ILogger&lt;/span&gt;&amp;lt;T&amp;gt; logger)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NotImplementedException&lt;/span&gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; LogMessage&amp;lt;T&amp;gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ILogger&lt;/span&gt;&amp;lt;T&amp;gt; logger, T msg)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;logger.GetLoggerInfo().OnNext(msg);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Subscribe&amp;lt;T&amp;gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ILogger&lt;/span&gt;&amp;lt;T&amp;gt; logger, &lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;T&amp;gt; msgHanlder)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;logger.GetLoggerInfo().Subscribe(msgHanlder);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt" &gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;这种模式就很完美的解决了这一问题，子类只要实现&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Calibri"&gt;ILogger&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;这一接口，无需写任何代码，就拥有了&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Calibri"&gt;Log&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;功能。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 11.0pt; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;但是，上面的方法还不能运行，最关键的&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US"&gt;GetLoggerInfo&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 11.0pt; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;方法还没有实现，最直接的实现方法如下：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;object&lt;/span&gt;, &lt;span style="color: blue"&gt;object&lt;/span&gt;&amp;gt; dic = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;object&lt;/span&gt;, &lt;span style="color: blue"&gt;object&lt;/span&gt;&amp;gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Subject&lt;/span&gt;&amp;lt;T&amp;gt; GetLoggerInfo&amp;lt;T&amp;gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ILogger&lt;/span&gt;&amp;lt;T&amp;gt; logger)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt; subject = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (!dic.TryGetValue(logger, &lt;span style="color: blue"&gt;out&lt;/span&gt; subject))&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;subject = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Subject&lt;/span&gt;&amp;lt;T&amp;gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;dic.Add(logger, subject);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; subject &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Subject&lt;/span&gt;&amp;lt;T&amp;gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这样处理后，虽然代码功能看起来正常了，然而却存在一个非常大的隐患&amp;#8212;&amp;#8212;logger无法释放：一旦logger使用后，在静态变量dic中就一直保存着该对象的引用，这样就永远无法释放。为了解决这一问题，我们必须将这个方法改一下，改成使用弱引用来维护logger引用，当logger释放后，其关联的subject对象也跟着一起释放。修改后的代码如下：&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;LoggerExtend&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;WeakObject&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;WeakReference&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;object&lt;/span&gt; Tag { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; WeakObject(&lt;span style="color: blue"&gt;object&lt;/span&gt; target,&lt;span style="color: blue"&gt;object&lt;/span&gt; tag)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;: &lt;span style="color: blue"&gt;base&lt;/span&gt;(target)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt;.Tag = tag;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;WeakObject&lt;/span&gt;&amp;gt; dic = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;WeakObject&lt;/span&gt;&amp;gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Timer&lt;/span&gt; gcTimer = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Subject&lt;/span&gt;&amp;lt;T&amp;gt; GetLoggerInfo&amp;lt;T&amp;gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ILogger&lt;/span&gt;&amp;lt;T&amp;gt; logger)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;lock&lt;/span&gt; (dic)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; key = logger.GetHashCode();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WeakObject&lt;/span&gt; weakobj = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (!dic.TryGetValue(key, &lt;span style="color: blue"&gt;out&lt;/span&gt; weakobj))&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; subject = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Subject&lt;/span&gt;&amp;lt;T&amp;gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;weakobj = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;WeakObject&lt;/span&gt;(logger, subject);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;dic.Add(key, weakobj);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"add "&lt;/span&gt;+key);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (gcTimer == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 6"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;gcTimer = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Timer&lt;/span&gt;(_ =&amp;gt; GcWeakObject(), &lt;span style="color: blue"&gt;null&lt;/span&gt;, 0, 10000);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; weakobj.Tag &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Subject&lt;/span&gt;&amp;lt;T&amp;gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; GcWeakObject()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;lock&lt;/span&gt; (dic)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; deadObj = dic.Where(i =&amp;gt; !i.Value.IsAlive).ToArray();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; item &lt;span style="color: blue"&gt;in&lt;/span&gt; deadObj)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (item.Value.Tag &lt;span style="color: blue"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IDisposable&lt;/span&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 6"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(item.Value.Tag &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IDisposable&lt;/span&gt;).Dispose();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;dic.Remove(item.Key);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (dic.Count == 0 &amp;amp;&amp;amp; gcTimer != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;gcTimer.Dispose();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;gcTimer = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; LogMessage&amp;lt;T&amp;gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ILogger&lt;/span&gt;&amp;lt;T&amp;gt; logger, T msg)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;logger.GetLoggerInfo().OnNext(msg);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Subscribe&amp;lt;T&amp;gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ILogger&lt;/span&gt;&amp;lt;T&amp;gt; logger, &lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;T&amp;gt; msgHanlder)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;logger.GetLoggerInfo().Subscribe(msgHanlder);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最后总结一下吧，本文通过C#的扩展方法和弱引用，简单的实现了一个类似C++多重继承的功能，方便那种在大量地方使用的小功能的扩展。当然，这里的解决方案也不完美，一个很明显的问题就是扩展功能对象无法及时回收，需要等到计时器超时，也不支持手动Dispose。这种方式还是比较容易扩展的，我在这里只是抛砖引玉，如果谁有更好的方法，欢迎一起讨论。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TianFang/aggbug/2179205.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TianFang/archive/2011/09/16/2179205.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TianFang/archive/2011/09/12/2174177.html</id><title type="text">shuffle算法的一种简易实现</title><summary type="text">shuffle算法一般也被称为洗牌算法，主要功能是将数组里的元素随机打乱，在扑克游戏及mp3播放器中比较常见。在C++的STL库中有专门的函数random_shuffle，在.net中就需要自己写了。不过这个算法并不复杂，一种常规写法如下： static Random rnd = new Random(); public static IEnumerable&amp;lt;T&amp;gt; Shuffle&amp;lt;T&amp;gt;(IEnumerable&amp;lt;T&amp;gt; source) { var elements = source.ToArray(); for (int i = elements.Length </summary><published>2011-09-12T10:58:00Z</published><updated>2011-09-12T10:58:00Z</updated><author><name>天方</name><uri>http://www.cnblogs.com/TianFang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TianFang/archive/2011/09/12/2174177.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TianFang/archive/2011/09/12/2174177.html"/><content type="html">&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Fisher-Yates_shuffle"&gt;shuffle&lt;/a&gt;算法一般也被称为洗牌算法，主要功能是将数组里的元素随机打乱，在扑克游戏及mp3播放器中比较常见。在C++的STL库中有专门的函数random_shuffle，在.net中就需要自己写了。不过这个算法并不复杂，一种常规写法如下：&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Random&lt;/span&gt; rnd = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Random&lt;/span&gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; Shuffle&amp;lt;T&amp;gt;(&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; elements = source.ToArray();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; i = elements.Length - 1; i &amp;gt; 0; i--)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt; swapIndex = rnd.Next(i + 1);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;yield&lt;/span&gt; &lt;span style="color: blue"&gt;return&lt;/span&gt; elements[swapIndex];&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;elements[swapIndex] = elements[i];&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;yield&lt;/span&gt; &lt;span style="color: blue"&gt;return&lt;/span&gt; elements[0];&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;今天用google的时候发现了另一种写法：&lt;a href="http://www.dotnetperls.com/shuffle-array"&gt;http://www.dotnetperls.com/shuffle-array&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;不过原文里面的写法还稍微麻烦了点，简化一下其实就一句话，使用的时候甚至都不用单独作为函数。&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; Shuffle&amp;lt;T&amp;gt;(&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; source.OrderBy(_ =&amp;gt; rnd.Next());&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;当然，后面这种算法的效率上要差一点，但用到shuffle算法的时候一般是不会用到大数组的，性能差异几乎可以忽略不计。这种不拘一格的思路确实值得学习一下。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TianFang/aggbug/2174177.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TianFang/archive/2011/09/12/2174177.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TianFang/archive/2011/09/12/2174124.html</id><title type="text">关于获取所有排列方式的算法</title><summary type="text">今天又见有人问所有排列方式的问题，便随手写了个： static IEnumerable&amp;lt;IEnumerable&amp;lt;int&amp;gt;&amp;gt; GetAllSequence(int n) { if (n == 1) { return Enumerable.Range(0, 1).Select(_ =&amp;gt; new int[] { 1 }); } else { var num = Enumerable.Range(n, 1); return from seq in GetAllSequence(n - 1) from count in Enumerable.Range(0, n) sele</summary><published>2011-09-12T08:44:00Z</published><updated>2011-09-12T08:44:00Z</updated><author><name>天方</name><uri>http://www.cnblogs.com/TianFang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TianFang/archive/2011/09/12/2174124.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TianFang/archive/2011/09/12/2174124.html"/><content type="html">&lt;p&gt;今天又见有人问所有排列方式的问题，便随手写了个：&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&amp;gt;&amp;gt; GetAllSequence(&lt;span style="color: blue"&gt;int&lt;/span&gt; n)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (n == 1)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Enumerable&lt;/span&gt;.Range(0, 1).Select(_ =&amp;gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt;[] { 1 });&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; num = &lt;span style="color: #2b91af"&gt;Enumerable&lt;/span&gt;.Range(n, 1);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;from&lt;/span&gt; seq &lt;span style="color: blue"&gt;in&lt;/span&gt; GetAllSequence(n - 1)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;from&lt;/span&gt; count &lt;span style="color: blue"&gt;in&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Enumerable&lt;/span&gt;.Range(0, n)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;select&lt;/span&gt; seq.Take(count).Concat(num).Concat(seq.Skip(count));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="text-align: left; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none"  align="left"&gt;记得以前也写过过关于这个算法，搜了一下，是篇08年的老文章&amp;#8212;&amp;#8212;&lt;a id="ctl02_TitleUrl"  href="http://www.cnblogs.com/TianFang/archive/2008/07/10/1240281.html"&gt;&lt;font color="#3468a4"&gt;一道关于排列组合的算法题&lt;/font&gt;&lt;/a&gt;。看了一下，虽然方法基本上是一样的，以前的代码写得比较青涩。看来这几年编程水平还是有点提高的。^_^&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TianFang/aggbug/2174124.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TianFang/archive/2011/09/12/2174124.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
