﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title><![CDATA[C#/.Net - 艺风在线 - Power By CSZI.com]]></title>
    <link>http://max.cszi.com</link>
    <description><![CDATA[CSBlog官方网站，CSBlog是巧思工作室使用Asp.Net2.0(C#)开发的一套免费的Blog系统，采用原始数据的Xml+Xslt模板输出标准的Xhtml页面，原创的经典架构、合理的设计、轻巧方便的更改主题，是同类产品中的佼佼者。希望我们辛苦的努力可以为您的生活和工作带来很多方便。]]></description>
    <language>zh-cn</language>
    <copyright><![CDATA[Copyright 2003-2008 ChaosStudio[巧思]]]></copyright>
    <webMaster>zhouyu@69sea.com(一线风)
        </webMaster>
    <generator>CSBlog v2.0.1</generator>
    <image>
      <title><![CDATA[C#/.Net - 艺风在线 - Power By ]]></title>
      <url>/App_Themes/Love/Images/</url>
      <link>http://max.cszi.com</link>
      <description><![CDATA[CSBlog官方网站，CSBlog是巧思工作室使用Asp.Net2.0(C#)开发的一套免费的Blog系统，采用原始数据的Xml+Xslt模板输出标准的Xhtml页面，原创的经典架构、合理的设计、轻巧方便的更改主题，是同类产品中的佼佼者。希望我们辛苦的努力可以为您的生活和工作带来很多方便。]]></description>
    </image>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=669</link>
      <title><![CDATA[C#语言的几个层次]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2009-5-15 13:02:12</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=669</guid>
      <comments>
              /Blog/Blog.aspx?Id=669#commentbox
            </comments>
      <description><![CDATA[<p>不谈具体领域（比如搜索，视频，网络等），单就编程语言这个垂直方向，我大体上对它有一个如下的层次划分。</p>
<p>1. 基本运用C#语法，在各种工具和示例代码的支持下，完成一些基本程序任务</p>
<p>2. 熟练掌握面向对象与组件构造，知其然亦知其所以然，完成一般小规模信息管理类软件项目开发任务</p>
<p>3. 深入理解CLR内核机制，对各种类型与.NET平台机制的优缺点、适用场合、效率有清晰把握，能够完成技术复杂度比较高的项目。</p>
<p>4. 能够游刃有余把握松耦合原则,精准运用各种语言构造，架构大型软件项目。</p>
<p>5. 能够站在计算机抽象、系统和历史发展的高度来理解和把握编程语言</p>]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=617</link>
      <title><![CDATA[子类与父类的小关系：盒子套盒子]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2009-3-10 16:39:08</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=617</guid>
      <comments>
              /Blog/Blog.aspx?Id=617#commentbox
            </comments>
      <description><![CDATA[<p>创建一个控制台程序，运行一个看看：</p>
<div class="codeText">
<div class="codeHead">C#代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;Program &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Main(</span><span class="keyword">string</span><span>[]&nbsp;args) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InBox&nbsp;son&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;InBox(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;son.m1(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;son.m2(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;转换成父类&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Box&nbsp;box&nbsp;=&nbsp;(Box)son; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;box.m1();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//从这儿就能看出，只有父类的方法，而没有子类的方法了？所以像不像是父类就是子类里的一个盒子？ </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">class</span><span>&nbsp;Box &nbsp;&nbsp;</span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;m1() &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;我是父类的方法&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadLine(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">class</span><span>&nbsp;InBox&nbsp;:&nbsp;Box &nbsp;&nbsp;</span></li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;m2() &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;我是子类的方法&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadLine(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=534</link>
      <title><![CDATA[C#位运算讲解与示例[转]]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2008-12-3 15:02:23</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=534</guid>
      <comments>
              /Blog/Blog.aspx?Id=534#commentbox
            </comments>
      <description><![CDATA[<div class="postBody"><font size="2">在C#中可以对整型运算对象按位进行逻辑运算。按位进行逻辑运算的意义是：依次取被运算对象的每个位，进行逻辑运算，每个位的逻辑运算结果是结果值的每个位。C#支持的位逻辑运算符如表2.9所示。</font>
<table cellspacing="1" cellpadding="4" width="589" border="1">
    <tbody>
        <tr>
            <td width="94">运算符号</td>
            <td width="114">意义</td>
            <td width="104">运算对象类型</td>
            <td width="108">运算结果类型</td>
            <td width="74">对象数</td>
            <td width="130">实例</td>
        </tr>
        <tr>
            <td width="94">~</td>
            <td width="114">位逻辑<strong>非</strong>运算</td>
            <td width="104" rowspan="6">整型，字符型</td>
            <td width="108" rowspan="6">整型</td>
            <td width="74">1</td>
            <td width="130">~a</td>
        </tr>
        <tr>
            <td width="94">&amp;</td>
            <td width="114">位逻辑<strong>与</strong>运算</td>
            <td width="74">2</td>
            <td width="130">a &amp; b</td>
        </tr>
        <tr>
            <td width="94">|</td>
            <td width="114">位逻辑<strong>或</strong>运算</td>
            <td width="74">2</td>
            <td width="130">a | b</td>
        </tr>
        <tr>
            <td width="94">^</td>
            <td width="114">位逻辑<strong>异或</strong>运算</td>
            <td width="74">2</td>
            <td width="130">a ^ b</td>
        </tr>
        <tr>
            <td width="94">&lt;&lt;&nbsp;</td>
            <td width="114">位<strong>左移</strong>运算</td>
            <td width="74">2</td>
            <td width="130">a&lt;&lt;4</td>
        </tr>
        <tr>
            <td width="94">&gt;&gt;&nbsp;</td>
            <td width="114">位<strong>右移</strong>运算</td>
            <td width="74">2</td>
            <td width="130">a&gt;&gt;2</td>
        </tr>
    </tbody>
</table>
&nbsp; <strong><font size="2"><br />
from : </font><a href="http://blog.csdn.net/icyleaf1026/archive/2007/08/25/1758243.aspx"><font size="2">http://blog.csdn.net/icyleaf1026/archive/2007/08/25/1758243.aspx</font></a></strong></div><div style="margin-left: 18pt; text-indent: -18pt"><font size="2"><strong><span>1、</span></strong><strong>位逻辑非运算</strong></font></div>
<div><font size="2">位逻辑非运算是单目的，只有一个运算对象。位逻辑非运算按位对运算对象的值进行非运算，即：如果某一位等于0，就将其转变为1；如果某一位等于1，就将其转变为0。</font></div>
<div><font size="2">比如，对二进制的10010001进行位逻辑非运算，结果等于01101110，用十进制表示就是：</font></div>
<div><font size="2">~145等于110；对二进制的01010101进行位逻辑非运算，结果等于10101010。用十进制表示就是~85等于176。</font></div>
<div>&nbsp;</div>
<div><font size="2"><strong>2</strong><strong>、位逻辑与运算</strong></font></div>
<div><font size="2">位逻辑与运算将两个运算对象按位进行与运算。与运算的规则：1与1等于1，1与0等于0。</font></div>
<div><font size="2">比如：10010001（二进制）&amp;11110000等于10010000（二进制）。</font></div>
<div style="margin-left: 18pt; text-indent: -18pt">&nbsp;</div>
<div style="margin-left: 18pt; text-indent: -18pt"><font size="2"><strong><span>3、</span></strong><strong>位逻辑或运算</strong></font></div>
<div><font size="2">位逻辑或运算将两个运算对象按位进行或运算。或运算的规则是：1或1等1，1或0等于1，</font></div>
<div><font size="2">0或0等于0。比如10010001（二进制）| 11110000（二进制）等于11110001（二进制）。</font></div>
<div>&nbsp;</div>
<div><font size="2"><strong>4</strong><strong>、位逻辑异或运算</strong></font></div>
<div><font size="2">位逻辑异或运算将两个运算对象按位进行异或运算。异或运算的规则是：1异或1等于0，</font></div>
<div><font size="2">1异或0等于1，0异或0等于0。即：相同得0，相异得1。</font></div>
<div><font size="2">比如：10010001（二进制）^11110000（二进制）等于01100001（二进制）。</font></div>
<div>&nbsp;</div>
<div><font size="2"><strong>5</strong><strong>、位左移运算</strong></font></div>
<div><font size="2">位左移运算将整个数按位左移若干位，左移后空出的部分0。比如：8位的byte型变量</font></div>
<div><font size="2">byte a=0x65(即二进制的01100101),将其左移3位：a&lt;&lt;3的结果是0x27(即二进制的00101000)。</font></div>
<div>&nbsp;</div>
<div><font size="2"><strong>6</strong><strong>、位右移运算</strong></font></div>
<div><font size="2">&nbsp;位右移运算将整个数按位右移若干位，右移后空出的部分填0。比如：8位的byte型变量</font></div>
<div><font size="2">Byte a=0x65(既（二进制的01100101）)将其右移3位：a&gt;&gt;3的结果是0x0c(二进制00001100)。</font></div>
<div>&nbsp;</div>
<div><font size="2">在进行位与、或、异或运算时，如果两个运算对象的类型一致，则运算结果的类型就是运算对象的类型。比如对两个int变量a和b做与运算，运算结果的类型还是int型。如果两个运算</font></div>
<div><font size="2">对象的类型不一致，则C#要对不一致的类型进行类型转换，变成一致的类型，然后进行运算。</font></div>
<div><font size="2">类型转换的规则同算术运算中整型量的转换则一致。</font></div>
<div><strong><font size="2">由位运算符连接整型量而成的表达式就是位运算表达式。</font></strong></div>
<div>&nbsp;</div>
<div>&nbsp;</div>]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=464</link>
      <title><![CDATA[VS项目里*.sln和*.suo文件的作用]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2008-3-27 18:11:25</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=464</guid>
      <comments>
              /Blog/Blog.aspx?Id=464#commentbox
            </comments>
      <description><![CDATA[<p>今天发现suo是变化的,一直不知是啥作用,就查了一下.</p>
<p><br />
Visual&nbsp;&nbsp; Studio&nbsp;&nbsp; .NET&nbsp;&nbsp; 采用两种文件类型（.sln&nbsp;&nbsp; 和&nbsp;&nbsp; .suo）来存储特定于解决方案的设置。这些文件总称为解决方案文件，为解决方案资源管理器提供显示管理文件的图形接口所需的信息，从而使您每次继续开发任务时，都能够全身心地投入到项目和最终目标中，不会因开发环境而分散精力。&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
扩展名&nbsp;&nbsp; 名称&nbsp;&nbsp; 说明&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
*.sln&nbsp;&nbsp; Visual&nbsp;&nbsp; Studio.Solution&nbsp;&nbsp; 通过为<strong>环境</strong>提供对项目、项目项和解决方案项在磁盘上位置的引用，可将它们组织到解决方案中。&nbsp;&nbsp;&nbsp;&nbsp; 比如是生成Debug模式,还是Release模式,是通用CPU还是专用的等<br />
&nbsp;&nbsp;&nbsp; <br />
*.suo&nbsp;&nbsp;(<em>solution user opertion 我自已理解的</em>) 解决方案<strong>用户选项</strong>&nbsp;&nbsp; 记录所有将与解决方案建立关联的选项，以便在每次打开时，它都包含您所做的自定义设置。比如你的VS布局,你的项目最后编译的而又没有关掉的文件(下次打开时用)</p>]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=455</link>
      <title><![CDATA[C# String小技巧 ]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2008-3-17 13:15:58</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=455</guid>
      <comments>
              /Blog/Blog.aspx?Id=455#commentbox
            </comments>
      <description><![CDATA[<p>&nbsp;&nbsp; NET <a href="http://msdn2.microsoft.com/en-us/library/system.string%28VS.71%29.aspx" target="_blank">string</a> 类是相当广泛的,然而仍有一些String函数是缺失的或者不是很明显,在使用Net String时,这里提供几个小技巧.<br />
&nbsp;&nbsp;&nbsp;</p>
<h3>&nbsp;&nbsp;&nbsp; 用重复的字符填充一个 String</h3>
<p>&nbsp;&nbsp;&nbsp; 为了用重复的字符填充一个字符串, 使用string 类的构造函数.例如:用20个(*)填充一个字符串.<br />
&nbsp;&nbsp;&nbsp;</p>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br  />
<br  />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br  />
http://www.CodeHighlighter.com/<br  />
<br  />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: rgb(0,0,255)">string</span><span style="color: rgb(0,0,0)">&nbsp;s&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">string</span><span style="color: rgb(0,0,0)">(&nbsp;</span><span style="color: rgb(128,0,0)">'</span><span style="color: rgb(128,0,0)">*</span><span style="color: rgb(128,0,0)">'</span><span style="color: rgb(0,0,0)">,&nbsp;</span><span style="color: rgb(128,0,128)">20</span><span style="color: rgb(0,0,0)">&nbsp;);</span></div>
<p>&nbsp;</p>
<p>......</p><p>&nbsp;&nbsp;&nbsp;&nbsp; NET <a href="http://msdn2.microsoft.com/en-us/library/system.string%28VS.71%29.aspx" target="_blank">string</a> 类是相当广泛的,然而仍有一些String函数是缺失的或者不是很明显,在使用Net String时,这里提供几个小技巧.<br />
&nbsp;&nbsp;&nbsp;</p>
<h3>&nbsp;&nbsp;&nbsp; 用重复的字符填充一个 String</h3>
<p>&nbsp;&nbsp;&nbsp; 为了用重复的字符填充一个字符串, 使用string 类的构造函数.例如:用20个(*)填充一个字符串.<br />
&nbsp;&nbsp;&nbsp;</p>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br  />
<br  />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br  />
http://www.CodeHighlighter.com/<br  />
<br  />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: rgb(0,0,255)">string</span><span style="color: rgb(0,0,0)">&nbsp;s&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">string</span><span style="color: rgb(0,0,0)">(&nbsp;</span><span style="color: rgb(128,0,0)">'</span><span style="color: rgb(128,0,0)">*</span><span style="color: rgb(128,0,0)">'</span><span style="color: rgb(0,0,0)">,&nbsp;</span><span style="color: rgb(128,0,128)">20</span><span style="color: rgb(0,0,0)">&nbsp;);</span></div>
<h3>&nbsp;&nbsp;&nbsp; 检查空字符串</h3>
<p>&nbsp;&nbsp;&nbsp; 一个空字符串可能表现为空引用或者空字符串(<span style="color: rgb(8,23,255)"><span style="color: red"><span style="color: rgb(8,23,255)"><span style="color: rgb(8,23,255)"><span style="color: red"><span style="color: rgb(8,23,255)">String.Empty或null</span></span></span></span></span></span>),如果你试图对一个空字符串调用方法,可能会发生异常.因此,要检查空字符串,你应该使用Net2.0中的静态函数<span style="color: red"><span style="color: rgb(8,23,255)">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String.IsNullOrEmpty</span></span>;<br />
<span style="color: rgb(0,0,0)">String.IsNullOrEmpty(&nbsp;s&nbsp;) <br />
</span></p>
<h2>String.Empty vs. &quot;&quot;? 并不重要</h2>
<p>在网上关于用string.Empty还是&quot;&quot;表示空字符已经有很多争论了,然而测试表明,这里差别很小,即使创建10亿个空字符串时.</p>
<h2>反转字符串</h2>
<p>这里有很多算法在反转字符串方面. 下面是一个很好的方法,不论是作用在Unicode还是字符上:</p>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br  />
<br  />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br  />
http://www.CodeHighlighter.com/<br  />
<br  />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: rgb(0,0,255)">static</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">string</span><span style="color: rgb(0,0,0)">&nbsp;Reverse(&nbsp;</span><span style="color: rgb(0,0,255)">string</span><span style="color: rgb(0,0,0)">&nbsp;s&nbsp;)<br />
<img id="Codehighlighter1_41_152_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_41_152_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_41_152_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_41_152_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_41_152_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_41_152_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_41_152_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_41_152_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_41_152_Closed_Text" style="border-right: rgb(128,128,128) 1px solid; border-top: rgb(128,128,128) 1px solid; display: none; border-left: rgb(128,128,128) 1px solid; border-bottom: rgb(128,128,128) 1px solid; background-color: rgb(255,255,255)"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_41_152_Open_Text"><span style="color: rgb(0,0,0)">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">char</span><span style="color: rgb(0,0,0)">[]&nbsp;charArray&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;s.ToCharArray();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Array.Reverse(&nbsp;charArray&nbsp;);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">string</span><span style="color: rgb(0,0,0)">(&nbsp;charArray&nbsp;);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}<br />
</span></span></div>
<p>&nbsp;</p>
<h2>字符串比较</h2>
<p>由于字符串引用可能是空的,所以在比较字符串时,你应该避免使用&quot;==&quot;或者成员比较函数.代替的是使用静态的String.Compare方法.这个方法有个优势就是它能处理空字符串引用,忽略字符串大小写.也可以在特定文化背景下使用.</p>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br  />
<br  />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br  />
http://www.CodeHighlighter.com/<br  />
<br  />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;(String.Compare(&nbsp;s1,&nbsp;s2,&nbsp;</span><span style="color: rgb(0,0,255)">true</span><span style="color: rgb(0,0,0)">&nbsp;)&nbsp;</span><span style="color: rgb(0,0,0)">==</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(128,0,128)">0</span><span style="color: rgb(0,0,0)">)</span></div>
<p>&nbsp;</p>
<h2>转换字符串为数字类型</h2>
<p>每一种数字类型如: <span style="color: rgb(8,23,255)">int, Int32, double,</span> 等等,都有一个静态<a href="http://msdn2.microsoft.com/en-us/library/system.int32.tryparse.aspx" target="_blank">TryParse</a> 方法来转换一个字符串而不抛出异常.这个方法返回一个bool无论这个字符串是否包含在这个特殊的数字类型中.例如:</p>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br  />
<br  />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br  />
http://www.CodeHighlighter.com/<br  />
<br  />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: rgb(0,0,255)">string</span><span style="color: rgb(0,0,0)">&nbsp;s&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(128,0,0)">&quot;</span><span style="color: rgb(128,0,0)">42&Prime;;</span><span style="color: rgb(128,0,0)"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;i;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">.TryParse(&nbsp;s,&nbsp;</span><span style="color: rgb(0,0,255)">out</span><span style="color: rgb(0,0,0)">&nbsp;i&nbsp;);</span></div>
<p>&nbsp;</p>
<h2>IndexOf 忽略大小写</h2>
<p>字符串的 <span style="color: rgb(8,23,255)">IndexOf</span> 方法是对大小写敏感的.幸运的是. 这个Globalization 命名空间下包含 <a href="http://msdn2.microsoft.com/en-us/library/system.globalization.compareinfo.aspx" target="_blank">CompareInfo</a> 类,它包含一个对大小写敏感的 IndexOf 方法. 例如:</p>
<blockquote>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br  />
<br  />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br  />
http://www.CodeHighlighter.com/<br  />
<br  />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">using</span><span style="color: rgb(0,0,0)">&nbsp;System.Globalization;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">string</span><span style="color: rgb(0,0,0)">&nbsp;s1&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(128,0,0)">&quot;</span><span style="color: rgb(128,0,0)">C#&nbsp;is&nbsp;a&nbsp;GREAT&nbsp;programming&nbsp;language.</span><span style="color: rgb(128,0,0)">&quot;</span><span style="color: rgb(0,0,0)">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">string</span><span style="color: rgb(0,0,0)">&nbsp;s2&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(128,0,0)">&quot;</span><span style="color: rgb(128,0,0)">great</span><span style="color: rgb(128,0,0)">&quot;</span><span style="color: rgb(0,0,0)">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;CompareInfo&nbsp;Compare&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;CultureInfo.InvariantCulture.CompareInfo;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;i&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;Compare.IndexOf(&nbsp;s1,&nbsp;s2,&nbsp;CompareOptions.IgnoreCase&nbsp;);</span></div>
</blockquote>]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=454</link>
      <title><![CDATA[本周ASP.NET英文技术文章推荐[03/02 - 03/15]：ASP.NET AJAX、LinqDataSource、ListView、MVC、JavaScript、智能感知、Ext、CAPTCHA ]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2008-3-17 10:36:51</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=454</guid>
      <comments>
              /Blog/Blog.aspx?Id=454#commentbox
            </comments>
      <description><![CDATA[<p><strong><font size="4">摘要</font></strong></p>
<p>本期共有7篇文章（实际上有12篇文章，这两天不知为何网络状况一直不好，很多国外网站都上不去，只好暂时作罢）：</p>
<ol>
    <li>深入ASP.NET AJAX：对象继承体系</li>
    <li>使用ASP.NET 3.5和自定义层级数据源控件构造Vista样式的文件夹浏览器</li>
    <li>使用ASP.NET 3.5的LinqDataSource和ListView实现Tag云的过滤</li>
    <li>对ASP.NET MVC第二个预览版本的想法</li>
    <li>ASP.NET MVC中测试框架的集成</li>
    <li>JavaScript智能感知支持Ext框架</li>
    <li>在ASP.NET MVC中实现CAPTCHA</li>
</ol><p>转自：<a href="http://www.cnblogs.com/dflying/archive/2008/03/16/1108763.html">http://www.cnblogs.com/dflying/archive/2008/03/16/1108763.html</a></p>

<p>&nbsp;</p>
<p><strong><font size="4">[1] </font></strong><a href="http://weblogs.asp.net/stephenwalther/archive/2008/03/05/asp-net-ajax-in-depth-object-inheritance.aspx" target="_blank"><strong><font size="4">ASP.NET AJAX In-Depth: Object Inheritance</font></strong></a><strong><font size="4"> （深入ASP.NET AJAX：对象继承体系）</font></strong></p>
<p>这是《<a href="http://www.amazon.com/gp/product/0672330113/103-6178735-5889432?ie=UTF8&amp;tag=scoblo04-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=0672330113">ASP.NET 3.5 Unleashed</a>》一书的作者，Stephen Walther的一篇文章，其中在源代码级别讨论了ASP.NET AJAX中继承的实现方式。对ASP.NET AJAX原理感兴趣的朋友，或是想学习一下JavaScript的朋友都可以参考一下。</p>
<p>Steve还有两篇相关的文章，如果你看了上一篇的话，也可以顺便看看这两篇：</p>
<ol>
    <li>《<a href="http://weblogs.asp.net/stephenwalther/archive/2008/02/29/creating-javascript-properties-in-asp-net-ajax.aspx">ASP.NET AJAX In-Depth: Creating JavaScript Properties</a>》</li>
    <li>《<a href="http://weblogs.asp.net/stephenwalther/archive/2008/03/07/asp-net-ajax-in-depth-application-events.aspx">ASP.NET AJAX In-Depth: Application Events</a>》</li>
</ol>
<p>&nbsp;</p>
<p><strong><font size="4">[2] </font></strong><a href="http://mattberseth.com/blog/2008/03/building_a_vista_style_folder.html" target="_blank"><strong><font size="4">Building a Vista Style Folder Browser with ASP.NET 3.5 and a Custom Hierarchical DataSource Control</font></strong></a><strong><font size="4"> （使用ASP.NET 3.5和自定义层级数据源控件构造Vista样式的文件夹浏览器）</font></strong></p>
<p>使用了不少东西组合起来，包括GridView、UpdatePanel、TreeView、FileSystemDataSource、ListView等等，界面也很漂亮（真的很像Vista）：</p>
<p><img height="537" alt="image" src="http://mattberseth.com/WindowsLiveWriter/BuildingaVistaStyleFolderBrowserwithAS.5_8945/image_f17566fc-cba7-4d43-8bb9-5962479ba7d2.png" width="736" /></p>
<p>不过说实话，除了界面模仿得比较成功之外，其它还真没有那些地方特别有&ldquo;技术含量&rdquo;。不过一俊遮百丑，已经很不错了。</p>
<p><a href="http://mattberseth2.com/vista_folder_explorer/">Live Demo (IE6, IE7, FF and Opera)</a> | <a href="http://mattberseth2.com/downloads/vista_folder_explorer.zip">Download (.Net 3.5)</a></p>
<p>&nbsp;</p>
<p><strong><font size="4">[3] </font></strong><a href="http://mattberseth.com/blog/2008/03/tag_cloud_filters_with_aspnet.html" target="_blank"><strong><font size="4">Tag Cloud Filters with ASP.NET 3.5's LinqDataSource and ListView Controls</font></strong></a><strong><font size="4"> （使用ASP.NET 3.5的LinqDataSource和ListView实现Tag云的过滤）</font></strong></p>
<p>同样是界面比较漂亮（居然使用了几个iPhone的图标-_-），不过也算是有了一些新东西&mdash;&mdash;LinqDataSource和ListView。适合入门者阅读：</p>
<p><img height="446" alt="image" src="http://mattberseth.com/WindowsLiveWriter/TagCloudFilterswith_12E76/image_1268e731-67ec-4662-9130-dd399b4a9df6.png" width="752" /></p>
<p>&nbsp;</p>
<p><strong><font size="4">[4] </font></strong><a href="http://haacked.com/archive/2008/03/10/thoughts-on-asp.net-mvc-preview-2-and-beyond.aspx"><strong><font size="4">Thoughts on ASP.NET MVC Preview 2 and Beyond</font></strong></a><strong><font size="4"> （对ASP.NET MVC第二个预览版本的想法）</font></strong></p>
<p>随着这两天新版本ASP.NET MVC框架在MIX08上面发布，这一段的热点也随之来到了这里。作为能够与WebForm媲美的另一种Web开发框架，MVC自然有它存在的位置。</p>
<p>不过这篇文章主要以介绍这个新版本为主，还有一些作者对ASP.NET MVC今后发展方向的自己想法。</p>
<p>&nbsp;</p>
<p><strong><font size="4">[5] </font></strong><a href="http://blogs.msdn.com/webdevtools/archive/2008/03/06/asp-net-mvc-test-framework-integration-demo.aspx" target="_blank"><strong><font size="4">ASP.NET MVC Test Framework Integration Walkthrough</font></strong></a><strong><font size="4"> （ASP.NET MVC中测试框架的集成）</font></strong></p>
<p>使用过ASP.NET MVC的朋友都不会对这个界面感到陌生：</p>
<p><img src="http://blogs.msdn.com/blogfiles/webdevtools/WindowsLiveWriter/ToolingFeature.NETMVCFrameworkforMIX2008_4F63/image_2.png" alt="" /></p>
<p>本文是<a title="http://blogs.msdn.com/webdevtools/archive/2008/02/18/asp-net-mvc-test-framework-integration.aspx" href="http://blogs.msdn.com/webdevtools/archive/2008/02/18/asp-net-mvc-test-framework-integration.aspx">http://blogs.msdn.com/webdevtools/archive/2008/02/18/asp-net-mvc-test-framework-integration.aspx</a>的姊妹篇。其中介绍了ASP.NET MVC中有关测试框架集成的点点滴滴，并提供了集成几种现有测试框架的模板。通过这个强大特性，我们即可在使用ASP.NET MVC时选择最熟悉的测试框架，而不必局限于某种特别的约定中。</p>
<p>&nbsp;</p>
<p><strong><font size="4">[6] </font></strong><a href="http://blogs.msdn.com/webdevtools/archive/2008/03/12/jscript-intellisense-working-with-ext-js.aspx" target="_blank"><strong><font size="4">JScript IntelliSense: Working with Ext JS</font></strong></a><strong><font size="4"> （JavaScript智能感知支持Ext框架）</font></strong></p>
<p>继官方的ASP.NET AJAX和最近发布的jQuery之后，Visual Studio的智能感知功能又有了新的适用成员，那就是同样流行的Ext框架。不用多说，只要看看效果就知道了：</p>
<p><img title="ext20" height="294" alt="ext20" src="http://blogs.msdn.com/blogfiles/webdevtools/WindowsLiveWriter/JScriptIntelliSenseWorkingwithExtJS_E2AD/ext20_thumb_2.png" width="432" border="1" /></p>
<p>&nbsp;</p>
<p><strong><font size="4">[7] </font></strong><a href="http://www.coderjournal.com/2008/03/aspnet-mvc-captcha/"><strong><font size="4">ASP.NET MVC CAPTCHA</font></strong></a><strong><font size="4"> （在ASP.NET MVC中实现CAPTCHA）</font></strong></p>
<p>CAPTCHA即Completely Automated Public Turing Test to Tell Computers and Humans Apart（全自动的公开图灵测试），其目的是让计算机生成区分计算机和人类的程序算法，这种程序必须能够生成并评价出人类能很容易通过但计算机却难以通过的测试。目前常见的验证图片等都属于CAPTCHA。若想了解更多，请访问&ldquo;The CAPTCHA Project&rdquo;网站：<a href="http://www.captcha.net/">http://www.captcha.net/</a>。&hellip;&hellip;&hellip;&hellip;</p>
<p>（其实说简单了，CAPTCHA就是网站中常见的&ldquo;验证码&rdquo;）</p>
<p>这篇文章介绍了在ASP.NET MVC中实现CAPTCHA的方法，其实核心逻辑上与普通WebForm没有任何区别，只是放在了在ASP.NET MVC中，似乎好像&ldquo;旧貌换新颜&rdquo;了&hellip;&hellip;</p>
<p><img alt="Example of CAPTCHA" src="http://www.coderjournal.com/uploads/2008/03/captcha.png" /></p>]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=453</link>
      <title><![CDATA[简单自定义实现jQuery验证 ]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2008-3-14 10:40:24</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=453</guid>
      <comments>
              /Blog/Blog.aspx?Id=453#commentbox
            </comments>
      <description><![CDATA[<p>分两种情况验证，一是直接使用本地验证，二是ajax到服务器验证。<br />
<br />
我现在需要验证：用户名，邮箱，电话 三个input(text)，用户名、电话号码只需要本地验证格式，只要匹配给定的正则表达式即可，而邮箱首先在本地验证格式，符合格式则ajax到服务器验证是否已被注册，如果被注册了则不能通过验证。<br />
<br />
对于每个input后面跟随<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/somesongs/accept.gif" border="0" /><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/somesongs/exclamation.gif" border="0" /><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/somesongs/loading.gif" border="0" />三种状态，分别表示验证通过、验证未通过、正在提交服务器验证，当未通过验证时，还出示提示信息。<br />
<br />
首先设计服务器端的邮箱验证，这里使用.ashx 文件。</p><p>转自：<a href="http://www.cnblogs.com/somesongs/archive/2008/03/13/1103068.html">http://www.cnblogs.com/somesongs/archive/2008/03/13/1103068.html</a></p>

<div class="codeText">
<div class="codeHead">C#代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>&lt;%@&nbsp;WebHandler&nbsp;Language=</span><span class="string">&quot;C#&quot;</span><span>&nbsp;Class=</span><span class="string">&quot;validateEmail&quot;</span><span>&nbsp;%&gt; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">using</span><span>&nbsp;System; &nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">using</span><span>&nbsp;System.Web; &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">using</span><span>&nbsp;System.Data.SqlClient; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;validateEmail&nbsp;:&nbsp;IHttpHandler&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;ProcessRequest&nbsp;(HttpContext&nbsp;context)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(context.Request.QueryString.Count&nbsp;!=&nbsp;0) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">string</span><span>&nbsp;email&nbsp;=&nbsp;context.Request.QueryString[0].Trim(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.Response.ContentType&nbsp;=&nbsp;</span><span class="string">&quot;text/plain&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SqlConnection&nbsp;conn&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SqlConnection(</span><span class="string">&quot;Server=localhost;User&nbsp;Id=sa;Password=;Database=XXX&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SqlCommand&nbsp;sqlCmd&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SqlCommand(</span><span class="string">&quot;select&nbsp;count(*)&nbsp;from&nbsp;Clients&nbsp;where&nbsp;email=@email&quot;</span><span>,&nbsp;conn); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sqlCmd.Parameters.AddWithValue(</span><span class="string">&quot;@email&quot;</span><span>,&nbsp;email); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.Open(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;result&nbsp;=&nbsp;(</span><span class="keyword">int</span><span>)sqlCmd.ExecuteScalar(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.Response.Write(</span><span class="string">&quot;{message:'&quot;</span><span>+result.ToString()+</span><span class="string">&quot;'}&quot;</span><span>);&nbsp;</span><span class="comment">//输出为JSON格式 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">finally</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.Close(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">bool</span><span>&nbsp;IsReusable&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">get</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
接下来实现客户端的html，添加对JQuery的引用<br />
<br />
js脚本代码：</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>&nbsp;&nbsp;</span><span class="comment">//给定需要验证的input添加&nbsp;needValidate='true'&nbsp;的属性对，然后选择他们，添加blur的事件函数。 </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span class="string">&quot;input[needValidate='true']&quot;</span><span>).blur(</span><span class="keyword">function</span><span>() &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(requireField(</span><span class="keyword">this</span><span>))</span><span class="comment">//首先客户端验证 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="keyword">this</span><span>.id&nbsp;==&nbsp;</span><span class="string">'your_email'</span><span>)</span><span class="comment">//如果是邮件则还进行ajax服务器端验证 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span class="string">'#email_img'</span><span>).html(</span><span class="string">&quot;&lt;img&nbsp;src='loading.gif'&nbsp;/&gt;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$.getJSON(</span><span class="string">&quot;validateEmail.ashx&quot;</span><span>,{email:</span><span class="keyword">this</span><span>.value},processValidateEmail);</span><span class="comment">//getJSON获取服务器端的验证结果 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span class="string">'#'</span><span>+</span><span class="keyword">this</span><span>.id+</span><span class="string">'_img'</span><span>).html(</span><span class="string">&quot;&lt;img&nbsp;src='accept.gif'&nbsp;/&gt;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span class="string">'#'</span><span>+</span><span class="keyword">this</span><span>.id+</span><span class="string">'_error'</span><span>).html(</span><span class="string">&quot;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="comment">//ajax验证完成后的处理函数 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">function</span><span>&nbsp;processValidateEmail(data) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(data.message&nbsp;==&nbsp;</span><span class="string">&quot;0&quot;</span><span>)</span><span class="comment">//表示服务器端没有该邮箱地址 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span class="string">'#your_email_img'</span><span>).html(</span><span class="string">&quot;&lt;img&nbsp;src='accept.gif'&nbsp;/&gt;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span class="string">'#your_email_error'</span><span>).html(</span><span class="string">&quot;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span class="string">'#your_email_img'</span><span>).html(</span><span class="string">&quot;&lt;img&nbsp;src='exclamation.gif'&nbsp;/&gt;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span class="string">'#your_email_error'</span><span>).html(</span><span class="string">&quot;邮箱已被人注册，请更换重试！&quot;</span><span>).attr(</span><span class="string">&quot;style&quot;</span><span>,</span><span class="string">&quot;color:red;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="comment">//客户端验证函数 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">function</span><span>&nbsp;requireField(o) &nbsp;&nbsp;</span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;your_email&nbsp;=&nbsp;/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;your_name&nbsp;=&nbsp;/^(\w){4,20}|[^u4e00-u9fa5]{2,20}$/; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;your_tel&nbsp;=&nbsp;/^[+]{0,1}(\d){1,3}[&nbsp;]?([-]?((\d)|[&nbsp;]){1,12})+$/; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;your_email_error&nbsp;=&nbsp;</span><span class="string">&quot;请输入正确的邮箱格式！&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;your_name_error&nbsp;=&nbsp;</span><span class="string">&quot;请输入您的名字，不少于4个字符！&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;your_tel_error&nbsp;=&nbsp;</span><span class="string">&quot;请输入正确的电话号码格式！&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(o.value.match(eval(o.id))) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span class="string">'#'</span><span>+o.id+</span><span class="string">'_img'</span><span>).html(</span><span class="string">&quot;&lt;img&nbsp;src='exclamation.gif'&nbsp;/&gt;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span class="string">'#'</span><span>+o.id+</span><span class="string">'_error'</span><span>).html(eval(o.id+</span><span class="string">'_error'</span><span>)).attr(</span><span class="string">&quot;style&quot;</span><span>,</span><span class="string">&quot;color:red;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="comment">//submit前的验证函数 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">function</span><span>&nbsp;validate()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;biaozhi&nbsp;=&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span class="string">&quot;input[needValidate='true']&quot;</span><span>).each(</span><span class="keyword">function</span><span>(i){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!requireField(</span><span class="keyword">this</span><span>)) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;biaozhi&nbsp;=&nbsp;</span><span class="keyword">false</span><span>;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;biaozhi; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>html须验证的表单代码：</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">li</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">label</span><span>&nbsp;</span><span class="attribute">for</span><span>=</span><span class="attribute-value">&quot;your_name&quot;</span><span class="tag">&gt;</span><span>你的姓名：</span><span class="tag">&lt;/</span><span class="tag-name">label</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;your_name&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;your_name&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text&quot;</span><span>&nbsp;</span><span class="attribute">needValidate</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span class="tag">&lt;</span><span class="tag-name">span</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;your_name_img&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">span</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;your_name_error&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">li</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">li</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">label</span><span>&nbsp;</span><span class="attribute">for</span><span>=</span><span class="attribute-value">&quot;your_email&quot;</span><span class="tag">&gt;</span><span>你的邮箱：</span><span class="tag">&lt;/</span><span class="tag-name">label</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;your_email&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;your_email&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text&quot;</span><span>&nbsp;</span><span class="attribute">needValidate</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span class="tag">&lt;</span><span class="tag-name">span</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;your_email_img&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">span</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;your_email_error&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">li</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">li</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">label</span><span>&nbsp;</span><span class="attribute">for</span><span>=</span><span class="attribute-value">&quot;your_tel&quot;</span><span class="tag">&gt;</span><span>你的电话：</span><span class="tag">&lt;/</span><span class="tag-name">label</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;your_tel&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;your_tel&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text&quot;</span><span>&nbsp;</span><span class="attribute">needValidate</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span class="tag">&lt;</span><span class="tag-name">span</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;your_tel_img&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">span</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;your_tel_error&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">li</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">li</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">label</span><span>&nbsp;</span><span class="attribute">for</span><span>=</span><span class="attribute-value">&quot;comment&quot;</span><span class="tag">&gt;</span><span>相关信息：</span><span class="tag">&lt;/</span><span class="tag-name">label</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;comment&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;comment&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span class="tag">&lt;/</span><span class="tag-name">li</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p><strong>以下为javascript正则表达式的参考：<br />
http://www.ccvita.com/index.php/61.html<br />
http://www.cnblogs.com/westlake/articles/388873.html</strong></p>]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=452</link>
      <title><![CDATA[C#异步编程]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2008-3-13 14:25:30</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=452</guid>
      <comments>
              /Blog/Blog.aspx?Id=452#commentbox
            </comments>
      <description><![CDATA[<p><strong>异步编程概览</strong><br />
.NET Framework 允许您异步调用任何方法。定义与您需要调用的方法具有相同签名的委托；公共语言运行库将自动为该委托定义具有适当签名</p>
<p>的 BeginInvoke 和 EndInvoke 方法。</p>
<p>BeginInvoke 方法用于启动异步调用。它与您需要异步执行的方法具有相同的参数，只不过还有两个额外的参数（将在稍后描述）。</p>
<p>BeginInvoke 立即返回，不等待异步调用完成。<br />
BeginInvoke 返回 IasyncResult，可用于监视调用进度。</p>
<p>EndInvoke 方法用于检索异步调用结果。调用 BeginInvoke 后可随时调用 EndInvoke 方法；如果异步调用未完成，EndInvoke 将一直阻塞到</p>
<p>异步调用完成。EndInvoke 的参数包括您需要异步执行的方法的 out 和 ref 参数（在 Visual Basic 中为 &lt;Out&gt; ByRef 和 ByRef）以及由</p>
<p>BeginInvoke 返回的 IAsyncResult。</p><p><strong>转自：<a href="http://www.cnblogs.com/ericwen/archive/2008/03/12/1101801.html">http://www.cnblogs.com/ericwen/archive/2008/03/12/1101801.html</a></strong></p>
<p><strong>同步方法和异步方法的区别</strong><br />
同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果<br />
异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务的同时执行其它操作</p>

<p>四种使用 BeginInvoke 和 EndInvoke 进行异步调用的常用方法。调用了 BeginInvoke 后，可以：</p>
<p>1.进行某些操作，然后调用 EndInvoke 一直阻塞到调用完成。<br />
2.使用 IAsyncResult.AsyncWaitHandle 获取 WaitHandle，使用它的 WaitOne 方法将执行一直阻塞到发出 WaitHandle 信号，然后调用</p>
<p>EndInvoke。这里主要是主程序等待异步方法，等待异步方法的结果。<br />
3.轮询由 BeginInvoke 返回的 IAsyncResult，IAsyncResult.IsCompeted确定异步调用何时完成，然后调用 EndInvoke。此处理个人认为与<br />
相同。<br />
4.将用于回调方法的委托传递给 BeginInvoke。该方法在异步调用完成后在 ThreadPool 线程上执行，它可以调用 EndInvoke。这是在强制装</p>
<p>换回调函数里面IAsyncResult.AsyncState(BeginInvoke方法的最后一个参数)成委托，然后用委托执行EndInvoke。<br />
警告&nbsp;&nbsp; 始终在异步调用完成后调用 EndInvoke。</p>
<p>以上有不理解的稍后可以再理解。</p>
<p>&nbsp;</p>
<p><strong>例子</strong><br />
1）先来个简单的没有回调函数的异步方法例子</p>
<p>请再运行程序的时候，仔细看注释，对理解很有帮助。还有，若将注释的中的两个方法都同步，你会发现异步运行的速度优越性。</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">C#代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">using</span><span>&nbsp;System; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">namespace</span><span>&nbsp;ConsoleApplication1 &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">class</span><span>&nbsp;Class1 &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//声明委托 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">delegate</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;AsyncEventHandler(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//异步方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">void</span><span>&nbsp;Event1() &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;Event1&nbsp;Start&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Threading.Thread.Sleep(4000); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;Event1&nbsp;End&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;同步方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">void</span><span>&nbsp;Event2() &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;Event2&nbsp;Start&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;i=1; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(i&lt;1000) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=i+1; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;Event2&nbsp;&quot;</span><span>+i.ToString()); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;Event2&nbsp;End&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[STAThread] &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Main(</span><span class="keyword">string</span><span>[]&nbsp;args) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">long</span><span>&nbsp;start=0; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">long</span><span>&nbsp;end=0; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class1&nbsp;c&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Class1(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;ready&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start=DateTime.Now.Ticks; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//实例委托 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AsyncEventHandler&nbsp;asy&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;AsyncEventHandler(c.Event1); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//异步调用开始，没有回调函数和AsyncState,都为null </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAsyncResult&nbsp;ia&nbsp;=&nbsp;asy.BeginInvoke(</span><span class="keyword">null</span><span>,&nbsp;</span><span class="keyword">null</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//同步开始， </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.Event2(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//异步结束，若没有结束，一直阻塞到调用完成，在此返回该函数的return，若有返回值。 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asy.EndInvoke(ia); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//都同步的情况。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//c.Event1(); </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//c.Event2(); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;=DateTime.Now.Ticks; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;时间刻度差=&quot;</span><span>+&nbsp;Convert.ToString(end-start)&nbsp;); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadLine(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
&nbsp;</p>
<p>&nbsp;</p>
<p>2）下面看有回调函数的WebRequest和WebResponse的异步操作。</p>
<div class="codeText">
<div class="codeHead">C#代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">using</span><span>&nbsp;System; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">using</span><span>&nbsp;System.Net; &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">using</span><span>&nbsp;System.Threading; &nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">using</span><span>&nbsp;System.Text; &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">using</span><span>&nbsp;System.IO; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="comment">//&nbsp;RequestState&nbsp;类用于通过 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="comment">//&nbsp;异步调用传递数据 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;RequestState &nbsp;&nbsp;</span></li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">const</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;BUFFER_SIZE&nbsp;=&nbsp;1024; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;StringBuilder&nbsp;RequestData; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;BufferRead; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;HttpWebRequest&nbsp;Request; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Stream&nbsp;ResponseStream; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;创建适当编码类型的解码器 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Decoder&nbsp;StreamDecode&nbsp;=&nbsp;Encoding.UTF8.GetDecoder(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;RequestState() &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferRead&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">byte</span><span>[BUFFER_SIZE]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestData&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;StringBuilder(</span><span class="string">&quot;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Request&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResponseStream&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="comment">//&nbsp;ClientGetAsync&nbsp;发出异步请求 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">class</span><span>&nbsp;ClientGetAsync &nbsp;&nbsp;</span></li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;ManualResetEvent&nbsp;allDone&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ManualResetEvent(</span><span class="keyword">false</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">const</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;BUFFER_SIZE&nbsp;=&nbsp;1024; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Main(</span><span class="keyword">string</span><span>[]&nbsp;args) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(args.Length&nbsp;&lt;&nbsp;1) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showusage(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;从命令行获取&nbsp;URI </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uri&nbsp;HttpSite&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Uri(args[0]); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;创建请求对象 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpWebRequest&nbsp;wreq&nbsp;=&nbsp;(HttpWebRequest)WebRequest.Create(HttpSite); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;创建状态对象 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestState&nbsp;rs&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;RequestState(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;将请求添加到状态，以便它可以被来回传递 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.Request&nbsp;=&nbsp;wreq; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;发出异步请求 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAsyncResult&nbsp;r&nbsp;=&nbsp;(IAsyncResult)wreq.BeginGetResponse(</span><span class="keyword">new</span><span>&nbsp;AsyncCallback(RespCallback),&nbsp;rs); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;将&nbsp;ManualResetEvent&nbsp;设置为&nbsp;Wait， </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;以便在调用回调前，应用程序不退出 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allDone.WaitOne(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;showusage() &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;尝试获取&nbsp;(GET)&nbsp;一个&nbsp;URL&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;\r\n用法：:&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;ClientGetAsync&nbsp;URL&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;示例：:&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;ClientGetAsync&nbsp;http://www.microsoft.com/net/&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;RespCallback(IAsyncResult&nbsp;ar) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;从异步结果获取&nbsp;RequestState&nbsp;对象 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestState&nbsp;rs&nbsp;=&nbsp;(RequestState)ar.AsyncState; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;从&nbsp;RequestState&nbsp;获取&nbsp;HttpWebRequest </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpWebRequest&nbsp;req&nbsp;=&nbsp;rs.Request; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;调用&nbsp;EndGetResponse&nbsp;生成&nbsp;HttpWebResponse&nbsp;对象 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;该对象来自上面发出的请求 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpWebResponse&nbsp;resp&nbsp;=&nbsp;(HttpWebResponse)req.EndGetResponse(ar); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;既然我们拥有了响应，就该从 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;响应流开始读取数据了 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stream&nbsp;ResponseStream&nbsp;=&nbsp;resp.GetResponseStream(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;该读取操作也使用异步完成，所以我们 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;将要以&nbsp;RequestState&nbsp;存储流 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.ResponseStream&nbsp;=&nbsp;ResponseStream; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;请注意，rs.BufferRead&nbsp;被传入到&nbsp;BeginRead。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;这是数据将被读入的位置。 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAsyncResult&nbsp;iarRead&nbsp;=&nbsp;ResponseStream.BeginRead(rs.BufferRead,&nbsp;0,&nbsp;BUFFER_SIZE,&nbsp;</span><span class="keyword">new</span><span>&nbsp;AsyncCallback(ReadCallBack),&nbsp;rs); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;ReadCallBack(IAsyncResult&nbsp;asyncResult) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;从&nbsp;asyncresult&nbsp;获取&nbsp;RequestState&nbsp;对象 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestState&nbsp;rs&nbsp;=&nbsp;(RequestState)asyncResult.AsyncState; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;取出在&nbsp;RespCallback&nbsp;中设置的&nbsp;ResponseStream </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stream&nbsp;responseStream&nbsp;=&nbsp;rs.ResponseStream; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;此时&nbsp;rs.BufferRead&nbsp;中应该有一些数据。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;读取操作将告诉我们那里是否有数据 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;read&nbsp;=&nbsp;responseStream.EndRead(asyncResult); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(read&nbsp;&gt;&nbsp;0) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;准备&nbsp;Char&nbsp;数组缓冲区，用于向&nbsp;Unicode&nbsp;转换 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Char[]&nbsp;charBuffer&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Char[BUFFER_SIZE]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;将字节流转换为&nbsp;Char&nbsp;数组，然后转换为字符串 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;len&nbsp;显示多少字符被转换为&nbsp;Unicode </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;len&nbsp;=&nbsp;rs.StreamDecode.GetChars(rs.BufferRead,&nbsp;0,&nbsp;read,&nbsp;charBuffer,&nbsp;0); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;String(charBuffer,&nbsp;0,&nbsp;len); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;将最近读取的数据追加到&nbsp;RequestData&nbsp;stringbuilder&nbsp;对象中， </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;该对象包含在&nbsp;RequestState&nbsp;中 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.RequestData.Append(str); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;现在发出另一个异步调用，读取更多的数据 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;请注意，将不断调用此过程，直到 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;responseStream.EndRead&nbsp;返回&nbsp;-1 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAsyncResult&nbsp;ar&nbsp;=&nbsp;responseStream.BeginRead(rs.BufferRead,&nbsp;0,&nbsp;BUFFER_SIZE,&nbsp;</span><span class="keyword">new</span><span>&nbsp;AsyncCallback(ReadCallBack),&nbsp;rs); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(rs.RequestData.Length&nbsp;&gt;&nbsp;1) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;所有数据都已被读取，因此将其显示到控制台 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">string</span><span>&nbsp;strContent; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strContent&nbsp;=&nbsp;rs.RequestData.ToString(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(strContent); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;关闭响应流 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;responseStream.Close(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;设置&nbsp;ManualResetEvent，以便主线程可以退出 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allDone.Set(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
<br />
在这里有回调函数，且异步回调中又有异步操作。</p>
<p>首先是异步获得ResponseStream，然后异步读取数据。</p>
<p>这个程序非常经典。从中可以学到很多东西的。我们来共同探讨。</p>
<p>&nbsp;</p>
<p><strong>总结</strong><br />
上面说过，.net framework 可以异步调用任何方法。所以异步用处广泛。</p>
<p>在.net framework 类库中也有很多异步调用的方法。一般都是已Begin开头End结尾构成一对，异步委托方法，外加两个回调函数和AsyncState参数，组成异步操作的宏观体现。所以要做异步编程，不要忘了委托delegate、Begin，End，AsyncCallBack委托，AsyncState实例(在回调函数中通过IAsyncResult.AsyncState来强制转换)，IAsycResult(监控异步），就足以理解异步真谛了。</p>
<p>&nbsp;</p>]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=443</link>
      <title><![CDATA[ASp.net中Froms验证方式 ]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2008-2-29 14:01:33</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=443</guid>
      <comments>
              /Blog/Blog.aspx?Id=443#commentbox
            </comments>
      <description><![CDATA[<p>微软的ASP.NET提供了３种用户验证方式，即Windows验证、窗体(Forms)验证和护照验证(Passport)验证。<br />
　　 <br />
由于验证方式各不相同，因而这3种验证方式在使用范围上也有很大的不同,　Windows验证方式只适用于放在受控环境里的网站;　也就是说，更适合于企业内网(Intranet)。窗体认证特别适合布置于互联网的应用，而护照验证方式适合于跨站之间的应用，用户只用一个用户名和密码就可以访问任何成员站，并且在注销离开时，所有护照信息都会清除，你可以在公共场所放心的使用。<br />
我们在编写Web程序时，最多用到的便是窗体(Forms)验证方式，而微软提供了只要简单的配置Web.config文件就可实现这种简单的窗体(Forms)验证。为了能更好的使用窗体验证，我对这种验证方式进行了研究。<br />
　　　&nbsp;</p><p>原文：<a href="http://blog.csdn.net/xiaoling9/archive/2007/04/10/1559085.aspx">http://blog.csdn.net/xiaoling9/archive/2007/04/10/1559085.aspx</a></p>

<p>基于表单身份验证的类的命名空间：System.Web.Security<br />
常用的几个类分别为：<br />
１．FormsAuthentication <br />
&nbsp;&nbsp; 作用：为 Web 应用程序管理 Forms 身份验证服务<br />
２．FormsAuthenticationTicket<br />
　作用：提供对票证的属性和值的访问，这些票证用于 Forms 身份验证对用户进行标识<br />
３．FormsIdentity<br />
　作用：表示一个使用 Forms 身份验证进行了身份验证的用户标识.(用户身份)<br />
４．FormsAuthenticationModule<br />
作用：启用 Forms 身份验证的情况下设置 ASP.NET 应用程序用户的标识<br />
&nbsp;<br />
一、实现简单的验证方式<br />
&nbsp;<br />
首先，我们可以通过配置Web.Config文件来实现简单的验证方式。先建立一个Web工程，然后在首页放登录控件。然后在这个工程下再建立一个目录，在这个目录下添加两个Web页面，设置成这个目录下的页面只有通过验证后再能访问。<br />
在Default.aspx页中，输入用户名和密码，然后Click,如果密码和用户名正确，则通过验证就能转到新建目录下的一个页面上。如果没有通过验证，则不能访问目录下的页面。代码如下：</p>
<div class="codeText">
<div class="codeHead">C#代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>Void&nbsp;Logon_Click(</span><span class="keyword">object</span><span>&nbsp;sender,&nbsp;EventArgs&nbsp;e) &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;String&nbsp;UserName&nbsp;=&nbsp;UserEmail.Text; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;String&nbsp;UserPass&nbsp;=&nbsp;UserPass.Text; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;If(通过连接数据库判断用户和密码是否正确) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>　</span><span class="comment">//将经过身份验证的用户重定向回最初请求的&nbsp;URL&nbsp;或默认&nbsp;URL </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;FormsAuthentication.RedirectFromLoginPage(UserName,&nbsp;Persist.Checkd); &nbsp;&nbsp;</span></li>
    <li class=""><span>　&nbsp;</span><span class="comment">//这个函数是否建立Cookie:解决：建立Cookie </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;Else &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;Msg.Text&nbsp;=&nbsp;Invalid&nbsp;credentials.&nbsp;Please&nbsp;</span><span class="keyword">try</span><span>&nbsp;again.&quot;; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;<br />
&nbsp;然后在建立的目录下，新建一个Web.Config文件</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">configuration</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;　　　　</span><span class="tag">&lt;</span><span class="tag-name">system.web</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;　　　&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">authorization</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　　　</span><span class="tag">&lt;</span><span class="tag-name">deny</span><span>&nbsp;</span><span class="attribute">users</span><span>=</span><span class="attribute-value">&quot;?&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>　　　不充许没经过身份验证的用户进行访问 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;　　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">authorization</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;　　　　</span><span class="tag">&lt;/</span><span class="tag-name">system.web</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">configuration</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
&nbsp;<br />
在这个Web.Config文件中，设置了这个目录下所有文件的授权方式。这是一种URL授权。应用程序根据配置对匿名用户进行检查。ＵＲＬ授权在Web.config中的&lt;authorization&gt;区段内定义。<br />
&lt;authorization&gt;&lt;/authorization&gt;区段中有两个标记，标记&lt;allow&gt;定义了许的用户、任务和操作，在&lt;deny&gt;标记中包含了不被充许的用户、任务和操作。<br />
例如: &lt;allow users = &ldquo;*&rdquo;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;deny users = &ldquo;?&rdquo;&gt;<br />
&nbsp;&nbsp;&nbsp; &ldquo;*&rdquo;代表所有的用户，&ldquo;？&rdquo;表示匿名(没经过身份验证的)用户。<br />
&nbsp;<br />
&nbsp; 在要目下的Web.Config中，我们同时要设置验证方式是基于Forms的</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">authentication</span><span>&nbsp;</span><span class="attribute">mode</span><span>=</span><span class="attribute-value">&quot;Forms&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">forms</span><span>&nbsp;</span><span class="attribute">loginUrl</span><span>=</span><span class="attribute-value">&quot;Logon.aspx&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;.ASPXFORMSAUTH&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">forms</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="tag">&lt;/</span><span class="tag-name">authentication</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="tag">&lt;</span><span class="tag-name">authorization</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">allow</span><span>&nbsp;</span><span class="attribute">users</span><span>=</span><span class="attribute-value">&quot;*&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="tag">&lt;/</span><span class="tag-name">authorization</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp; <br />
&lt;forms&gt;元素的有效属性<br />
Name: 用于身份验证的Http Cookie的名称。<br />
LoginUrl:没有通地验证的用户将要被重定向到的登录页面的URL.<br />
Protection: Cookie数据的保护方法。<br />
TimeOut: Cookie的过期时限，以分钟为单位。默认值为30<br />
Path:Path用于已发出Cookie的路径。默认值为&rdquo;/&rdquo;。<br />
&nbsp;<br />
&nbsp;<br />
二、实现复杂的验证方式（角色控制）<br />
&nbsp;<br />
　　构造GenericPrincipal 和　FormsIdentity　对象<br />
GenericPrincipal :　表示一般用户<br />
FormsIdentity:表示一个使用 Forms 身份验证进行了身份验证的用户标识<br />
FormsIdentity类由 FormsAuthenticationModule在通过 Forms 身份验证对用户进行身份验证时使用。使用从 Forms 身份验证 Cookie 或 URL 解密的 FormsAuthenticationTicket创建一个 FormsIdentity的实例。然后，使用此 FormsIdentity类的新实例构造一个新的 GenericPrincipal 对象，该对象将设置为当前 HttpContext的 User属性的值 <br />
&nbsp; <br />
在Global.asax文件中，添加事件Application_AuthenticateRequest代码：<br />
注：Application_AuthenticateRequest在这个事件中添加自定义身份验证的代码。<br />
&nbsp;<br />
1、页面请求时获得cookie及角色值</p>
<div class="codeText">
<div class="codeHead">C#代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">using</span><span>&nbsp;System.Web.Security; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">using</span><span>&nbsp;System.Security; &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="comment">//这个事件用于页面请求时获得cookie及角色值 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Application_AuthenticationRequest(</span><span class="keyword">object</span><span>&nbsp;sender,&nbsp;EventArgs&nbsp;e) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;...{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//请求传递的Cookie集合中获得窗体身份验证Cookie </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//FormsCookieName:获取用于存储Forms&nbsp;身份验证票证的Cookie&nbsp;名称 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//FormsCookieName&nbsp;用于引用存储FormsAuthenticationTicket&nbsp;信息的Cookie </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">string</span><span>&nbsp;cookiename&nbsp;=&nbsp;FormsAuthentication.FormsCookieName;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//提供创建和操作各HTTP&nbsp;Cookie&nbsp;的类型安全方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//HttpCookie类获取和设置各Cookie&nbsp;的属性 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpCookie&nbsp;cookie&nbsp;=&nbsp;Reauest.Cookies[cookiename];&nbsp;&nbsp;</span><span class="comment">/**/</span><span class="comment">/*从cookiename得到cookie*/</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(cookie&nbsp;==&nbsp;</span><span class="keyword">null</span><span>) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//从窗体身份验证cookie中提取和解密身份验证票据 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormsAuthenticationTicket&nbsp;ticket&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//返回值：一个FormsAuthenticationTicket&nbsp;对象 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ticket&nbsp;=&nbsp;FormsAuthentication.Decrypt(cookie.Value);&nbsp;&nbsp;</span><span class="comment">//cookie:加密的身份验证票 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">catch</span><span>(Exception&nbsp;err) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(ticket&nbsp;==&nbsp;</span><span class="keyword">null</span><span>) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//解析出用户在最初对用户进行身份验证时附加到票上的管道分隔的角色名称列表 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">string</span><span>[]&nbsp;roles&nbsp;=&nbsp;ticket.UserData.Split(</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">char</span><span>[]&nbsp;...{&nbsp;</span><span class="string">'|'</span><span>&nbsp;}); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//创建一个FormsIdentity对象和一个GenericPrincipal对象。前一个对象从票名称中 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//获得用户名，后一个对象将此标识与用户角色列表包含在一起 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormsIdentity&nbsp;ident&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;FormsIdentity(ticket); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericPrincipal&nbsp;princ&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;GenericPrincipal(ident,&nbsp;roles); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpContext.Current.User&nbsp;=&nbsp;princ; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
&nbsp; 2、登录时可以得到用户信息以及是否已经登录　</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">C#代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//验证及得到用户信息 </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Page_Load(</span><span class="keyword">object</span><span>&nbsp;sender,&nbsp;System.EventArgs&nbsp;e) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;...{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormsIdentity&nbsp;userIdentiy; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormsAuthenticationTicket&nbsp;objTecket; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(System.Web.HttpContext.Current.User.Identity.IsAuthenticated) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userIdentiy&nbsp;=&nbsp;HttpContext.Current.User.Identity; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objTecket&nbsp;=&nbsp;userIdentiy.Ticket; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//可以从Ticket中获取用户信息 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write(</span><span class="string">&quot;&lt;script&gt;alert('您没有登陆!');history.back()&lt;/script&gt;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//或者指向登录页面 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Redirect(</span><span class="string">&quot;Login.aspx&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
&nbsp;3、登录时生成用户票据</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">C#代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">string</span><span>&nbsp;Authorization(</span><span class="keyword">string</span><span>&nbsp;username,&nbsp;</span><span class="keyword">string</span><span>&nbsp;password) &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;...{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//用户登录验证 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">string</span><span>&nbsp;ip&nbsp;=&nbsp;System.Web.HttpContext.Current.Request.UserHostAddress; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">string</span><span>&nbsp;name&nbsp;=&nbsp;username; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">string</span><span>&nbsp;pwd&nbsp;=&nbsp;password; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(ValidatePwd(name,&nbsp;pwd)&nbsp;=&nbsp;</span><span class="keyword">true</span><span>)&nbsp;&nbsp;</span><span class="comment">//数据库验证，代码略 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//创建身份验证票证 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormsAuthenticationTicket&nbsp;ticker&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;FormsAuthenticationTicket(1,&nbsp;name,&nbsp;DateTime.Now, &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DateTime.Now.AddMinutes(30),&nbsp;</span><span class="keyword">false</span><span>,&nbsp;</span><span class="string">&quot;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">string</span><span>&nbsp;encryptTicket&nbsp;=&nbsp;FormsAuthentication.Encrypt(ticker); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpCookie&nbsp;cookie&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HttpCookie(FormsAuthentication.FormsCookieName,&nbsp;encryptTicket); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reponse.AppendCookie(cookie); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//将用户重定向到最初的请求页面 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Redirect(FormsAuthentication.GetRedirectUrl(name,&nbsp;</span><span class="keyword">false</span><span>)); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Resonse.Redirect(FormsAuthentication.RedirectFromLoginPage(name,&nbsp;false)); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//this.Session[&quot;UserName&quot;]&nbsp;=&nbsp;username; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write(</span><span class="string">&quot;&lt;script&gt;alert('您的用户名或密码错误');&lt;/script&gt;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>　　解释：</p>
<p>&nbsp;&nbsp;Context.User.Identity.IsAuthenticated</p>
<p>　　Context：获取与该页关联的 System.Web.HttpContext 对象</p>
<p>　　User：为当前 HTTP 请求获取或设置安全信息</p>
<p>　　Identity：获取当前用户的标识</p>
<p>　　IsAuthenticated：获取一个bool值，该值指示是否验证了用户</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=426</link>
      <title><![CDATA[VisualStudio 2008 团队套件简体中文正式版+TFS2008英文正式版BT发布]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2008-2-4 18:14:27</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=426</guid>
      <comments>
              /Blog/Blog.aspx?Id=426#commentbox
            </comments>
      <description><![CDATA[<p><strong>感谢wildfire的放种</strong><br />
VS2008团队套件简体中文正式版<br />
Microsoft.Visual.Studio.Team.System.2008.Team.Suite.Chs-wildfire.iso<br />
Visual Studio Team Foundation Server 2008</p>
<p><strong>下载:</strong><a href="http://download.cnbeta.com/Microsoft.Visual.Studio.Team.System.2008.rar" target="_blank">VisualStudio 2008 团队套件简体中文正式版+TFS2008英文正式版</a></p>]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=422</link>
      <title><![CDATA[asp.net页面间数据传递(总结篇) ]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2008-2-2 15:33:33</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=422</guid>
      <comments>
              /Blog/Blog.aspx?Id=422#commentbox
            </comments>
      <description><![CDATA[<p>当然可以变通下灵活应用来解决问题，但是要选择合适的，常见到滥用Get和Session。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 建议在用Request的时候要指明所取的集合，比如Get方法传来的参数从QueryString集合取,Post的从Form取，cookie从Cookies里取。虽然用Request[]集合，以上几种都可以取到，但是却造成性能上的浪费，本来直接在Form集合中，却遍历了QueryString,Form,Cookies等集合才取出来。</p>
<div>ps:在计算机的世界里，凡是提供服务的一方我们称为伺服端（server），而接受服务的另一方我们称作客户端（client）。</div><p>原文地址：<a href="http://www.cnblogs.com/angelfeather/archive/2008/02/02/1062168.html">http://www.cnblogs.com/angelfeather/archive/2008/02/02/1062168.html</a></p>
<div>1. Get(即使用QueryString显式传递)<br />
&nbsp;&nbsp;&nbsp;&nbsp; 方式：在url后面跟参数。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 特点：简单、方便。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 缺点：字符串长度最长为255个字符；数据泄漏在url中。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 适用数据：简单、少量、关键的数据。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 适用范围：传递给自己、传递给另一个目标页面；常用于2个页面间传递数据。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 用法：例如：url后加?UserID=&hellip;，跳转到目标页面，目标页面在伺服端可用Request.QueryString[&quot;InputText&quot;]获取其指定参数值。</div>
<div>2. Post<br />
&nbsp;&nbsp;&nbsp;&nbsp; 方式：通用的方式。利用form提交。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 特点：最常用的方法。常用技巧是把隐秘的数据存在隐藏域中由form提交。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 适用数据：大量数据，包括文件上传。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 适用范围：同Get方法<br />
&nbsp;&nbsp;&nbsp;&nbsp; 用法：在客户端form指定action目标后submit、在asp.net的伺服端中使用server.Transfer(url)提交；在伺服端中用Request.Form[&quot;FormFieldID&quot;]获取。</div>
<div>3. 页面对象的属性<br />
&nbsp;&nbsp;&nbsp;&nbsp; 方式：asp.net特有方式 。利用HttpContext获取发请求的页面的信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 特点：可以直接存储对象。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 缺点：注意强制转换的类型要正确。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 适用数据：各种数据。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 适用范围：页面之间传递复杂数据。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 用法：获取Context.Handler将其转换为发请求的页面的实例，随后就可以轻松访问其form中的字段、甚至属性。其中的Context是指HttpContext对象，Handler是其属性，Context.Handler的意思可以理解为创建源页类的实例变量，而得到此实例之后，就可以直接访问其中的属性和Public方法了。</div>
<div>4. cookie<br />
&nbsp;&nbsp;&nbsp;&nbsp; 方式：将数据存在客户端的经典方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 缺点：安全性低、受客户端设置限制、一个站点仅存20个cookie，每个容量4096字节。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 有效期：自定义或被用户清除<br />
&nbsp;&nbsp;&nbsp;&nbsp; 适用数据：用户的会话数据(一般是用户名，用户的个性化设置信息等)<br />
&nbsp;&nbsp;&nbsp;&nbsp; 适用范围：单个用户、整个站点所有页面<br />
&nbsp;&nbsp;&nbsp;&nbsp; 用法：引用Request.Cookies（读取信息）、Response.Cookies（写入信息）、或用HttpCookieCollection直接创建Cookie对象。</div>
<div>5. Session<br />
&nbsp;&nbsp;&nbsp;&nbsp; 方式：将用户数据存储在伺服端。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 特点：asp.net中可以设置session的存储方式、位置、SessionID的保存是否依赖cookie。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以直接存储对象。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 缺点：asp.net中有失效的隐患<br />
&nbsp;&nbsp;&nbsp;&nbsp; 有效期：用户活动时间+自定义延迟。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 适用数据：用户的特有信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 适用范围：单个用户、整个站点所有页面。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 用法：Session[&quot;CollectionName&quot;] = value/object;</div>
<div>6. Cache<br />
&nbsp;&nbsp;&nbsp;&nbsp; 方式：将用户数据存储在伺服端数据缓存中。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 特点：可以大大提高效率。 可以直接存储对象。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 缺点：数据更新不及时。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 有效期：应用程序生命周期或自定义。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 适用数据：所有页面、所有用户都可以共享的数据。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 用法：Cache[&quot;CollectionName&quot;] = value|object;</div>
<div>7. Appliction<br />
&nbsp;&nbsp;&nbsp;&nbsp; 方式： 将数据存储于此,相当于全局变量。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 特点：可以直接存储对象。整个站点的共享数据。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 有效期：应用程序生命周期。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 适用数据：所有页面、所有用户共享的数据。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 用法：Appliction[&quot;CollectionName&quot;] = value|object;</div>
<div>8. ViewState<br />
&nbsp;&nbsp;&nbsp;&nbsp; 方式：asp.net特有机制，用来恢复页面状态。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 特点：将页面各控件及其所存数据序列化存在name为_ViewState的隐藏域中。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 缺点：存在HTML中，安全性较低。可以设置加密和验证，但数据量会大增、效率有影响。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 适用数据：页面PostBack需要保存的数据，数据太大会影响页面发送效率。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 适用范围：页面自身数据保存。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 用法：ViewState[&quot;CollectionName&quot;] = value；</div>
<div>9. Static<br />
&nbsp;&nbsp;&nbsp;&nbsp; 方式： 将数据存于静态变量中。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 特点：利于提高效率。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 缺点：若用不好会致使用户或页面间数据紊乱，造成极大的隐患。建议只赋值一次，绝对禁止为单个用户而更改此值。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 适用数据：所有用户共享的数据。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 适用范围：此类所有的页面实例。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 用法：在class中声明静态变量。</div>
<div>整理：<br />
&nbsp;&nbsp;&nbsp;&nbsp; 页面自身保存数据可用的有ViewState,static变量。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 页面之间传递数据常用get,post,HttpContext,当然可以变通一下用于自身数据保存。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 单用户的所有页面数据共享常用session,cookie,当然也可以应用在以上两种情况。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 整个应用程序(所有用户所用页面)的数据共享常用Appliction,cache,static变量。</div>
<div>总结：&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 当然可以变通下灵活应用来解决问题，但是要选择合适的，常见到滥用Get和Session。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 建议在用Request的时候要指明所取的集合，比如Get方法传来的参数从QueryString集合取,Post的从Form取，cookie从Cookies里取。虽然用Request[]集合，以上几种都可以取到，但是却造成性能上的浪费，本来直接在Form集合中，却遍历了QueryString,Form,Cookies等集合才取出来。</div>
<div>ps:在计算机的世界里，凡是提供服务的一方我们称为伺服端（server），而接受服务的另一方我们称作客户端（client）。</div>]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=416</link>
      <title><![CDATA[C#设计模式之 ： Observer （观察者模式）]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2008-1-31 14:55:58</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=416</guid>
      <comments>
              /Blog/Blog.aspx?Id=416#commentbox
            </comments>
      <description><![CDATA[<p>观察者模式（Observer）完美的将观察者和被观察的对象分离开。举个例子，用户界面可以作为一个观察者，业务数据是被观察者，用户界面观察业务数据的变化，发现数据变化后，就显示在界面上。面向对象设计的一个原则是：系统中的每个类将重点放在某一个功能上，而不是其他方面。一个对象只做一件事情，并且将他做好。观察者模式在模块之间划定了清晰的界限，提高了应用程序的可维护性和重用性。 <br />
<br />
观察者模式有很多实现方式，从根本上说，该模式必须包含两个角色：观察者和被观察对象。在刚才的例子中，业务数据是被观察对象，用户界面是观察者。观察者和被观察者之间存在&ldquo;观察&rdquo;的逻辑关联，当被观察者发生改变的时候，观察者就会观察到这样的变化，并且做出相应的响应。如果在用户界面、业务数据之间使用这样的观察过程，可以确保界面和数据之间划清界限，假定应用程序的需求发生变化，需要修改界面的表现，只需要重新构建一个用户界面，业务数据不需要发生变化。</p><p><strong>&ldquo;观察&rdquo;不是&ldquo;直接调用&rdquo; <br />
<br />
</strong>实现观察者模式的时候要注意，观察者和被观察对象之间的互动关系不能体现成类之间的直接调用，否则就将使观察者和被观察对象之间紧密的耦合起来，从根本上违反面向对象的设计的原则。无论是观察者&ldquo;观察&rdquo;观察对象，还是被观察者将自己的改变&ldquo;通知&rdquo;观察者，都不应该直接调用。 <br />
<br />
<strong>实现观察者模式的例子 <br />
<br />
</strong>实现观察者模式有很多形式，比较直观的一种是使用一种&ldquo;注册&mdash;&mdash;通知&mdash;&mdash;撤销注册&rdquo;的形式。下面的三个图详细的描述了这样一种过程： <br />
<br />
1：观察者（Observer）将自己注册到被观察对象（Subject）中，被观察对象将观察者存放在一个容器（Container）里。&nbsp; <br />
<br />
<img height="233" alt="" hspace="5" width="341" align="baseline" src="http://images.cnblogs.com/cnblogs_com/lane_cn/observer1.gif" /> <br />
<br />
2：被观察对象发生了某种变化（如图中的SomeChange），从容器中得到所有注册过的观察者，将变化通知观察者。&nbsp; <br />
<br />
<img height="310" alt="" hspace="5" width="401" align="baseline" src="http://images.cnblogs.com/cnblogs_com/lane_cn/observer2.gif" />&nbsp; <br />
<br />
3：观察者告诉被观察者要撤销观察，被观察者从容器中将观察者去除。&nbsp; <br />
<br />
<img height="251" alt="" hspace="5" width="359" align="baseline" src="http://images.cnblogs.com/cnblogs_com/lane_cn/observer3.gif" /> <br />
<br />
观察者将自己注册到被观察者的容器中时，被观察者不应该过问观察者的具体类型，而是应该使用观察者的接口。这样的优点是：假定程序中还有别的观察者，那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者，当被观察者发生变化的时候，他可以将消息一一通知给所有的观察者。基于接口，而不是具体的实现&mdash;&mdash;这一点为程序提供了更大的灵活性。&nbsp;&nbsp;</p>
<div class="codeText">
<div class="codeHead">使用C#实现观察者模式的例子</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//&ldquo;观察者&rdquo;接口&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">interface</span><span>&nbsp;IObserver&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">void</span><span>&nbsp;Notify(</span><span class="keyword">object</span><span>&nbsp;anObject);&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span class="comment">//&ldquo;被观察对象&rdquo;接口&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">interface</span><span>&nbsp;IObservable&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">void</span><span>&nbsp;Register(IObserver&nbsp;anObserver);&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">void</span><span>&nbsp;UnRegister(IObserver&nbsp;anObserver);&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>观察者和被观察对象都分别从这两个接口实现，所有的操作都是由这两个接口定义的，而不是具体的实现。所以观察者和被观察对象没有绑定在一起。我们可以方便的更改观察者和被观察对象的任意部分而不影响其他部分。 <br />
<br />
下面实现具体的被观察对象。下面的类是所有被观察对象的基类，实现了所有被观察对象都必须的方法。我们使用一个Hashtable作为观察者的容器</p>
<div class="codeText">
<div class="codeHead">C#代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//所有被观察对象的基类&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ObservableImpl&nbsp;:&nbsp;IObservable&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="comment">//保存观察对象的容器&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;Hashtable&nbsp;_observerContainer&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Hashtable();&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="comment">//注册观察者&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Register(IObserver&nbsp;anObserver){&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_observerContainer.Add(anObserver,anObserver);&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="comment">//撤销注册&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;UnRegister(IObserver&nbsp;anObserver){&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_observerContainer.Remove(anObserver);&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="comment">//将事件通知观察者&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;NotifyObservers(</span><span class="keyword">object</span><span>&nbsp;anObject)&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//枚举容器中的观察者，将事件一一通知给他们&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">foreach</span><span>(IObserver&nbsp;anObserver&nbsp;</span><span class="keyword">in</span><span>&nbsp;_observerContainer.Keys)&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;anObserver.Notify(anObject);&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>上面的类不是最终要实现的被观察对象，而是所有被观察者的基类，其中实现了所有观察对象共有的功能。这个类可以干脆定义为abstract，使得程序员不可以创建其实例。接口以及实现这个接口的虚类既保持了类之间松散的耦合，又使多个具体实现可以使用相同的功能。</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">最终实现观察者模式，使用用户界面&mdash;&mdash;业务数据作为例子</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//业务数据（被观察对象）&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;SomeData&nbsp;:&nbsp;ObservableImpl&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="comment">//被观察者中的数据&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">float</span><span>&nbsp;m_fSomeValue;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="comment">//改变数据的属性&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">float</span><span>&nbsp;SomeValue&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">set</span><span>&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_fSomeValue&nbsp;=&nbsp;value;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">base</span><span>.NotifyObservers(m_fSomeValue);</span><span class="comment">//将改变的消息通知观察者&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span class="comment">//用户界面（观察者）&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;SomeKindOfUI&nbsp;:&nbsp;IObserver&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Notify(</span><span class="keyword">object</span><span>&nbsp;anObject){&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;The&nbsp;new&nbsp;value&nbsp;is:&quot;</span><span>&nbsp;+&nbsp;anObject);&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="comment">//实际调用的过程&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;MainClass{&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Main()&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//创建观察者和被观察者&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SomeKindOfUI&nbsp;ui&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SomeKindOfUI();&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SomeData&nbsp;data&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SomeData();&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//在被观察对象中注册观察者&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.Register(ui);&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//改变被观察对象中的数据，这时被观察者会通知观察者&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.SomeValue&nbsp;=&nbsp;1000f;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//注销观察者，停止观察&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stock.UnRegister(stockDisplay);&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp; &nbsp;&nbsp;</span></li>
</ol>
</div>
<p><strong>.NET中更好的实现方式 <br />
<br />
</strong>上面的形式是我们用一种最基本的方式实现了观察者模式，我们为观察者模式开发了一种特定的类型。在.NET框架中，使用代理以及事件，可以更好的实现观察者模式。C#中代理和事件的介绍可以看这一篇文章：在C#中使用代理的方式触发事件，里面有对代理和事件的详细描述，还有例程，这里就不多说了。在.NET支持的其他语言中也有各自的实现方式。 <br />
<br />
在事件的模式下，声明事件的类就是被观察者。被观察者不需要实现对观察者的注册，只需要公开一个事件，而不实行任何操作。被观察者也不需要将自己注册到观察对象中，而是要创建一个特定的代理的实例，将这个代理绑定到某个方法上。用这样的方式注册或者撤销观察者对观察对象的观察。仔细研究代理和事件的模式就不难发现，IObserver和IObservable接口的方法可以减少观察者和观察对象之间的耦合，而代理和事件几乎消除了这两个模块之间的耦合，灵活性提高了很多。</p>
<p><strong><font style="background-color: #ffff00">以上文章来自：</font></strong><a href="http://www.cnblogs.com/lane_cn/articles/73240.html"><strong><font style="background-color: #ffff00">http://www.cnblogs.com/lane_cn/articles/73240.html</font></strong></a></p>
<p><br />
<br />
在C#.Net中，观察者模式就是对事件委托的完美应用。</p>
<div class="codeText">
<div class="codeHead">C#代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">using</span><span>&nbsp;System; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">using</span><span>&nbsp;System.Collections.Generic; &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">using</span><span>&nbsp;System.Text; &nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">using</span><span>&nbsp;System.Threading; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">namespace</span><span>&nbsp;Observer &nbsp;&nbsp;</span></li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;Observer&nbsp;观察者模式&nbsp;入口&nbsp;.这个才是一个真正的有效的产品。由三个对象构成：烧水品，报警器，显示器 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">class</span><span>&nbsp;Program &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Main(</span><span class="keyword">string</span><span>[]&nbsp;args) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Heater&nbsp;heater&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Heater(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Alarm&nbsp;alarm&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Alarm(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heater.BoilEvent&nbsp;+=&nbsp;alarm.Alert;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//注册方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heater.BoilEvent&nbsp;+=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Alarm().Alert;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">////给匿名对象注册方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heater.BoilEvent&nbsp;+=&nbsp;Display.Show;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//注册静态方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heater.BoilWater();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//烧水，会自动调用注册过对象的方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadLine(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} </span>&nbsp;</li>
    <li class="alt"><span>&nbsp;</span></li>
    <li class=""><span>&nbsp;</span></li>
    <li class="alt"><span><span class="preprocessor">&nbsp;&nbsp;&nbsp;&nbsp;#region&nbsp;热水品成品，由三个部件组成一个有效产品 </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;热水器 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">class</span><span>&nbsp;Heater &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;temperature;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//当前水温 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">delegate</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;BoilHandler(</span><span class="keyword">int</span><span>&nbsp;t);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//委托 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">event</span><span>&nbsp;BoilHandler&nbsp;BoilEvent;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//事件 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Heater()&nbsp;{&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;烧水的过程 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;BoilWater() &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;=&nbsp;100;&nbsp;i++) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.Sleep(50);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//摸拟烧水耗时,没到设定值时没有动劲 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temperature&nbsp;=&nbsp;i; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(temperature&nbsp;&gt;&nbsp;92) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.Sleep(1500);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//为了显示明显，增加耗时 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(BoilEvent&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//如果有对象注册 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BoilEvent(temperature);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//调用所有注册对象的方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;报警器 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">class</span><span>&nbsp;Alarm &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Alarm()&nbsp;{&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Alert(</span><span class="keyword">int</span><span>&nbsp;temperature) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;Alarm:嘀嘀嘀，水温已经{0}度了。&quot;</span><span>,temperature); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;显示器 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">class</span><span>&nbsp;Display &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Display()&nbsp;{&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Show(</span><span class="keyword">int</span><span>&nbsp;temperature) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;Display:注意，水温{0}度。&quot;</span><span>,&nbsp;temperature);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} </span>&nbsp;</li>
    <li class="alt"><span>&nbsp;</span></li>
    <li class=""><span><span class="preprocessor">&nbsp;&nbsp;&nbsp;&nbsp;#endregion&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
下面这个是我写的，应该是没有错</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">C#代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">using</span><span>&nbsp;System; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">using</span><span>&nbsp;System.Collections.Generic; &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">using</span><span>&nbsp;System.Text; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">namespace</span><span>&nbsp;Observer &nbsp;&nbsp;</span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;Blog&nbsp;类 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Blog &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Blog()&nbsp;{&nbsp;} </span>&nbsp;</li>
    <li class="alt"><span>&nbsp;</span></li>
    <li class=""><span><span class="preprocessor">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;region&nbsp;Blog类的&nbsp;OnSaved事件&nbsp;设定 </span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">delegate</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;SavedEventHandler(</span><span class="keyword">object</span><span>&nbsp;sender,&nbsp;BlogEventArgs&nbsp;e); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">event</span><span>&nbsp;SavedEventHandler&nbsp;OnSaved; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">virtual</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;OnSavedEvent(BlogEventArgs&nbsp;e) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(OnSaved&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnSaved(</span><span class="keyword">this</span><span>,&nbsp;e); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </span>&nbsp;</li>
    <li class=""><span>&nbsp;</span></li>
    <li class="alt"><span><span class="preprocessor">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endregion </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Save() &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;保存成功！&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnSavedEvent(</span><span class="keyword">new</span><span>&nbsp;BlogEventArgs(401));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//发生保存后的事件 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;日志事件数据传递类 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;BlogEventArgs&nbsp;:EventArgs &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">readonly</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;blogId; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;BlogEventArgs(</span><span class="keyword">int</span><span>&nbsp;blogId) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.blogId&nbsp;=&nbsp;blogId; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;分类&nbsp;类 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Sort &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Sort()&nbsp;{&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;UpdateSortCount(</span><span class="keyword">object</span><span>&nbsp;sender,&nbsp;BlogEventArgs&nbsp;e) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">&quot;this&nbsp;is&nbsp;blogId:{0}&quot;</span><span>,&nbsp;e.blogId); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;应用程序入口 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;总结： </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;1.&nbsp;定的义事件一定要在相应的方法内触发； </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;2.&nbsp;别的类里的方法要在相应的方法执行前挂接到事件上。 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Door &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Main() &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Blog&nbsp;blog&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Blog(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;blog.OnSaved&nbsp;+=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Sort().UpdateSortCount;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//调用别的类里的方法，多个方法直接+= </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;blog.Save(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadLine(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=415</link>
      <title><![CDATA[C#设计模式之：Singleton（单例模式）]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2008-1-31 10:25:19</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=415</guid>
      <comments>
              /Blog/Blog.aspx?Id=415#commentbox
            </comments>
      <description><![CDATA[<p class="MsoNormal" style="mso-outline-level: 2"><strong style="mso-bidi-font-weight: normal"><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">场景<span lang="EN-US"><o:p></o:p></span></span></strong></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">我们现在要做一个网络游戏的服务端程序，需要考虑怎么样才能承载大量的用户。在做<span lang="EN-US">WEB</span>程序的时候有各种负载均衡的方案，不管是通过硬件实现还是软件实现，基本的思想就是有一个统一的入口，然后由它来分配用户到各个服务器上去。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">需要考虑的问题是，即使在多线程的并发状态下，用户只能通过一个唯一的入口来分配，由此引入了<span lang="EN-US">Singleton</span>模式来实现这个唯一的入口。</span></p><p class="MsoNormal" style="text-align: center; mso-outline-level: 1" align="center"><span style="font-size: 16pt; font-family: 微软雅黑">无废话<span lang="EN-US">C#</span>设计模式之二：<span lang="EN-US">Singleton<br />
<br />
<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: center" align="center"><span lang="EN-US" style="font-size: 16pt; font-family: 微软雅黑"><o:p></o:p></span></p>
<p class="MsoNormal" style="mso-outline-level: 2"><strong style="mso-bidi-font-weight: normal"><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">原文地址：<a href="http://www.cnblogs.com/lovecherry/archive/2007/10/05/914653.html">http://www.cnblogs.com/lovecherry/archive/2007/10/05/914653.html</a><br />
<br />
意图<span lang="EN-US"><o:p></o:p></span></span></strong></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">保证一个类只有一个实例，并提供访问它的全局访问点。<strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><o:p></o:p></span></strong></span></p>
<p class="MsoNormal" style="mso-outline-level: 2"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></strong><strong style="mso-bidi-font-weight: normal"><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">场景<span lang="EN-US"><o:p></o:p></span></span></strong></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">我们现在要做一个网络游戏的服务端程序，需要考虑怎么样才能承载大量的用户。在做<span lang="EN-US">WEB</span>程序的时候有各种负载均衡的方案，不管是通过硬件实现还是软件实现，基本的思想就是有一个统一的入口，然后由它来分配用户到各个服务器上去。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">需要考虑的问题是，即使在多线程的并发状态下，用户只能通过一个唯一的入口来分配，由此引入了<span lang="EN-US">Singleton</span>模式来实现这个唯一的入口。</span></p>
<p class="MsoNormal">&nbsp;</p>
<div class="codeText">
<div class="codeHead">C#代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">using</span><span>&nbsp;System; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">using</span><span>&nbsp;System.Collections.Generic; &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">using</span><span>&nbsp;System.Text; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">using</span><span>&nbsp;System.Threading; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">namespace</span><span>&nbsp;Singleton &nbsp;&nbsp;</span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;入口类 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">class</span><span>&nbsp;Program &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Main(</span><span class="keyword">string</span><span>[]&nbsp;args) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ParameterizedThreadStart&nbsp;ts&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ParameterizedThreadStart(EnterPlayer); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//20个玩家会平均分配到不同的服务器上，如果用户过多就要增加服务器的数量了 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;20;&nbsp;i++) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;t&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Thread(ts); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.Start(</span><span class="keyword">string</span><span>.Concat(</span><span class="string">&quot;player_&quot;</span><span>,i)); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoadBalanceServer.GetLoadBalanceServer().ShowServerInfo();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//显示玩家信息 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadLine(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;玩家进入，由负载均衡服务器分配至相应大厅 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;param&nbsp;name=&quot;playerName&quot;&gt;&lt;/param&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;EnterPlayer(</span><span class="keyword">object</span><span>&nbsp;playerName) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoadBalanceServer&nbsp;loadBalanceServer&nbsp;=&nbsp;LoadBalanceServer.GetLoadBalanceServer();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//获取入口，即负载均衡服务器入口 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadBalanceServer.GetLobbyServer().EnterPlayer(playerName.ToString());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//入口，分配玩家至游戏服务大厅&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} </span>&nbsp;</li>
    <li class="alt"><span>&nbsp;</span></li>
    <li class=""><span>&nbsp;</span></li>
    <li class="alt"><span><span class="preprocessor">&nbsp;&nbsp;&nbsp;&nbsp;#region&nbsp;LoadBalanceServer&nbsp;负载均衡服务器类&nbsp;单件类 </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;负载均衡服务器，实现了Singleton模式 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">class</span><span>&nbsp;LoadBalanceServer &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">const</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;SERVER_COUNT&nbsp;=&nbsp;3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//大厅服务器数量定义 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;List&lt;LobbyServer&gt;&nbsp;_lobbyList&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;List&lt;LobbyServer&gt;();&nbsp;&nbsp;&nbsp;</span><span class="comment">//大厅服务器集合 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//volatile关键字可以保证对特殊地址的稳定访问，每次都从原始内存中读取，而不进行优化处理 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;volatile&nbsp;LoadBalanceServer&nbsp;loadBalanceServer;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//懒汉模式[载入类时不实例化单件，使用时才实例化单件，饿汉相反] </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">object</span><span>&nbsp;syncLock&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">object</span><span>();&nbsp;</span><span class="comment">//线程锁 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;禁止实例化的构造，载入类时，创建大厅服务器集合 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;LoadBalanceServer() &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;SERVER_COUNT;&nbsp;i++) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_lobbyList.Add(</span><span class="keyword">new</span><span>&nbsp;LobbyServer(</span><span class="keyword">string</span><span>.Concat(</span><span class="string">&quot;LobbyServer&quot;</span><span>,i))); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;获取单件&lt;LoadBalanceServer&gt;实例，双重锁定方式实现 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;returns&gt;&lt;/returns&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;LoadBalanceServer&nbsp;GetLoadBalanceServer() &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(loadBalanceServer&nbsp;==&nbsp;</span><span class="keyword">null</span><span>) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">lock</span><span>&nbsp;(syncLock) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(loadBalanceServer&nbsp;==&nbsp;</span><span class="keyword">null</span><span>) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.Sleep(100);&nbsp;&nbsp;</span><span class="comment">//模拟高并发的情况，在正式代码中没有必要这样做 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadBalanceServer&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;LoadBalanceServer();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//创建自已，反身关联 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;loadBalanceServer; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;返回一个压力最小的LobbyServer对象 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;returns&gt;&lt;/returns&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;LobbyServer&nbsp;GetLobbyServer() &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LobbyServer&nbsp;lobbyServer&nbsp;=&nbsp;_lobbyList[0];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//默认大厅定义第一台服务器 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;SERVER_COUNT;&nbsp;i++) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(_lobbyList[i].PlayList.Count&nbsp;&lt;&nbsp;lobbyServer.PlayList.Count) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lobbyServer&nbsp;=&nbsp;_lobbyList[i]; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;lobbyServer; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;显示所有服务器大厅及玩家信息 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;ShowServerInfo() &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">foreach</span><span>&nbsp;(LobbyServer&nbsp;ls&nbsp;</span><span class="keyword">in</span><span>&nbsp;_lobbyList) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="keyword">string</span><span>.Concat(</span><span class="string">&quot;==============&quot;</span><span>,&nbsp;ls.LobbyName,&nbsp;</span><span class="string">&quot;==============&quot;</span><span>)); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">foreach</span><span>&nbsp;(</span><span class="keyword">string</span><span>&nbsp;player&nbsp;</span><span class="keyword">in</span><span>&nbsp;ls.PlayList) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(player); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} </span>&nbsp;</li>
    <li class="alt"><span>&nbsp;</span></li>
    <li class=""><span><span class="preprocessor">&nbsp;&nbsp;&nbsp;&nbsp;#endregion </span>&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li class=""><span>&nbsp;</span></li>
    <li class="alt"><span><span class="preprocessor">&nbsp;&nbsp;&nbsp;&nbsp;#region&nbsp;LobbyServer&nbsp;服务大厅类，非静态类，必须实例化后使用 </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;服务大厅。每一台服务器有一个服务大厅，即本服务器的入口。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">class</span><span>&nbsp;LobbyServer &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;List&lt;</span><span class="keyword">string</span><span>&gt;&nbsp;_playList&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;List&lt;</span><span class="keyword">string</span><span>&gt;();&nbsp;&nbsp;</span><span class="comment">//玩家集合 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">string</span><span>&nbsp;_lobbyName;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//大厅名称(即游戏服务器名)，唯一标识 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;默认构造 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;param&nbsp;name=&quot;serverName&quot;&gt;&lt;/param&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;LobbyServer(</span><span class="keyword">string</span><span>&nbsp;lobbyName) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_lobbyName&nbsp;=&nbsp;lobbyName; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;玩家加入 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;/summary&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">///&nbsp;&lt;param&nbsp;name=&quot;playerName&quot;&gt;&lt;/param&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;EnterPlayer(</span><span class="keyword">string</span><span>&nbsp;playerName) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_playList.Add(playerName); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">string</span><span>&nbsp;LobbyName &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">get</span><span>&nbsp;{</span><span class="keyword">return</span><span>&nbsp;_lobbyName&nbsp;;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;List&lt;</span><span class="keyword">string</span><span>&gt;&nbsp;PlayList &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">get</span><span>&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;_playList;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} </span>&nbsp;</li>
    <li class=""><span>&nbsp;</span></li>
    <li class="alt"><span><span class="preprocessor">&nbsp;&nbsp;&nbsp;&nbsp;#endregion </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
<p class="MsoNormal" style="mso-outline-level: 2"><strong style="mso-bidi-font-weight: normal"><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">代码说明<span lang="EN-US"><o:p></o:p></span></span></strong></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-indent: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">LoadBalanceServer</span><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">类实现了<span lang="EN-US">Singleton</span>模式，也就是说无论在什么情况下，只会有一个<span lang="EN-US">LoadBalanceServer</span>类的实例出现。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-indent: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">LobbyServer</span><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">类表示大厅服务，用户进入大厅后和大厅服务进行服务，在这里我们仅仅在大厅服务里面保存了用户列表。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-indent: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">Singleton</span><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">模式有很多实现方式，在这里使用的是双重锁定方式。对于<span lang="EN-US">C#</span>来说，可能使用静态初始化方式是最简洁的，这里就不演示了。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-indent: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">LoadBalanceServer</span><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">类的<span lang="EN-US">GetLobbyServer()</span>方法负责返回一个压力最小的<span lang="EN-US">LobbyServer</span>对象。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-indent: -21pt; text-align: left; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt" align="left"><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">实例化<span lang="EN-US">LoadBalanceServer</span>的时候<span lang="EN-US">Sleep</span>了线程，目的是模拟高并发的情况，在正式代码中没有必要这样做。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="mso-outline-level: 2"><strong style="mso-bidi-font-weight: normal"><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">何时采用<span lang="EN-US"><o:p></o:p></span></span></strong></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-indent: -21pt; mso-list: l0 level1 lfo3; tab-stops: list 42.0pt"><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">从代码角度来说，当你希望类只有一个实例的时候。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-indent: -21pt; mso-list: l0 level1 lfo3; tab-stops: list 42.0pt"><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">从应用角度来说，你希望有一个总管来负责某一件事情。并且这件事情的分配只能有一个人进行，如果有多个人进行肯定会弄乱。比如创建处理流水号如果有两个地方在创建的话是不是就会重复了呢？<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="mso-outline-level: 2"><strong style="mso-bidi-font-weight: normal"><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">实现要点<span lang="EN-US"><o:p></o:p></span></span></strong></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-indent: -21pt; mso-list: l2 level1 lfo2; tab-stops: list 42.0pt"><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">一个<span lang="EN-US">Singleton</span>类，它能确保自身的实例是唯一的。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="mso-outline-level: 2"><strong style="mso-bidi-font-weight: normal"><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">注意事项<span lang="EN-US"><o:p></o:p></span></span></strong></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-indent: -21pt; mso-list: l2 level1 lfo2; tab-stops: list 42.0pt"><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">不要滥用<span lang="EN-US">Singleton</span>模式，只有非一个实例不可的情况下才考虑引入<span lang="EN-US">Singleton</span>。否则，程序的可扩展性可能会受到限制。</span></p>
<p><span lang="EN-US"><o:p>-----------------------------------------------------------<br />
1. <font face="Verdana">整个系统中存在<font color="#ff0000">一个实例<br />
</font>2. 在系统的任何角落都可以访问它<br />
(在一个系统中往往只有一个工厂，这样我们可以引入单件模式来解决这个问题。 )<br />
<br />
<br />
</font><br />
</o:p></span></p>]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=410</link>
      <title><![CDATA[设计模式－开篇－.NET中的一些常用设计模式： 索引 ]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2008-1-30 11:12:46</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=410</guid>
      <comments>
              /Blog/Blog.aspx?Id=410#commentbox
            </comments>
      <description><![CDATA[<p><span><span><strong><span><a target="_blank" href="/Blog.aspx?BlogId=415"><font color="#ff6600"><strong>Singleton Pattern</strong></font><font color="#ff6600"><strong>&nbsp;（单例模式）</strong></font></a></span></strong></span></span></p>
<p><span><a target="_blank" href="/Blog.aspx?BlogId=416"><strong><font color="#ff6600"><span>Oberver Pattern （观察者模式） </span><span>委托和事件的应用</span></font></strong></a></span></p>
<p><span><span><a target="_blank" href="/Blog.aspx?BlogId=420"><strong><span><font color="#ff6600">C#设计模式之：总结(针对GOF23)</font> </span></strong></a></span></span></p><p><span><span><strong>&nbsp;<span><a target="_blank" href="/Blog.aspx?BlogId=406"><font color="#ff6600">开篇</font></a></span></strong></span></span></p>
<p><span><a target="_blank" href="/Blog.aspx?BlogId=415"><font color="#ff6600"><strong>Singleton Pattern</strong></font><font color="#ff6600"><strong>&nbsp;（单例模式）</strong></font></a></span></p>
<p><span><a target="_blank" href="/Blog.aspx?BlogId=416"><strong><font color="#ff6600"><span>Oberver Pattern （观察者模式） </span><span>委托和事件的应用</span></font></strong></a></span></p>
<p><span><span>Factory Method</span><span>：</span><span>IHttpHandlerFactory</span></span></p>
<p><span>Adapter Pattern</span><span>：</span><span>COM Interop</span><span>、</span><span>DataAdapter</span></p>
<p><span>Decorator Pattern</span><span>：</span><span>BufferedStream</span><span>、</span><span>CryptoStream</span></p>
<p><span>Composite Pattern</span><span>：</span><span>Enterprise Library2.0</span><span>中的</span><span>ObjectBuilder</span></p>
<p><span>Facade Pattern</span><span>：</span><span>Duwamish</span></p>
<p><span>Flyweight Pattern</span><span>：</span><span>.NET</span><span>中的</span><span>String</span><span>类型</span></p>
<p><span>Template Method</span><span>：服务器控件</span></p>
<p><span>Command Pattern</span><span>：</span><span>MVC</span></p>
<p><span>Iterator Pattern</span><span>：</span><span>IEnumerator</span></p>
<p><span>Strategy Patterm</span><span>：</span><span>System.Configuration.Provider</span><span>、</span><span>IComparer</span></p>
<p>&nbsp;<span><span><a target="_blank" href="/Blog.aspx?BlogId=420"><strong><span><font color="#ff6600">C#设计模式之：总结(针对GOF23)</font> </span></strong></a></span></span></p>]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=398</link>
      <title><![CDATA[System.Diagnostics命名空间里的Debug类和Trace类的用途]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2007-12-3 16:04:11</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=398</guid>
      <comments>
              /Blog/Blog.aspx?Id=398#commentbox
            </comments>
      <description><![CDATA[在&nbsp; .NET&nbsp; 类库中有一个&nbsp; System.Diagnostics&nbsp; 命名空间，该命名空间提供了一些与系统进程、事件日志、和性能计数器进行交互的类库。当中包括了两个对开发人员而言十分有用的类——Debug类和Trace类。本文介绍了这两个类的一些基本用途，旨在提高广大开发人员的开发效率。&nbsp; <BR> 使用Debug类来帮助调试&nbsp; </P><P> 调试程序对每个程序员来说是家常便饭。可是我们会经常遇到一些情况让我们头疼，例如：&nbsp; </P><P> 当我们在开发一个界面控件的时候，简单的设断点会增加Paint事件的响应次数，而造成的环境参数改变。&nbsp; <BR> 断点设多了，程序常常停在正常运行的地方；这样一来，调试一个错误要花费大量时间去寻找错误。&nbsp; <BR> 这时，我们就需要利用System.Diagnostics.Debug类来帮助我们调试。我们可以通过调用Debug.WriteLine(String&nbsp; message)函数，将我们所关心的信息打印在Visual&nbsp; Studio&nbsp; IDE的Output窗口中。也可以利用Debug.Assert(bool&nbsp; condition)来让程序停在错误的地方，并且显示Call&nbsp; stack。&nbsp; </P><P> Debug类中所有函数的调用都不会在Release版本里有效。也就是说，我们通过这种方法所加的代码可以仅用于调试；在发布的时候无需删任何代码，就可以给用户一个没有调试指令的程序了。&nbsp; <BR> 在&nbsp; .NET&nbsp; 类库中有一个&nbsp; System.Diagnostics&nbsp; 命名空间，该命名空间提供了一些与系统进程、事件日志、和性能计数器进行交互的类库。当中包括了两个对开发人员而言十分有用的类——Debug类和Trace类。本文介绍了这两个类的一些基本用途，旨在提高广大开发人员的开发效率。&nbsp; <BR> 使用Debug类来帮助调试&nbsp; </P><P> 调试程序对每个程序员来说是家常便饭。可是我们会经常遇到一些情况让我们头疼，例如：&nbsp; </P><P> 当我们在开发一个界面控件的时候，简单的设断点会增加Paint事件的响应次数，而造成的环境参数改变。&nbsp; <BR> 断点设多了，程序常常停在正常运行的地方；这样一来，调试一个错误要花费大量时间去寻找错误。&nbsp; <BR> 这时，我们就需要利用System.Diagnostics.Debug类来帮助我们调试。我们可以通过调用Debug.WriteLine(String&nbsp; message)函数，将我们所关心的信息打印在Visual&nbsp; Studio&nbsp; IDE的Output窗口中。也可以利用Debug.Assert(bool&nbsp; condition)来让程序停在错误的地方，并且显示Call&nbsp; stack。&nbsp; </P><P> Debug类中所有函数的调用都不会在Release版本里有效。也就是说，我们通过这种方法所加的代码可以仅用于调试；在发布的时候无需删任何代码，就可以给用户一个没有调试指令的程序了。&nbsp; </P><P> <BR> 下面的这个例子演示了这两个函数来帮助调试的方法：&nbsp; </P><P> 1、&nbsp; 新建一个Visual&nbsp; Studio&nbsp; C#&nbsp; Project，采用默认的项目名。&nbsp; </P><P> 2、&nbsp; 往Form1上拖一个label，并采用其缺省ID。&nbsp; </P><P> 3、&nbsp; 在Form1.cs中的Form1类中添加下面的函数代码：&nbsp; </P><P> private&nbsp; int&nbsp; time=0;&nbsp; <BR> protected&nbsp; override&nbsp; void&nbsp; OnPaint(PaintEventArgs&nbsp; e)&nbsp; <BR> {&nbsp; <BR> time++;&nbsp; <BR> this.label1.Text=&#34;OnPain&nbsp; called&nbsp; &#34;+time.ToString()+&#34;&nbsp; Times.&#34;;&nbsp; <BR> }&nbsp; </P><P> protected&nbsp; override&nbsp; void&nbsp; OnResize(EventArgs&nbsp; e)&nbsp; <BR> {&nbsp; <BR> System.Diagnostics.Debug.Assert(this.Width&gt;200,&#34;Width&nbsp; should&nbsp; be&nbsp; larger&nbsp; than&nbsp; 200.&#34;);&nbsp; <BR> System.Diagnostics.Debug.WriteLine(Size.ToString());&nbsp; <BR> }&nbsp; </P><P> 4、&nbsp; 编译并运行项目的Debug版本。&nbsp; </P><P> 5、&nbsp; 切换Visual&nbsp; Studio&nbsp; .NET&nbsp; IDE到Output窗口。&nbsp; </P><P> 6、&nbsp; 切换到刚才的程序，改变主窗口的大小，您可以在IDE中看到Form1窗口的实时大小，并在Form1上看到OnPaint被调用的次数。当窗口的宽度小于等于200个像素的时候，系统会弹出一个Assertion&nbsp; Fail的对话框。里面显示了当前程序的Call&nbsp; Stack。如果您在OnPaint中设置了断点，想要调试程序的话，那么您会进入一个死循环，直到您停止调试。&nbsp; </P><P> <BR> Debug类和Trace类的区别&nbsp; </P><P> 您一定发现了在System.Diagnostics命名空间中还有一个名为Trace的类。它的函数功能和Debug非常相似。为什么要有这样两个功能类似的类呢？&nbsp; </P><P> 原因是这样的，Debug类里所提供的函数仅在编译时带#Debug宏参数才奏效，一旦到了Release版本中，这些函数都会被忽略。也就是说Debug类的功能仅在程序员开发的时候能用。而Trace则不同，它能在Release版本的程序中也被运行，这样程序员就可以在Release版本的程序中添加一些Debug类提供的功能了。&nbsp; </P><P> 使用Trace类来做程序日志&nbsp; </P><P> 接下来的问题就是：我们程序员能利用Trace类的功能做些什么呢？我们可以用它来做程序的日志。&nbsp; </P><P> 1、&nbsp; 打开刚刚的project。&nbsp; </P><P> 2、&nbsp; 用下面的代码覆盖刚才第2步的代码：&nbsp; </P><P> private&nbsp; void&nbsp; Calculate()&nbsp; <BR> {&nbsp; <BR> int&nbsp; a=1,b=1;&nbsp; <BR> try&nbsp; <BR> {&nbsp; <BR> System.Random&nbsp; r&nbsp; =&nbsp; new&nbsp; Random();&nbsp; <BR> while&nbsp; (true)&nbsp; <BR> {&nbsp; <BR> a=(int)(r.NextDouble()*10);&nbsp; <BR> b=(int)(r.NextDouble()*10);&nbsp; <BR> System.Diagnostics.Trace.WriteLine(System.DateTime.Now.ToString()+&#34;:&nbsp; &#34;+&nbsp; <BR> a.ToString()+&#34;/&#34;+b.ToString()+&#34;=&#34;+(a/b).ToString());&nbsp; <BR> }&nbsp; <BR> }&nbsp; <BR> catch&nbsp; (Exception&nbsp; ex)&nbsp; <BR> {&nbsp; <BR> System.Diagnostics.Trace.WriteLine(System.DateTime.Now.ToString()+&#34;:&nbsp; &#34;+a.ToString()+&nbsp; <BR> &#34;/&#34;+b.ToString()+&#34;=&#34;+&#34;&nbsp; ERROR:&nbsp; &#34;+ex.Message);&nbsp; <BR> MessageBox.Show(ex.Message);&nbsp; <BR> }&nbsp; <BR> }&nbsp; </P><P> 3、&nbsp; 在构造函数Form1()的最后添加下面的代码，将Trace的输出重定向到app.log文件中：&nbsp; </P><P> System.Diagnostics.Trace.Listeners.Clear();&nbsp; <BR> System.Diagnostics.Trace.AutoFlush=true;&nbsp; <BR> System.Diagnostics.Trace.Listeners.Add(new&nbsp; System.Diagnostics.TextWriterTraceListener(&#34;app.log&#34;));&nbsp; </P><P> 4、&nbsp; 拖一个按钮到该Form上，双击按钮，在button1_Click函数中添加如下代码：&nbsp; </P><P> Calculate();&nbsp; <BR> Application.Exit();&nbsp; </P><P> 5、&nbsp; 运行该程序的Release版本，点击添加的按钮，程序便开始执行一位随机数除法。由于是随机数，可能会出现出数为0的情况，这样程序就会抛出Exception，这是程序会自动中止。&nbsp; </P><P> 6、&nbsp; 在该程序所在的目录里您可以发现出现了一个新的文件app.log，里面记录了各个时刻的运算纪录，并把Exception纪录在日志中。&nbsp; </P><P> 小结&nbsp; </P><P> 利用&nbsp; System.Diagnostics.Debug&nbsp; 类和&nbsp; System.Diagnostics.Trace&nbsp; 类可以帮助程序员方便地进行调试程序并检测程序运行情况。&nbsp; </P><P> Debug类的所有调用仅在程序的Debug版本中有效；而Trace类的调用能在Release版本和Debug版本中都有效。]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=393</link>
      <title><![CDATA[asp.net 线程休眠会不会消耗CPU]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2007-10-19 10:07:29</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=393</guid>
      <comments>
              /Blog/Blog.aspx?Id=393#commentbox
            </comments>
      <description><![CDATA[在ASP里执行1000W次For循环大约是5.2X秒的时间（CPU消耗为方波）<BR> 在ASP.Net里执行1000W次的For循环大约是300毫秒左右（CPU消耗为尖波）<BR> 在ASP.net里执地6000毫秒的休眠，执行的时间为5秒钟，（CPU消耗看不出来）</P><P> －－－－－－－－－－－－－<BR> Dim&nbsp; t1<BR> t1&nbsp; =&nbsp; timer()</P><P> <BR> Call&nbsp; &nbsp; test()<BR> 在ASP里执行1000W次For循环大约是5.2X秒的时间（CPU消耗为方波）<BR> 在ASP.Net里执行1000W次的For循环大约是300毫秒左右（CPU消耗为尖波）<BR> 在ASP.net里执地6000毫秒的休眠，执行的时间为5秒钟，（CPU消耗看不出来）</P><P> －－－－－－－－－－－－－<BR> Dim&nbsp; t1<BR> t1&nbsp; =&nbsp; timer()</P><P> <BR> Call&nbsp; &nbsp; test()</P><P> Response.write&nbsp; timer()&nbsp; -&nbsp; t1</P><P> Function&nbsp; test()</P><P> &nbsp; &nbsp; &nbsp; &nbsp; For&nbsp; i&nbsp; =&nbsp; 0&nbsp; To&nbsp; 10000000<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Response.write&nbsp; &#34;&#34;<BR> &nbsp; &nbsp; &nbsp; &nbsp; Next&nbsp; </P><P> End&nbsp; Function&nbsp; </P><P> －－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P><P> using&nbsp; System;<BR> using&nbsp; System.Data;<BR> using&nbsp; System.Configuration;<BR> using&nbsp; System.Collections;<BR> using&nbsp; System.Web;<BR> using&nbsp; System.Web.Security;<BR> using&nbsp; System.Web.UI;<BR> using&nbsp; System.Web.UI.WebControls;<BR> using&nbsp; System.Web.UI.WebControls.WebParts;<BR> using&nbsp; System.Web.UI.HtmlControls;</P><P> using&nbsp; System.Threading;</P><P> namespace&nbsp; Test.Web<BR> {<BR> &nbsp; &nbsp; &nbsp; &nbsp; public&nbsp; partial&nbsp; class&nbsp; _Default&nbsp; :&nbsp; System.Web.UI.Page<BR> &nbsp; &nbsp; &nbsp; &nbsp; {<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; protected&nbsp; void&nbsp; Page_Load(object&nbsp; sender,&nbsp; EventArgs&nbsp; e)<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DateTime&nbsp; dt1&nbsp; =&nbsp; DateTime.Now;</P><P> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //for&nbsp; (int&nbsp; i&nbsp; =&nbsp; 0;&nbsp; i&nbsp; &lt;&nbsp; 100000000;&nbsp; i++)<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //{</P><P> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; &nbsp; &nbsp; &nbsp; Response.Write(&#34;&#34;);</P><P> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //}</P><P> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Thread.Sleep(6000);</P><P> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TimeSpan&nbsp; ts&nbsp; =&nbsp; DateTime.Now&nbsp; -&nbsp; dt1;<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Response.Write(ts.Seconds.ToString());<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<BR> &nbsp; &nbsp; &nbsp; &nbsp; }<BR> }</P><P> <BR> 结论：仁人仁智]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=388</link>
      <title><![CDATA[通过对DNT的源码分析深化自己的面向对象开发思维]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2007-9-18 10:17:57</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=388</guid>
      <comments>
              /Blog/Blog.aspx?Id=388#commentbox
            </comments>
      <description><![CDATA[DNT是discuz的又一&#34;力作&#34;,前些时间还发布了源代码,为向&#34;开源&#34;迈进踏出坚实的一步.通过仔细阅读它的源代码,分析整个项目的结构,可以令人思维能力上升到一个新的高度.下面我们就来解剖一下这个&#34;力作&#34;吧</P><P> 使用visual&nbsp; studio&nbsp; 2005打开工程.出现在我们眼前的结构令人顿时有庞然大物扑面而来之感.花了不少时间适应了它的&#34;结构&#34;,就想先来看看Common里有什么吧.由于篇幅有限,我们就只挑了一两个地方出来和大家共赏了</P><P> 首先,从结构上来看,它把一众输入输出的操作封装到Common里,例如Request,它给我最大的感觉就是HttpContext无处不在.这就好象你封装了一个类,然后又在类的内部使用类外部的变量/方法等等.大家觉得这种封装有意义么.由这个地方,我们可以深切地感受到<font color="#FF0000">如何创建一个有意义的类,如何设计你的类使它具有良好的输入输出接口并有绝对的外界无关性.</font>这是一个很好的反面例子.</P><P> 接着我们再来看Utils类,咋一看此类内容,我恍惚以为自己在看asp程序代码,封装了一大堆对字符串的操作等等,美其名曰:工具类.当然,这个类里还是少不了HttpContext的.呵呵<BR> 在这里,我们又学到了一样东西,<font color="#A52A2A">不能归为一个物体拥有的方法或属性千万不要强归在一起并拼凑出一个也许并不存在的物体</font></P><P> 打开XmlWriter.cs,一开始我还以为和我朋友一样,因为XmlDocument的性能较低,所以选择了自己封装Xml操作对象呢.一看才知道是为了其他目的封装了一个大杂烩,其中既有一个内部的XmlDocument实例,又有其他毫无关联的属性和方法.更有甚者,它又定义了一些类似XmlDocument对象自身方法的方法,例如AppendChildElement等,在这些方法里又有传递XmlDocument对象参数.伟大的先辈们教育我们:<font color="#FF0000">要扩展一类物体功能,不能以改变物体来达到目的,所以我们需要继承</font><BR> DNT是discuz的又一&#34;力作&#34;,前些时间还发布了源代码,为向&#34;开源&#34;迈进踏出坚实的一步.通过仔细阅读它的源代码,分析整个项目的结构,可以令人思维能力上升到一个新的高度.下面我们就来解剖一下这个&#34;力作&#34;吧</P><P> 使用visual&nbsp; studio&nbsp; 2005打开工程.出现在我们眼前的结构令人顿时有庞然大物扑面而来之感.花了不少时间适应了它的&#34;结构&#34;,就想先来看看Common里有什么吧.由于篇幅有限,我们就只挑了一两个地方出来和大家共赏了</P><P> 首先,从结构上来看,它把一众输入输出的操作封装到Common里,例如Request,它给我最大的感觉就是HttpContext无处不在.这就好象你封装了一个类,然后又在类的内部使用类外部的变量/方法等等.大家觉得这种封装有意义么.由这个地方,我们可以深切地感受到<font color="#FF0000">如何创建一个有意义的类,如何设计你的类使它具有良好的输入输出接口并有绝对的外界无关性.</font>这是一个很好的反面例子.</P><P> 接着我们再来看Utils类,咋一看此类内容,我恍惚以为自己在看asp程序代码,封装了一大堆对字符串的操作等等,美其名曰:工具类.当然,这个类里还是少不了HttpContext的.呵呵<BR> 在这里,我们又学到了一样东西,<font color="#A52A2A">不能归为一个物体拥有的方法或属性千万不要强归在一起并拼凑出一个也许并不存在的物体</font></P><P> 打开XmlWriter.cs,一开始我还以为和我朋友一样,因为XmlDocument的性能较低,所以选择了自己封装Xml操作对象呢.一看才知道是为了其他目的封装了一个大杂烩,其中既有一个内部的XmlDocument实例,又有其他毫无关联的属性和方法.更有甚者,它又定义了一些类似XmlDocument对象自身方法的方法,例如AppendChildElement等,在这些方法里又有传递XmlDocument对象参数.伟大的先辈们教育我们:<font color="#FF0000">要扩展一类物体功能,不能以改变物体来达到目的,所以我们需要继承</font></P><P> 由于时间的关系,就先这么多吧,至于其他的string&nbsp; to&nbsp; int不知道用int自身方法<BR> 甚至还到处使用new&nbsp; Regex这些就不说了.分析到这里我已经有了80%的asp意味<BR> 唉,由此可见,能吹牛往往比能学习的更吸引别人注意的.&nbsp; ]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=387</link>
      <title><![CDATA[有关.NET中序列化的一些知识 ]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2007-9-12 16:06:22</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=387</guid>
      <comments>
              /Blog/Blog.aspx?Id=387#commentbox
            </comments>
      <description><![CDATA[&nbsp; &nbsp; “序列化”可被定义为将对象的状态存储到存储媒介中的过程。在此过程中，对象的公共字段和私有字段以及类的名称（包括包含该类的程序集）都被转换为字节流，然后写入数据流。在以后“反序列化”该对象时，创建原始对象的精确复本。<BR> 一、为什么要选择序列化<BR> &nbsp; &nbsp; &nbsp; &nbsp; 一个原因是将对象的状态保持在存储媒体中，以便可以在以后重新创建精确的副本；<BR> &nbsp; &nbsp; &nbsp; &nbsp; 另一个原因是通过值将对象从一个应用程序域发送到另一个应用程序域中。<BR> &nbsp; &nbsp; &nbsp; &nbsp; 例如，序列化可用于在&nbsp; ASP.NET&nbsp; 中保存会话状态并将对象复制到&nbsp; Windows&nbsp; 窗体的剪贴板中。远程处理还可以使用序列化通过值将对象从一个应用程序域传递到另一个应用程序域中。<BR> 二、如何实现对象的序列化及反序列化<BR> &nbsp; &nbsp; &nbsp; &nbsp; 要实现对象的序列化，首先要保证该对象可以序列化。而且，序列化只是将对象的属性进行有效的保存，对于对象的一些方法则无法实现序列化的。<BR> &nbsp; &nbsp; &nbsp; &nbsp; 实现一个类可序列化的最简便的方法就是增加Serializable属性标记类。如：<BR> &nbsp; &nbsp; &nbsp; &nbsp; [Serializable()]<BR> &nbsp; &nbsp; &nbsp; &nbsp; public&nbsp; class&nbsp; MEABlock<BR> &nbsp; &nbsp; &nbsp; &nbsp; {<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private&nbsp; int&nbsp; m_ID;<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public&nbsp; string&nbsp; Caption;</P><P> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public&nbsp; MEABlock()<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ///构造函数<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<BR> &nbsp; &nbsp; &nbsp; &nbsp; }<BR> &nbsp; &nbsp; &nbsp; &nbsp; 即可实现该类的可序列化。<BR> &nbsp; &nbsp; &nbsp; &nbsp; 要将该类的实例序列化为到文件中？.NET&nbsp; FrameWork提供了两种方法：<BR> &nbsp; &nbsp; &nbsp; &nbsp; 1、XML序列化<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 使用&nbsp; XmLSerializer&nbsp; 类，可将下列项序列化。&nbsp; </P><P> 公共类的公共读／写属性和字段&nbsp; <BR> 实现&nbsp; ICollection&nbsp; 或&nbsp; IEnumerable&nbsp; 的类。（注意只有集合会被序列化，而公共属性却不会。）&nbsp; <BR> XmlElement&nbsp; 对象。&nbsp; <BR> XmlNode&nbsp; 对象。&nbsp; <BR> DataSet&nbsp; 对象。<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 要实现上述类的实例的序列化，可参照如下例子：<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MEABlock&nbsp; myBlock&nbsp; =&nbsp; new&nbsp; MEABlock();<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; Insert&nbsp; code&nbsp; to&nbsp; set&nbsp; properties&nbsp; and&nbsp; fields&nbsp; of&nbsp; the&nbsp; object.<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XmlSerializer&nbsp; mySerializer&nbsp; =&nbsp; new&nbsp; XmlSerializer(typeof(MEABlock));<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; To&nbsp; write&nbsp; to&nbsp; a&nbsp; file,&nbsp; create&nbsp; a&nbsp; StreamWriter&nbsp; object.<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; StreamWriter&nbsp; myWriter&nbsp; =&nbsp; new&nbsp; StreamWriter(&#34;myFileName.xml&#34;);<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mySerializer.Serialize(myWriter,&nbsp; MEABlock);<BR> &nbsp; &nbsp; &nbsp; &nbsp; 需要注意的是XML序列化只会将public的字段保存，对于私有字段不予于保存。<BR> &nbsp; &nbsp; &nbsp; &nbsp; 生成的XML文件格式如下：<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;MEABlock&gt;<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;Caption&gt;Test&lt;/Caption&gt;<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/MEABlock&gt;<BR> &nbsp; &nbsp; &nbsp; &nbsp; 对于对象的反序列化，则如下：<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MEABlock&nbsp; myBlock;<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; Constructs&nbsp; an&nbsp; instance&nbsp; of&nbsp; the&nbsp; XmlSerializer&nbsp; with&nbsp; the&nbsp; type<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; of&nbsp; object&nbsp; that&nbsp; is&nbsp; being&nbsp; deserialized.<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XmlSerializer&nbsp; mySerializer&nbsp; =&nbsp; new&nbsp; XmlSerializer(typeof(MEABlock));<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; To&nbsp; read&nbsp; the&nbsp; file,&nbsp; creates&nbsp; a&nbsp; FileStream.<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FileStream&nbsp; myFileStream&nbsp; =&nbsp; new&nbsp; FileStream(&#34;myFileName.xml&#34;,&nbsp; FileMode.Open);<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; Calls&nbsp; the&nbsp; Deserialize&nbsp; method&nbsp; and&nbsp; casts&nbsp; to&nbsp; the&nbsp; object&nbsp; type.<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myBlock&nbsp; =&nbsp; (MEABlock)mySerializer.Deserialize(myFileStream)<BR> &nbsp; &nbsp; &nbsp; &nbsp; 2、二进制序列化<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 与XML序列化不同的是，二进制序列化可以将类的实例中所有字段（包括私有和公有）都进行序列化操作。这就更方便、更准确的还原了对象的副本。<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 要实现上述类的实例的序列化，可参照如下例子：<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MEABlock&nbsp; myBlock&nbsp; =&nbsp; new&nbsp; MEABlock();<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; Insert&nbsp; code&nbsp; to&nbsp; set&nbsp; properties&nbsp; and&nbsp; fields&nbsp; of&nbsp; the&nbsp; object.<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IFormatter&nbsp; formatter&nbsp; =&nbsp; new&nbsp; BinaryFormatter();<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Stream&nbsp; stream&nbsp; =&nbsp; new&nbsp; FileStream(&#34;MyFile.bin&#34;,FileMode.Create,FileAccess.Write,&nbsp; FileShare.None);<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; formatter.Serialize(stream,&nbsp; myBlock);<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; stream.Close();<BR> &nbsp; &nbsp; &nbsp; &nbsp; 对于对象的反序列化，则如下：<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IFormatter&nbsp; formatter&nbsp; =&nbsp; new&nbsp; BinaryFormatter();<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Stream&nbsp; stream&nbsp; =&nbsp; new&nbsp; FileStream(&#34;MyFile.bin&#34;,&nbsp; FileMode.Open,FileAccess.Read,&nbsp; FileShare.Read);<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MEABlock&nbsp; myBlock&nbsp; =&nbsp; (MEABlock)&nbsp; formatter.Deserialize(stream);<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; stream.Close();</P><P> 三、如何变相实现自定义可视化控件的序列化、反序列化<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对于WinForm中自定义控件，由于继承于System.Windows.Form类，而Form类又是从MarshalByRefObject继承的，窗体本身无法做到序列化，窗体的实现基于Win32下GUI资源，不能脱离当前上下文存在。<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 当然可以采用变通的方法实现控件的序列化。这里采用的是记忆类模型。<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 定义记忆类（其实就是一个可序列化的实体类）用于记录控件的有效属性，需要序列化控件的时候，只需要将该控件的实例Copy到记忆类，演变成序列化保存该记忆类的操作。<BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 反序列化是一个逆过程。将数据流反序列化成为该记忆类，再根据该记忆类的属性生成控件实例。而对于控件的一些事件、方法则可以继续使用。</P><P> ]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=386</link>
      <title><![CDATA[Asp.Net Forums中对.Net中序列化和反序列化的应用 ]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2007-9-12 15:42:46</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=386</guid>
      <comments>
              /Blog/Blog.aspx?Id=386#commentbox
            </comments>
      <description><![CDATA[在Forums中，有些内容是不固定的，例如用户资料，除了一些基本资料，可能还要有一些其他资料信息，例如MSN、个人主页、签名档等，一般对于这样的都是每一个属性对应于数据库中的一个字段。但是如果以后我们因为需要增加一些属性，例如QQ号、Blog地址等，如果还是用这种增加数据表字段的方法，那么将会频繁的修改数据库表结构、存储过程、数据库访问的程序。</P><P> 或许您也遇到过类似问题，看Forums中是怎么借用.Net的序列化和反序列化来解决的：<BR> 例如我需要在用户资料里面增加QQ号这个属性，那么我只需要在User类中增加一个属性<BR> public&nbsp; String&nbsp; QQIM&nbsp; <BR> {<BR> &nbsp; &nbsp; &nbsp; &nbsp; get&nbsp; {&nbsp; return&nbsp; GetExtendedAttribute(&#34;QQIM&#34;);&nbsp; }<BR> &nbsp; &nbsp; &nbsp; &nbsp; set&nbsp; {&nbsp; SetExtendedAttribute(&#34;QQIM&#34;,&nbsp; value);&nbsp; }<BR> }<BR> 不需要修改数据库表结构，不需要修改存储过程，连数据库访问的程序都不需要动。<BR> 在Forums中，有些内容是不固定的，例如用户资料，除了一些基本资料，可能还要有一些其他资料信息，例如MSN、个人主页、签名档等，一般对于这样的都是每一个属性对应于数据库中的一个字段。但是如果以后我们因为需要增加一些属性，例如QQ号、Blog地址等，如果还是用这种增加数据表字段的方法，那么将会频繁的修改数据库表结构、存储过程、数据库访问的程序。</P><P> 或许您也遇到过类似问题，看Forums中是怎么借用.Net的序列化和反序列化来解决的：<BR> 例如我需要在用户资料里面增加QQ号这个属性，那么我只需要在User类中增加一个属性<BR> public&nbsp; String&nbsp; QQIM&nbsp; <BR> {<BR> &nbsp; &nbsp; &nbsp; &nbsp; get&nbsp; {&nbsp; return&nbsp; GetExtendedAttribute(&#34;QQIM&#34;);&nbsp; }<BR> &nbsp; &nbsp; &nbsp; &nbsp; set&nbsp; {&nbsp; SetExtendedAttribute(&#34;QQIM&#34;,&nbsp; value);&nbsp; }<BR> }<BR> 不需要修改数据库表结构，不需要修改存储过程，连数据库访问的程序都不需要动。</P><P> 其具体实现的主要代码：</P><P> <BR> //&nbsp; 首先新建在User类中新建一个NameValueCollection对象，将这些扩展属性都保存在NameValueCollection对象中&nbsp; <BR> NameValueCollection&nbsp; extendedAttributes&nbsp; =&nbsp; new&nbsp; NameValueCollection();&nbsp; <BR> &nbsp; <BR> //&nbsp; 从NameValueCollection集合中取纪录&nbsp; <BR> public&nbsp; string&nbsp; GetExtendedAttribute(string&nbsp; name)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <BR> {&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; string&nbsp; returnValue&nbsp; =&nbsp; extendedAttributes[name];&nbsp; <BR> &nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; if&nbsp; (returnValue&nbsp; &nbsp; &nbsp; &nbsp; ==&nbsp; null)&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; string.Empty;&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; else&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; returnValue;&nbsp; <BR> }&nbsp; <BR> &nbsp; <BR> //&nbsp; 设置扩展属性的在NameValueCollection中的键值和值&nbsp; <BR> public&nbsp; void&nbsp; SetExtendedAttribute(string&nbsp; &nbsp; &nbsp; &nbsp; name,&nbsp; string&nbsp; value)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <BR> {&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; extendedAttributes[name]&nbsp; =&nbsp; value;&nbsp; <BR> }&nbsp; <BR> &nbsp; <BR> //&nbsp; 将extendedAttributes对象（前面定义的用来保存所有的用户扩展信息的NameValueCollection对象）序列化为内存流&nbsp; <BR> //&nbsp; 可以用来保存到数据库中&nbsp; <BR> public&nbsp; byte[]&nbsp; SerializeExtendedAttributes()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <BR> {&nbsp; <BR> &nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; 序列化对象&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; BinaryFormatter&nbsp; &nbsp; &nbsp; &nbsp; binaryFormatter&nbsp; &nbsp; &nbsp; &nbsp; =&nbsp; new&nbsp; BinaryFormatter();&nbsp; <BR> &nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; 创建一个内存流，序列化后保存在其中&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; MemoryStream&nbsp; ms&nbsp; &nbsp; &nbsp; &nbsp; =&nbsp; new&nbsp; MemoryStream();&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; byte[]&nbsp; b;&nbsp; <BR> &nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; 将extendedAttributes对象（里面保存了所有的用户扩展信息）序列化为内存流&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; binaryFormatter.Serialize(ms,&nbsp; extendedAttributes);&nbsp; <BR> &nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; 设置内存流的起始位置&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; ms.Position&nbsp; &nbsp; &nbsp; &nbsp; =&nbsp; 0;&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; 读入到&nbsp; byte&nbsp; 数组&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; b&nbsp; =&nbsp; &nbsp; &nbsp; &nbsp; new&nbsp; &nbsp; &nbsp; &nbsp; Byte[ms.Length];&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; ms.Read(b,&nbsp; 0,&nbsp; b.Length);&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; ms.Close();&nbsp; <BR> &nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; b;&nbsp; <BR> }&nbsp; <BR> &nbsp; <BR> //&nbsp; 反序列化extendedAttributes对象的内容&nbsp; <BR> //&nbsp; 从数据库中读取出来的&nbsp; <BR> public&nbsp; void&nbsp; DeserializeExtendedAttributes(byte[]&nbsp; serializedExtendedAttributes)&nbsp; &nbsp; <BR> {&nbsp; <BR> &nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; if&nbsp; (serializedExtendedAttributes.Length&nbsp; &nbsp; &nbsp; &nbsp; ==&nbsp; 0)&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; try&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; <BR> &nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; BinaryFormatter&nbsp; &nbsp; &nbsp; &nbsp; binaryFormatter&nbsp; &nbsp; &nbsp; &nbsp; =&nbsp; new&nbsp; BinaryFormatter();&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; MemoryStream&nbsp; ms&nbsp; &nbsp; &nbsp; &nbsp; =&nbsp; new&nbsp; MemoryStream();&nbsp; <BR> &nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; 将&nbsp; byte&nbsp; 数组到内存流&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; ms.Write(serializedExtendedAttributes,&nbsp; 0,&nbsp; serializedExtendedAttributes.Length);&nbsp; <BR> &nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; 将内存流的位置到最开始位置&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; ms.Position&nbsp; &nbsp; &nbsp; &nbsp; =&nbsp; 0;&nbsp; <BR> &nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; 反序列化成NameValueCollection对象，创建出与原对象完全相同的副本&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; extendedAttributes&nbsp; =&nbsp; (NameValueCollection)&nbsp; binaryFormatter.Deserialize(ms);&nbsp; <BR> &nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; ms.Close();&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; catch&nbsp; &nbsp; &nbsp; &nbsp; {}&nbsp; <BR> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <BR> }&nbsp; <BR> 实质上序列化机制是将类的值转化为一个一般的（即连续的）字节流，然后就可以将该流保存到数据库的某个字段中（在数据库中forums_UserProfile表中有一个字段“StringNameValues&nbsp; varbinary(7500)”）。读取的过程对对象进行反序列化时，创建出与原对象完全相同的副本。</P><P> 注意一般这类属性在数据库中是不能被检索到的，并且要这些属性能被序列化。</P><P> 更详细内容请查阅MSDN和Asp.Net&nbsp; Forums源码</P><P> ]]></description>
    </item>
    <item>
      <link>http://max.cszi.com/Blog/Blog.aspx?Id=384</link>
      <title><![CDATA[Interface是一种契约, abstract class是事物本质的抽象概括]]></title>
      <author>一线风</author>
      <category>C#/.Net</category>
      <pubDate>2007-8-31 16:27:21</pubDate>
      <guid>http://max.cszi.com/Blog/Blog.aspx?Id=384</guid>
      <comments>
              /Blog/Blog.aspx?Id=384#commentbox
            </comments>
      <description><![CDATA[Interface是一种契约,&nbsp; abstract&nbsp; class是事物本质的抽象概括</P><P> 由以上两点,&nbsp; 什么时候用Interface什么时候用abstract&nbsp; class有看你如何理解你的设计对象,&nbsp; 例如,&nbsp; 某一天你可能会要设计一个Door的类,&nbsp; 它有Open和Close两个功能,&nbsp; 于是</P><P> public&nbsp; interface&nbsp; Door<BR> {<BR> void&nbsp; Open();//只能定义其标签，不可以带函数的实现<BR> void&nbsp; Close();<BR> }</P><P> public&nbsp; abstract&nbsp; class&nbsp; Door<BR> {<BR> void&nbsp; Open(){};//可以带函数的实现<BR> void&nbsp; Close(){};<BR> }</P><P> 就目前来说,&nbsp; 你用Interface还是用abstract&nbsp; class基本上没什么区别,&nbsp; 两者都用来描述Door的行为,&nbsp; 只不过用Interface是在强调Door额外的有Open和Close这两个功能,&nbsp; 而用abstract&nbsp; class则是在强调Door自带有Open和Close的能力,&nbsp; 因为他还可以有其它的东西。</P><P> 走远一点,&nbsp; 假如又有一天,&nbsp; 你要写一个AlarmDoor的类,&nbsp; 这个时候...</P><P> public&nbsp; interface&nbsp; AlarmDoor<BR> {<BR> void&nbsp; open();<BR> void&nbsp; close();<BR> void&nbsp; alarm();<BR> }</P><P> public&nbsp; abstract&nbsp; class&nbsp; AlarmDoor<BR> {<BR> void&nbsp; open(){};<BR> void&nbsp; close(){};<BR> void&nbsp; alarm(){};<BR> }</P><P> 现在,&nbsp; 你应该想清楚你究竟是想设计一个报警器还是想设计一扇门,&nbsp; 如果选择Interface,&nbsp; 那你是在想设计一个报警器,&nbsp; 如果选择abstract&nbsp; class,&nbsp; 那你是在想设计一扇门,&nbsp; 说到现在,&nbsp; 是否有点眉目了?</P><P> C#里面不允许多个父类,&nbsp; 但却允许多个接口,&nbsp; 接口无非是让某个类拥有某种行为,&nbsp; 而抽象类却是在让某个类拥有某种本质,&nbsp; 因此,&nbsp; 我们设计的类,&nbsp; 应该用一个抽象类把它的所有本质都抽象出来,&nbsp; 而它的一些行为(或者说是契约)则通过Interface来实现,&nbsp; 这也能说明为什么C#会不允许多层父类却允许多层接口<BR> ]]></description>
    </item>
  </channel>
</rss>