﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-Guushuuse .NET</title><link>http://www.cnblogs.com/guushuuse/</link><description>一直专注于企业应用开发。5~9——原创随笔</description><language>zh-cn</language><lastBuildDate>Fri, 19 Mar 2010 16:26:55 GMT</lastBuildDate><pubDate>Fri, 19 Mar 2010 16:26:55 GMT</pubDate><ttl>60</ttl><item><title>DotNet Framework源代码中的模式（九）——Flyweight（享元模式）</title><link>http://www.cnblogs.com/guushuuse/archive/2009/05/24/1488422.html</link><dc:creator>guushuuse</dc:creator><author>guushuuse</author><pubDate>Sun, 24 May 2009 13:07:00 GMT</pubDate><guid>http://www.cnblogs.com/guushuuse/archive/2009/05/24/1488422.html</guid><description><![CDATA[<p>阅读: 1315 评论: 0 作者: <a href="http://www.cnblogs.com/guushuuse/" target="_blank">guushuuse</a> 发表于 2009-05-24 21:07 <a href="http://www.cnblogs.com/guushuuse/archive/2009/05/24/1488422.html" target="_blank">原文链接</a></p>&nbsp;
<p style="text-indent: 21pt"><span style="font-family: 宋体">运用共享技术有效地支持大量细粒度的对象。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体"><img height="289" alt="" src="http://images.cnblogs.com/cnblogs_com/guushuuse/53/2009052401.jpg" width="467" border="0" /></span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">&nbsp; </p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">在</span>.Net<span style="font-family: 宋体">中处理字符串时，有一个很重要的机制，叫做字符串驻留机制，就是运用了享元模式。</span>CLR<span style="font-family: 宋体">（公共语言运行库）通过维护一个表来存放字符串，该表称为拘留池，它包含程序中以编程方式声明或创建的每个唯一的字符串的一个引用。因此，具有特定值的字符串的实例在系统中只有一个。</span></p>
<p style="text-indent: 21pt">CLR<span style="font-family: 宋体">中使用享元模式实现字符串驻留的过程：</span>CLR<span style="font-family: 宋体">内部维护着一块特殊的数据结构——我们可以把它看成是一个</span>Hash table<span style="font-family: 宋体">，这个</span>Hash table<span style="font-family: 宋体">维护者大部分创建的</span>string<span style="font-family: 宋体">（我这里没有说全部，因为有特例）。这个</span>Hash table<span style="font-family: 宋体">的</span>Key<span style="font-family: 宋体">对应的相应的</span>string<span style="font-family: 宋体">本身，而</span>Value<span style="font-family: 宋体">则是分配给这个</span>string<span style="font-family: 宋体">的内存块的引用。当</span>CLR<span style="font-family: 宋体">初始化的时候创建这个</span>Hash table<span style="font-family: 宋体">。一般地，在程序运行过程中，如果需要的创建一个</span>string<span style="font-family: 宋体">，</span>CLR<span style="font-family: 宋体">会根据这个</span>string<span style="font-family: 宋体">的</span>Hash Code<span style="font-family: 宋体">试着在</span>Hash table<span style="font-family: 宋体">中找这个相同的</span>string<span style="font-family: 宋体">，如果找到，则直接把找到的</span>string<span style="font-family: 宋体">的地址赋给相应的变量，如果没有则在托管堆中创建一个</span>string<span style="font-family: 宋体">，</span>CLR <span style="font-family: 宋体">会先在</span>managed heap<span style="font-family: 宋体">中创建该</span>strng<span style="font-family: 宋体">，并在</span>Hash table<span style="font-family: 宋体">中创建一个</span>Key-Value Pair<span style="font-family: 宋体">——</span>Key<span style="font-family: 宋体">为这个</span>string<span style="font-family: 宋体">本身，</span>Value<span style="font-family: 宋体">位这个新创建的</span>string<span style="font-family: 宋体">的内存地址，这个地址最重被赋给响应的变量。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">通过</span>Strig<span style="font-family: 宋体">类和拘留池相关的方法</span>Intern(<span style="color: #2b91af">String str)</span><span style="font-family: 宋体">、</span>IsInterned(<span style="color: #2b91af">String str)</span><span style="font-family: 宋体">的底层实现可以更加直观的了解以上过程。</span>&nbsp;</p>
<p style="text-indent: 21pt">System.String<span style="font-family: 宋体">类</span><span style="font-family: 宋体"></p>
<div class="cnblogs_code"><img id="Code_Closed_Image_210151" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_210151').style.display='none'; document.getElementById('Code_Open_Image_210151').style.display='inline'; document.getElementById('Code_Open_Text_210151').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_210151" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_210151').style.display='none'; getElementById('Code_Closed_Image_210151').style.display='inline'; getElementById('Code_Closed_Text_210151').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_210151">Code</span><span id="Code_Open_Text_210151" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;Intern(String&nbsp;str)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(str&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArgumentNullException(</span><span style="color: #800000">"</span><span style="color: #800000">str</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;Thread.GetDomain().GetOrInternString(str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;IsInterned(String&nbsp;str)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(str&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArgumentNullException(</span><span style="color: #800000">"</span><span style="color: #800000">str</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;Thread.GetDomain().IsStringInterned(str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span></span></div>
<p>&nbsp; </p>
<p style="text-indent: 21pt">System.AppDomain<span style="font-family: 宋体">类</span><span style="font-family: 宋体"></p>
<div class="cnblogs_code"><img id="Code_Closed_Image_210237" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_210237').style.display='none'; document.getElementById('Code_Open_Image_210237').style.display='inline'; document.getElementById('Code_Open_Text_210237').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_210237" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_210237').style.display='none'; getElementById('Code_Closed_Image_210237').style.display='inline'; getElementById('Code_Closed_Text_210237').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_210237">Code</span><span id="Code_Open_Text_210237" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">[MethodImplAttribute(MethodImplOptions.InternalCall)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">internal</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;String&nbsp;IsStringInterned(String&nbsp;str);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;[MethodImplAttribute(MethodImplOptions.InternalCall)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">internal</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;String&nbsp;GetOrInternString(String&nbsp;str);<br />
</span></span></div>
<p>&nbsp;</p>
<p style="text-indent: 21pt">sscli20\clr\src\vm\appdomain.cpp</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_210347" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_210347').style.display='none'; document.getElementById('Code_Open_Image_210347').style.display='inline'; document.getElementById('Code_Open_Text_210347').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_210347" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_210347').style.display='none'; getElementById('Code_Closed_Image_210347').style.display='inline'; getElementById('Code_Closed_Text_210347').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_210347">Code</span><span id="Code_Open_Text_210347" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">STRINGREF&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">BaseDomain::IsStringInterned(STRINGREF&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pString)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;CONTRACTL<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GC_TRIGGERS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;THROWS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MODE_COOPERATIVE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRECONDITION(CheckPointer(pString));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INJECT_FAULT(COMPlusThrowOM(););<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;CONTRACTL_END;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m_pStringLiteralMap&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LazyInitStringLiteralMap();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;_ASSERTE(m_pStringLiteralMap);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;m_pStringLiteralMap</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetInternedString(pString,&nbsp;FALSE,&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">CanUnload()&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;bAppDOmainWontUnload&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">);<br />
}<br />
<br />
STRINGREF&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">BaseDomain::GetOrInternString(STRINGREF&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pString)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;CONTRACTL<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GC_TRIGGERS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;THROWS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MODE_COOPERATIVE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRECONDITION(CheckPointer(pString));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INJECT_FAULT(COMPlusThrowOM(););<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;CONTRACTL_END;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m_pStringLiteralMap&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LazyInitStringLiteralMap();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;_ASSERTE(m_pStringLiteralMap);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;m_pStringLiteralMap</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetInternedString(pString,&nbsp;TRUE,&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">CanUnload()&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;bAppDOmainWontUnload&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">);<br />
}<br />
</span></span></div>
<p>&nbsp; </p>
<p style="text-indent: 21pt">sscli20\clr\src\vm\stringliteralmap.cpp</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_210437" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_210437').style.display='none'; document.getElementById('Code_Open_Image_210437').style.display='inline'; document.getElementById('Code_Open_Text_210437').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_210437" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_210437').style.display='none'; getElementById('Code_Closed_Image_210437').style.display='inline'; getElementById('Code_Closed_Text_210437').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_210437">Code</span><span id="Code_Open_Text_210437" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">STRINGREF&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">AppDomainStringLiteralMap::GetInternedString(STRINGREF&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pString,&nbsp;BOOL&nbsp;bAddIfNotFound,&nbsp;BOOL&nbsp;bAppDomainWontUnload)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;CONTRACTL<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GC_TRIGGERS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;THROWS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MODE_COOPERATIVE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRECONDITION(CheckPointer(</span><span style="color: #0000ff">this</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRECONDITION(CheckPointer(pString));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;CONTRACTL_END;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;HashDatum&nbsp;Data;<br />
&nbsp;&nbsp;&nbsp;&nbsp;EEStringData&nbsp;StringData&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;EEStringData((</span><span style="color: #000000">*</span><span style="color: #000000">pString)</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetStringLength(),&nbsp;(</span><span style="color: #000000">*</span><span style="color: #000000">pString)</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBuffer());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwHash&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m_StringToEntryHashTable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetHash(</span><span style="color: #000000">&amp;</span><span style="color: #000000">StringData);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m_StringToEntryHashTable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetValue(</span><span style="color: #000000">&amp;</span><span style="color: #000000">StringData,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">Data,&nbsp;dwHash))<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STRINGREF&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pStrObj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pStrObj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;((StringLiteralEntry</span><span style="color: #000000">*</span><span style="color: #000000">)Data)</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetStringObject();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_ASSERTE(</span><span style="color: #000000">!</span><span style="color: #000000">bAddIfNotFound&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;pStrObj);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;pStrObj;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CrstPreempHolder&nbsp;gch(</span><span style="color: #000000">&amp;</span><span style="color: #000000">(SystemDomain::GetGlobalStringLiteralMap()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">m_HashTableCrstGlobal));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringLiteralEntryHolder&nbsp;pEntry(SystemDomain::GetGlobalStringLiteralMap()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetInternedString(pString,&nbsp;dwHash,&nbsp;bAddIfNotFound));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_ASSERTE(pEntry&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">bAddIfNotFound);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;If&nbsp;pEntry&nbsp;is&nbsp;non-null&nbsp;then&nbsp;the&nbsp;entry&nbsp;exists&nbsp;in&nbsp;the&nbsp;Global&nbsp;map.&nbsp;(either&nbsp;we&nbsp;retrieved&nbsp;it&nbsp;or&nbsp;added&nbsp;it&nbsp;just&nbsp;now)</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pEntry)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">bAppDomainWontUnload)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Since&nbsp;GlobalStringLiteralMap::GetInternedString()&nbsp;could&nbsp;have&nbsp;caused&nbsp;a&nbsp;GC,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;we&nbsp;need&nbsp;to&nbsp;recreate&nbsp;the&nbsp;string&nbsp;data.</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringData&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;EEStringData((</span><span style="color: #000000">*</span><span style="color: #000000">pString)</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetStringLength(),&nbsp;(</span><span style="color: #000000">*</span><span style="color: #000000">pString)</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBuffer());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Make&nbsp;sure&nbsp;some&nbsp;other&nbsp;thread&nbsp;has&nbsp;not&nbsp;already&nbsp;added&nbsp;it.</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">m_StringToEntryHashTable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetValue(</span><span style="color: #000000">&amp;</span><span style="color: #000000">StringData,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">Data))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Insert&nbsp;the&nbsp;handle&nbsp;to&nbsp;the&nbsp;string&nbsp;into&nbsp;the&nbsp;hash&nbsp;table.</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_StringToEntryHashTable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">InsertValue(</span><span style="color: #000000">&amp;</span><span style="color: #000000">StringData,&nbsp;(LPVOID)pEntry,&nbsp;FALSE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pEntry.Release();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;while&nbsp;we're&nbsp;under&nbsp;lock</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;pEntry.SuppressRelease();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Retrieve&nbsp;the&nbsp;string&nbsp;objectref&nbsp;from&nbsp;the&nbsp;string&nbsp;literal&nbsp;entry.</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STRINGREF&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pStrObj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pStrObj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pEntry</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetStringObject();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;pStrObj;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;If&nbsp;the&nbsp;bAddIfNotFound&nbsp;flag&nbsp;is&nbsp;set&nbsp;then&nbsp;we&nbsp;better&nbsp;have&nbsp;a&nbsp;string<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;string&nbsp;object&nbsp;at&nbsp;this&nbsp;point.</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;_ASSERTE(</span><span style="color: #000000">!</span><span style="color: #000000">bAddIfNotFound);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;NULL;<br />
}<br />
</span></span></div>
<p>&nbsp; </p>
<p style="text-indent: 21pt">sscli20\clr\src\vm<span style="font-family: 宋体">目录中包含了</span> CLI <span style="font-family: 宋体">核心实现，包括垃圾收集器、类装入器、类型系统、错误报告系统、应用程序域、配件、代理支持、反射、安全性和代码管理器。</span></p>
<p style="text-indent: 21pt">&nbsp;</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">当以下所有的条件都满足时，可以考虑使用享元模式：</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">一个系统有大量的对象。</span> </p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">这些对象耗费大量的内存。</span> </p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">这些对象的状态中的大部分都可以外部化。</span> </p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">这些对象可以按照内蕴状态分成很多的组，当把外蕴对象从对象中剔除时，每一个组都可以仅用一个对象代替。</span> </p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">软件系统不依赖于这些对象的身份，换言之，这些对象可以是不可分辨的。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">使用享元模式需要维护一个记录了系统已有的所有享元的表，而这需要耗费资源。因此，应当在有足够多的享元实例可供共享时才值得使用享元模式。</span></p>
</span></span></span>
<img src="http://www.cnblogs.com/guushuuse/aggbug/1488422.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/24/1488422.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/24/1488422.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59194/" target="_blank">网游3大美女高管仅剩刘伟</a><span style="color:gray">(2010-03-19 23:59)</span><br/>· <a href="http://news.cnblogs.com/n/59193/" target="_blank">查理&#183;米勒宣称将一口气公布20个Mac OS X漏洞</a><span style="color:gray">(2010-03-19 23:55)</span><br/>· <a href="http://news.cnblogs.com/n/59192/" target="_blank">Google投资的海底光缆建设完毕</a><span style="color:gray">(2010-03-19 23:53)</span><br/>· <a href="http://news.cnblogs.com/n/59191/" target="_blank">微软2009年所获专利达苹果10倍</a><span style="color:gray">(2010-03-19 23:50)</span><br/>· <a href="http://news.cnblogs.com/n/59190/" target="_blank">门户网站竞相掀起微博圈地运动</a><span style="color:gray">(2010-03-19 22:26)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>DotNet Framework源代码中的模式（八）——Builder（生成器模式）</title><link>http://www.cnblogs.com/guushuuse/archive/2009/05/17/1458928.html</link><dc:creator>guushuuse</dc:creator><author>guushuuse</author><pubDate>Sun, 17 May 2009 11:45:00 GMT</pubDate><guid>http://www.cnblogs.com/guushuuse/archive/2009/05/17/1458928.html</guid><description><![CDATA[<p>阅读: 1517 评论: 3 作者: <a href="http://www.cnblogs.com/guushuuse/" target="_blank">guushuuse</a> 发表于 2009-05-17 19:45 <a href="http://www.cnblogs.com/guushuuse/archive/2009/05/17/1458928.html" target="_blank">原文链接</a></p><p>&nbsp; </p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">将一个复杂对象的构件与它的表示分离，使得同样的构建过程可以创建不同的表述。</span></p>
<p><img height="188" alt="" src="http://images.cnblogs.com/cnblogs_com/guushuuse/53/2009051701.jpg" width="433" border="0" />&nbsp; </p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">建造者（</span>Builder<span style="font-family: 宋体">）角色：给出一个抽象接口，以规范产品对象的各个组成成分的建造。一般而言，此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者（</span>ConcreteBuilder<span style="font-family: 宋体">）角色。具体建造者类必须实现这个接口所要求的方法：一个是建造方法，另一个是结果返还方法。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">具体建造者（</span>Concrete Builder<span style="font-family: 宋体">）角色：担任这个角色的是于应用程序紧密相关的类，它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括：实现</span>Builder<span style="font-family: 宋体">角色提供的接口，一步一步完成创建产品实例的过程；在建造过程完成后，提供产品的实例。</span> </p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">指导者（</span>Director<span style="font-family: 宋体">）角色：担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识，真正拥有产品类的具体知识的是具体建造者对象。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">产品（</span>Product<span style="font-family: 宋体">）角色：产品便是建造中的复杂对象。</span></p>
<p style="text-indent: 21pt">&nbsp;</p>
<p><span style="font-family: 宋体">以以</span>.NET Framework 2.0 System.Text. StringBuilder<span style="font-family: 宋体">为例</span></p>
<p><span style="font-family: 宋体"><img height="76" alt="" src="http://images.cnblogs.com/cnblogs_com/guushuuse/53/2009051702.jpg" width="460" border="0" /></span><span style="font-family: 宋体">&nbsp; </p>
<p style="text-indent: 21pt">System.Text. StringBuilder</p>
<p style="text-indent: 21pt">&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_194212" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_194212').style.display='none'; document.getElementById('Code_Open_Image_194212').style.display='inline'; document.getElementById('Code_Open_Text_194212').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_194212" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_194212').style.display='none'; getElementById('Code_Closed_Image_194212').style.display='inline'; getElementById('Code_Closed_Text_194212').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_194212">Code</span><span id="Code_Open_Text_194212" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sealed</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;StringBuilder&nbsp;:&nbsp;ISerializable<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">internal</span><span style="color: #000000">&nbsp;IntPtr&nbsp;m_currentThread&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Thread.InternalGetCurrentThread();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">internal</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m_MaxCapacity&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">internal</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">volatile</span><span style="color: #000000">&nbsp;String&nbsp;m_StringValue&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;StringBuilder()&nbsp;:&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">(DefaultCapacity)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;StringBuilder&nbsp;Append(String&nbsp;value)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">If&nbsp;the&nbsp;value&nbsp;being&nbsp;added&nbsp;is&nbsp;null,&nbsp;eat&nbsp;the&nbsp;null<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">and&nbsp;return.&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(value&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntPtr&nbsp;tid;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;hand&nbsp;inlining&nbsp;of&nbsp;GetThreadSafeString&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;currentString&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m_StringValue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Thread.InternalGetCurrentThread();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m_currentThread&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;tid)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentString&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;String.GetStringForStringBuilder(currentString,&nbsp;currentString.Capacity);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;currentLength&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;currentString.Length;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;requiredLength&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;currentLength&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;value.Length;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(NeedsAllocation(currentString,&nbsp;requiredLength))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;newString&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetNewString(currentString,&nbsp;requiredLength);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newString.AppendInPlace(value,&nbsp;currentLength);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReplaceString(tid,&nbsp;newString);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentString.AppendInPlace(value,&nbsp;currentLength);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReplaceString(tid,&nbsp;currentString);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;StringBuilder&nbsp;Append(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;value)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;Append(value.ToString(CultureInfo.CurrentCulture));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;String&nbsp;ToString()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;We&nbsp;assume&nbsp;that&nbsp;their&nbsp;read&nbsp;of&nbsp;m_currentThread&nbsp;will&nbsp;always&nbsp;occur&nbsp;after&nbsp;read&nbsp;of&nbsp;m_StringValue.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;If&nbsp;these&nbsp;reads&nbsp;get&nbsp;re-ordered&nbsp;then&nbsp;it&nbsp;is&nbsp;possible&nbsp;to&nbsp;get&nbsp;a&nbsp;currentString&nbsp;owned&nbsp;by&nbsp;some&nbsp;other&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;(mutating)&nbsp;thread&nbsp;and&nbsp;yet&nbsp;think,&nbsp;according&nbsp;to&nbsp;currentThread,&nbsp;that&nbsp;such&nbsp;was&nbsp;not&nbsp;the&nbsp;case.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;This&nbsp;is&nbsp;acheived&nbsp;by&nbsp;marking&nbsp;m_StringValue&nbsp;as&nbsp;volatile.&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;currentString&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m_StringValue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntPtr&nbsp;currentThread&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m_currentThread;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Note&nbsp;calling&nbsp;ToString&nbsp;the&nbsp;second&nbsp;time&nbsp;or&nbsp;from&nbsp;a&nbsp;different&nbsp;thread&nbsp;will&nbsp;cause&nbsp;allocation&nbsp;of&nbsp;a&nbsp;new&nbsp;string.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;If&nbsp;we&nbsp;do&nbsp;not&nbsp;make&nbsp;a&nbsp;copy&nbsp;if&nbsp;currentThread&nbsp;is&nbsp;IntPtr.Zero,&nbsp;we&nbsp;will&nbsp;have&nbsp;following&nbsp;race:&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;(1)&nbsp;Thread&nbsp;T1&nbsp;completes&nbsp;a&nbsp;mutation&nbsp;of&nbsp;the&nbsp;string&nbsp;and&nbsp;will&nbsp;become&nbsp;the&nbsp;owner.&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;T1&nbsp;then&nbsp;starts&nbsp;another&nbsp;mutation&nbsp;operation&nbsp;and&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;A&nbsp;thread&nbsp;interleaving&nbsp;happens&nbsp;at&nbsp;this&nbsp;point.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;(2)&nbsp;Thread&nbsp;T2&nbsp;starts&nbsp;a&nbsp;ToString&nbsp;operation.&nbsp;&nbsp;T2&nbsp;reads&nbsp;m_StringValue&nbsp;into&nbsp;its&nbsp;local&nbsp;currentString&nbsp;variable.&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;A&nbsp;thread&nbsp;interleaving&nbsp;happens&nbsp;at&nbsp;this&nbsp;point.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;(3)&nbsp;Thread&nbsp;T3&nbsp;finshes&nbsp;a&nbsp;mutation&nbsp;of&nbsp;the&nbsp;string&nbsp;in&nbsp;the&nbsp;StringBuilder&nbsp;,&nbsp;performing&nbsp;the&nbsp;ReplaceString&nbsp;call.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Thread&nbsp;T3&nbsp;then&nbsp;starts&nbsp;a&nbsp;ToString&nbsp;operation.&nbsp;&nbsp;Assuming&nbsp;the&nbsp;string&nbsp;is&nbsp;not&nbsp;wasting&nbsp;excessive&nbsp;space,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;T3&nbsp;will&nbsp;proceeds&nbsp;to&nbsp;call&nbsp;ClearPostNullChar,&nbsp;registers&nbsp;NOBODY&nbsp;as&nbsp;the&nbsp;owner,&nbsp;and&nbsp;returns&nbsp;the&nbsp;string.&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;A&nbsp;thread&nbsp;interleaving&nbsp;happens&nbsp;at&nbsp;this&nbsp;point.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;(4)&nbsp;Thread&nbsp;T2&nbsp;resumes&nbsp;execution.&nbsp;&nbsp;T2&nbsp;reads&nbsp;m_currentThread&nbsp;and&nbsp;sees&nbsp;that&nbsp;NOBODY&nbsp;is&nbsp;the&nbsp;registered&nbsp;owner&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;Assuming&nbsp;its&nbsp;currentString&nbsp;is&nbsp;not&nbsp;wasting&nbsp;excessive&nbsp;space,&nbsp;T2&nbsp;will&nbsp;return&nbsp;the&nbsp;same&nbsp;string&nbsp;that&nbsp;thread&nbsp;T1&nbsp;is&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;in&nbsp;the&nbsp;middle&nbsp;of&nbsp;mutating.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(currentThread&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;Thread.InternalGetCurrentThread())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;String.InternalCopy(currentString);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;((</span><span style="color: #800080">2</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;currentString.Length)&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;currentString.ArrayLength)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;String.InternalCopy(currentString);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentString.ClearPostNullChar();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_currentThread&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;IntPtr.Zero;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;currentString;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></span></div>
<p></span>&nbsp;</p>
<p style="text-indent: 21pt">System.String</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_194255" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_194255').style.display='none'; document.getElementById('Code_Open_Image_194255').style.display='inline'; document.getElementById('Code_Open_Text_194255').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_194255" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_194255').style.display='none'; getElementById('Code_Closed_Image_194255').style.display='inline'; getElementById('Code_Closed_Text_194255').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_194255">Code</span><span id="Code_Open_Text_194255" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sealed</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;String&nbsp;:&nbsp;IComparable,&nbsp;ICloneable,&nbsp;IConvertible,&nbsp;IEnumerable<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Creates&nbsp;a&nbsp;new&nbsp;string&nbsp;with&nbsp;the&nbsp;characters&nbsp;copied&nbsp;in&nbsp;from&nbsp;ptr.&nbsp;If&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;ptr&nbsp;is&nbsp;null,&nbsp;a&nbsp;string&nbsp;initialized&nbsp;to&nbsp;";&lt;;No&nbsp;Object&gt;;";&nbsp;(i.e.,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;String.NullString)&nbsp;is&nbsp;created.<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;[CLSCompliant(</span><span style="color: #0000ff">false</span><span style="color: #000000">),&nbsp;MethodImplAttribute(MethodImplOptions.InternalCall)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">unsafe</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;String(</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;[CLSCompliant(</span><span style="color: #0000ff">false</span><span style="color: #000000">),&nbsp;MethodImplAttribute(MethodImplOptions.InternalCall)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">unsafe</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;String(</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;value,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;startIndex,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;length);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;[CLSCompliant(</span><span style="color: #0000ff">false</span><span style="color: #000000">),&nbsp;MethodImplAttribute(MethodImplOptions.InternalCall)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">unsafe</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;String(</span><span style="color: #0000ff">sbyte</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;[CLSCompliant(</span><span style="color: #0000ff">false</span><span style="color: #000000">),&nbsp;MethodImplAttribute(MethodImplOptions.InternalCall)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">unsafe</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;String(</span><span style="color: #0000ff">sbyte</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;value,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;startIndex,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;length);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;[CLSCompliant(</span><span style="color: #0000ff">false</span><span style="color: #000000">),&nbsp;MethodImplAttribute(MethodImplOptions.InternalCall)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">unsafe</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;String(</span><span style="color: #0000ff">sbyte</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;value,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;startIndex,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;length,&nbsp;Encoding&nbsp;enc);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Creates&nbsp;a&nbsp;new&nbsp;string&nbsp;from&nbsp;the&nbsp;characters&nbsp;in&nbsp;a&nbsp;subarray.&nbsp;&nbsp;The&nbsp;new&nbsp;string&nbsp;will<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;be&nbsp;created&nbsp;from&nbsp;the&nbsp;characters&nbsp;in&nbsp;value&nbsp;between&nbsp;startIndex&nbsp;and<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;startIndex&nbsp;+&nbsp;length&nbsp;-&nbsp;1.&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//<br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;[MethodImplAttribute(MethodImplOptions.InternalCall)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;String(</span><span style="color: #0000ff">char</span><span style="color: #000000">[]&nbsp;value,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;startIndex,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;length);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Creates&nbsp;a&nbsp;new&nbsp;string&nbsp;from&nbsp;the&nbsp;characters&nbsp;in&nbsp;a&nbsp;subarray.&nbsp;&nbsp;The&nbsp;new&nbsp;string&nbsp;will&nbsp;be&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;created&nbsp;from&nbsp;the&nbsp;characters&nbsp;in&nbsp;value.<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//<br />
</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;[MethodImplAttribute(MethodImplOptions.InternalCall)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;String(</span><span style="color: #0000ff">char</span><span style="color: #000000">[]&nbsp;value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">internal</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">unsafe</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;AppendInPlace(String&nbsp;value,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;currentLength)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;value.Length;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;newLength&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;currentLength&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;count;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">fixed</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;dest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.m_firstChar)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">fixed</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;src&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">value.m_firstChar)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wstrcpy(dest&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;currentLength,&nbsp;src,&nbsp;count);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dest[newLength]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">\0</span><span style="color: #800000">'</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.m_stringLength&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;newLength;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
}<br />
</span></span></div>
<p>&nbsp; </p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">调用代码</span><span style="font-family: 宋体"></p>
<div class="cnblogs_code"><img id="Code_Closed_Image_194327" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_194327').style.display='none'; document.getElementById('Code_Open_Image_194327').style.display='inline'; document.getElementById('Code_Open_Text_194327').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_194327" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_194327').style.display='none'; getElementById('Code_Closed_Image_194327').style.display='inline'; getElementById('Code_Closed_Text_194327').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_194327">Code</span><span id="Code_Open_Text_194327" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Client<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Main()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;sb&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringBuilder();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(</span><span style="color: #800000">"</span><span style="color: #800000">Hello</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(</span><span style="color: #800000">"</span><span style="color: #800000">&nbsp;World</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(</span><span style="color: #800000">"</span><span style="color: #800000">!</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sb.ToString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(s);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadLine();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></span></div>
<p>&nbsp; </p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">由于</span>String<span style="font-family: 宋体">类型代表的是一个不可变的字符串，所以</span>BCL<span style="font-family: 宋体">提供了另一个名为</span>System.Text.StringBuilder<span style="font-family: 宋体">的类型，它允许我们有效的对字符串的字符执行动态操作，以创建一个</span>String<span style="font-family: 宋体">。从逻辑上说，</span>StringBuilder<span style="font-family: 宋体">对象中包含一个字段，它引用由</span>Char<span style="font-family: 宋体">结构构成的一个数组。</span>StringBuilder<span style="font-family: 宋体">的成员允许我们操作这个字符，有效的缩减字符串的大小或者更改字符串中的字符。如果字符串变大，超过已经分配的字符的大小，</span>StringBuilder<span style="font-family: 宋体">就会自动的分配一个全新的、更大的数组，并开始使用新的数组，前一个数组会被垃圾回收器回收。用</span>StringBuilder<span style="font-family: 宋体">对象构建好字符串之后，为了将</span>StringBuilder<span style="font-family: 宋体">的字符&#8220;转换&#8221;成一个</span>String<span style="font-family: 宋体">，只需调用</span>StringBuilder<span style="font-family: 宋体">的</span>ToString<span style="font-family: 宋体">方法，在内部，该方法只是返回对</span>StringBuilder<span style="font-family: 宋体">内部维护的字符串的字段的一个引用，执行效率非常快，因为它不需要进行字符数组复制。</span></p>
<p style="text-indent: 21pt">C#<span style="font-family: 宋体">中</span>volatile <span style="font-family: 宋体">关键字指示一个字段可以由多个同时执行的线程修改。声明为</span> volatile <span style="font-family: 宋体">的字段不受编译器优化（假定由单个线程访问）的限制。这样可以确保该字段在任何时间呈现的都是最新的值。可变关键字仅可应用于类或结构字段。不能将局部变量声明为</span> volatile<span style="font-family: 宋体">。</span></p>
<p style="text-indent: 21pt">StringBuilder<span style="font-family: 宋体">既是具体建造者（</span>Builder<span style="font-family: 宋体">）又是指导者（</span>Director<span style="font-family: 宋体">），最终生成一个复杂的</span>String<span style="font-family: 宋体">对象作为产品（</span>Product<span style="font-family: 宋体">）。在具体建造者只有一个的情况下，如果抽象建造者角色已经被省略掉，那么还可以省略掉指导者角色。让</span>Builder<span style="font-family: 宋体">角色自己扮演指导者与建造者双重角色。</span></p>
<p style="text-indent: 21pt">&nbsp;</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">以下情况应当使用建造者模式：</span></p>
<p style="text-indent: 21pt">1<span style="font-family: 宋体">．需要生成的产品对象有复杂的内部结构。</span></p>
<p style="text-indent: 21pt">2<span style="font-family: 宋体">．需要生成的产品对象的属性相互依赖，建造者模式可以强迫生成顺序。</span></p>
<p style="text-indent: 21pt">3<span style="font-family: 宋体">．在对象创建过程中会使用到系统中的一些其它对象，这些对象在产品对象的创建过程中不易得到。</span></p>
<p></span>&nbsp;</p>
 <img src="http://www.cnblogs.com/guushuuse/aggbug/1458928.html?type=1" width="1" height="1" alt=""/><p>评论: 3　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/17/1458928.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/17/1458928.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59194/" target="_blank">网游3大美女高管仅剩刘伟</a><span style="color:gray">(2010-03-19 23:59)</span><br/>· <a href="http://news.cnblogs.com/n/59193/" target="_blank">查理&#183;米勒宣称将一口气公布20个Mac OS X漏洞</a><span style="color:gray">(2010-03-19 23:55)</span><br/>· <a href="http://news.cnblogs.com/n/59192/" target="_blank">Google投资的海底光缆建设完毕</a><span style="color:gray">(2010-03-19 23:53)</span><br/>· <a href="http://news.cnblogs.com/n/59191/" target="_blank">微软2009年所获专利达苹果10倍</a><span style="color:gray">(2010-03-19 23:50)</span><br/>· <a href="http://news.cnblogs.com/n/59190/" target="_blank">门户网站竞相掀起微博圈地运动</a><span style="color:gray">(2010-03-19 22:26)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>DotNet Framework源代码中的模式（七）——Factory Method（工厂模式）</title><link>http://www.cnblogs.com/guushuuse/archive/2009/05/16/1458481.html</link><dc:creator>guushuuse</dc:creator><author>guushuuse</author><pubDate>Sat, 16 May 2009 13:35:00 GMT</pubDate><guid>http://www.cnblogs.com/guushuuse/archive/2009/05/16/1458481.html</guid><description><![CDATA[<p>阅读: 1240 评论: 3 作者: <a href="http://www.cnblogs.com/guushuuse/" target="_blank">guushuuse</a> 发表于 2009-05-16 21:35 <a href="http://www.cnblogs.com/guushuuse/archive/2009/05/16/1458481.html" target="_blank">原文链接</a></p>&nbsp;
<p style="text-indent: 21pt"><span style="font-family: 宋体">定义一个用于创建对象的接口，让子类决定将哪一个类实例化。</span>Factory Method<span style="font-family: 宋体">使一个类的实例化延迟到其子类。</span></p>
<p><img height="199" alt="" src="http://images.cnblogs.com/cnblogs_com/guushuuse/53/2009051601.jpg" width="483" border="0" />&nbsp;</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">以</span>.NET Framework 2.0 System.Web<span style="font-family: 宋体">、</span>System.Web.UI<span style="font-family: 宋体">中类为例</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体"><img height="250" alt="" src="http://images.cnblogs.com/cnblogs_com/guushuuse/53/2009051602.jpg" width="518" border="0" /></span><span style="font-family: 宋体">&nbsp; </p>
<p style="text-indent: 21pt">System.Web.IHttpHandler</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;IHttpHandler<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;IsReusable&nbsp;{&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ProcessRequest(HttpContext&nbsp;context);<br />
}<br />
</span></div>
<p></span>&nbsp; </p>
<p style="text-indent: 21pt">System.Web.IHttpHandlerFactory2</p>
<p style="text-indent: 21pt">&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;IHttpHandlerFactory2<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;IHttpHandler&nbsp;GetHandler(HttpContext&nbsp;context,&nbsp;String&nbsp;requestType,&nbsp;VirtualPath&nbsp;virtualPath,&nbsp;String&nbsp;physicalPath);<br />
}<br />
</span></div>
<p>&nbsp; </p>
<p style="text-indent: 21pt">System.Web.UI.Page</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_213317" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_213317').style.display='none'; document.getElementById('Code_Open_Image_213317').style.display='inline'; document.getElementById('Code_Open_Text_213317').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_213317" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_213317').style.display='none'; getElementById('Code_Closed_Image_213317').style.display='inline'; getElementById('Code_Closed_Text_213317').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_213317">Code</span><span id="Code_Open_Text_213317" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Page&nbsp;:&nbsp;TemplateControl,&nbsp;IHttpHandler<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;IsReusable<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ProcessRequest(HttpContext&nbsp;context)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">}<br />
</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">}<br />
</span></span></div>
<p style="text-indent: 21pt">&nbsp; </p>
<p style="text-indent: 21pt">System.Web.UI.PageHandlerFactory</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_213348" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_213348').style.display='none'; document.getElementById('Code_Open_Image_213348').style.display='inline'; document.getElementById('Code_Open_Text_213348').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_213348" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_213348').style.display='none'; getElementById('Code_Closed_Image_213348').style.display='inline'; getElementById('Code_Closed_Text_213348').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_213348">Code</span><span id="Code_Open_Text_213348" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;PageHandlerFactory&nbsp;:&nbsp;IHttpHandlerFactory2&nbsp;<br />
{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;_isInheritedInstance;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">internal</span><span style="color: #000000">&nbsp;PageHandlerFactory()&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Check&nbsp;whether&nbsp;this&nbsp;is&nbsp;the&nbsp;exact&nbsp;PageHandlerFactory,&nbsp;or&nbsp;a&nbsp;derived&nbsp;class&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_isInheritedInstance&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(GetType()&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">typeof</span><span style="color: #000000">(PageHandlerFactory));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;IHttpHandler&nbsp;GetHandler(HttpContext&nbsp;context,&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;requestType,&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;virtualPath,&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;path)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Debug.Trace(</span><span style="color: #800000">"</span><span style="color: #800000">PageHandlerFactory</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">PageHandlerFactory:&nbsp;</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;virtualPath);&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;This&nbsp;should&nbsp;never&nbsp;get&nbsp;called&nbsp;in&nbsp;ISAPI&nbsp;mode&nbsp;but&nbsp;currently&nbsp;is&nbsp;in&nbsp;integrated&nbsp;mode<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Debug.Assert(false);</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;GetHandlerHelper(context,&nbsp;requestType,&nbsp;VirtualPath.CreateNonRelative(virtualPath),&nbsp;path);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;IHttpHandler&nbsp;IHttpHandlerFactory2.GetHandler(HttpContext&nbsp;context,&nbsp;String&nbsp;requestType,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VirtualPath&nbsp;virtualPath,&nbsp;String&nbsp;physicalPath)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;If&nbsp;it's&nbsp;a&nbsp;derived&nbsp;class,&nbsp;we&nbsp;must&nbsp;call&nbsp;the&nbsp;old&nbsp;(less&nbsp;efficient)&nbsp;GetHandler,&nbsp;in<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;case&nbsp;it&nbsp;was&nbsp;overriden</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(_isInheritedInstance)&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;GetHandler(context,&nbsp;requestType,&nbsp;virtualPath.VirtualPathString,&nbsp;physicalPath);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;GetHandlerHelper(context,&nbsp;requestType,&nbsp;virtualPath,&nbsp;physicalPath);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ReleaseHandler(IHttpHandler&nbsp;handler)&nbsp;{&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;IHttpHandler&nbsp;GetHandlerHelper(HttpContext&nbsp;context,&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;requestType,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VirtualPath&nbsp;virtualPath,&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;physicalPath)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Page&nbsp;page&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;BuildManager.CreateInstanceFromVirtualPath(&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;virtualPath,&nbsp;</span><span style="color: #0000ff">typeof</span><span style="color: #000000">(Page),&nbsp;context,&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">allowCrossApp</span><span style="color: #008000">*/</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">noAssert</span><span style="color: #008000">*/</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;Page;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(page&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page.TemplateControlVirtualPath&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;virtualPath;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;page;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
}<br />
</span></span></div>
<p>&nbsp; </p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">默认</span>Web.Config<span style="font-family: 宋体">配置</span><span style="font-family: 宋体"></p>
<div class="cnblogs_code"><img id="Code_Closed_Image_213427" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_213427').style.display='none'; document.getElementById('Code_Open_Image_213427').style.display='inline'; document.getElementById('Code_Open_Text_213427').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_213427" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_213427').style.display='none'; getElementById('Code_Closed_Image_213427').style.display='inline'; getElementById('Code_Closed_Text_213427').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_213427">Code</span><span id="Code_Open_Text_213427" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"&nbsp;</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">configuration</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">system.web</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">httpHandlers</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">add&nbsp;</span><span style="color: #ff0000">path</span><span style="color: #0000ff">="*.aspx"</span><span style="color: #ff0000">&nbsp;verb</span><span style="color: #0000ff">="*"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="System.Web.UI.PageHandlerFactory"</span><span style="color: #ff0000">&nbsp;validate</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">add&nbsp;</span><span style="color: #ff0000">path</span><span style="color: #0000ff">="*.ashx"</span><span style="color: #ff0000">&nbsp;verb</span><span style="color: #0000ff">="*"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="System.Web.UI.SimpleHandlerFactory"</span><span style="color: #ff0000">&nbsp;validate</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">add&nbsp;</span><span style="color: #ff0000">path</span><span style="color: #0000ff">="*.asmx"</span><span style="color: #ff0000">&nbsp;verb</span><span style="color: #0000ff">="*"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="System.Web.Services.Protocols.WebServiceHandlerFactory,&nbsp;System.Web.Services,&nbsp;Version=2.0.0.0,&nbsp;Culture=neutral,&nbsp;PublicKeyToken=b03f5f7f11d50a3a"</span><span style="color: #ff0000">&nbsp;validate</span><span style="color: #0000ff">="false"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">httpHandlers</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">system.web</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">configuration</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></span></div>
<p>&nbsp; </p>
<p style="text-indent: 21pt">IHttpHandlerFactory2<span style="font-family: 宋体">是</span>IHttpHandler<span style="font-family: 宋体">的工厂，通过它来生成不同的</span>HttpHandler<span style="font-family: 宋体">对象。</span></p>
<p style="text-indent: 21pt">HttpHandler<span style="font-family: 宋体">是一个</span>HTTP<span style="font-family: 宋体">请求的真正处理中心，也正是在这个</span>HttpHandler<span style="font-family: 宋体">容器中，</span>ASP.NET Framework<span style="font-family: 宋体">才真正地对客户端请求的服务器页面做出编译和执行，并将处理过后的信息附加在</span>HTTP<span style="font-family: 宋体">请求信息流中再次返回到</span>HttpModule<span style="font-family: 宋体">中。一个</span>HTTP<span style="font-family: 宋体">请求都是最终交给一个</span>HttpHandler<span style="font-family: 宋体">容器中的</span>ProcessRequest<span style="font-family: 宋体">方法来处理的。</span></p>
<p style="text-indent: 21pt">HttpHandlerFactory<span style="font-family: 宋体">，是一个</span>HTTP<span style="font-family: 宋体">请求到达这个</span>HttpHandler Factory<span style="font-family: 宋体">时，</span>HttpHandlerFactory<span style="font-family: 宋体">会提供出一个</span>HttpHandler<span style="font-family: 宋体">容器，交由这个</span>HttpHandler<span style="font-family: 宋体">容器来处理这个</span>HTTP<span style="font-family: 宋体">请求。对于</span>ASPX<span style="font-family: 宋体">页面，</span>ASP.NET Framework<span style="font-family: 宋体">在默认情况下是交给</span>System.Web.UI.PageHandlerFactory<span style="font-family: 宋体">这个</span>HttpHandlerFactory<span style="font-family: 宋体">来处理的。</span></p>
<p style="text-indent: 21pt">&nbsp;</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">在以下情况下，适用于工厂方法模式：</span></p>
<p style="text-indent: 21pt">1. <span style="font-family: 宋体">当一个类不知道它所必须创建的对象的类的时候。</span> </p>
<p style="text-indent: 21pt">2. <span style="font-family: 宋体">当一个类希望由它的子类来指定它所创建的对象的时候。</span> </p>
<p style="text-indent: 21pt">3. <span style="font-family: 宋体">当类将创建对象的职责委托给多个帮助子类中的某一个，并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。</span></span></p>
<img src="http://www.cnblogs.com/guushuuse/aggbug/1458481.html?type=1" width="1" height="1" alt=""/><p>评论: 3　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/16/1458481.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/16/1458481.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59194/" target="_blank">网游3大美女高管仅剩刘伟</a><span style="color:gray">(2010-03-19 23:59)</span><br/>· <a href="http://news.cnblogs.com/n/59193/" target="_blank">查理&#183;米勒宣称将一口气公布20个Mac OS X漏洞</a><span style="color:gray">(2010-03-19 23:55)</span><br/>· <a href="http://news.cnblogs.com/n/59192/" target="_blank">Google投资的海底光缆建设完毕</a><span style="color:gray">(2010-03-19 23:53)</span><br/>· <a href="http://news.cnblogs.com/n/59191/" target="_blank">微软2009年所获专利达苹果10倍</a><span style="color:gray">(2010-03-19 23:50)</span><br/>· <a href="http://news.cnblogs.com/n/59190/" target="_blank">门户网站竞相掀起微博圈地运动</a><span style="color:gray">(2010-03-19 22:26)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>DotNet Framework源代码中的模式（六）——Prototype（原型模式）</title><link>http://www.cnblogs.com/guushuuse/archive/2009/05/15/1457951.html</link><dc:creator>guushuuse</dc:creator><author>guushuuse</author><pubDate>Fri, 15 May 2009 13:21:00 GMT</pubDate><guid>http://www.cnblogs.com/guushuuse/archive/2009/05/15/1457951.html</guid><description><![CDATA[<p>阅读: 1467 评论: 5 作者: <a href="http://www.cnblogs.com/guushuuse/" target="_blank">guushuuse</a> 发表于 2009-05-15 21:21 <a href="http://www.cnblogs.com/guushuuse/archive/2009/05/15/1457951.html" target="_blank">原文链接</a></p>&nbsp;
<p class="a" style="text-indent: 21pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用原型实例指定创建对象的种类，并且通过拷贝这个原型来创建新的对象。<img height="263" alt="" src="http://images.cnblogs.com/cnblogs_com/guushuuse/53/2009051501.jpg" width="448" border="0" /></span></p>
<p class="a" style="text-indent: 21pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp; </p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">以</span>.NET Framework 2.0 System.Collections<span style="font-family: 宋体">中类为例</span></p>
<p><img height="236" alt="" src="http://images.cnblogs.com/cnblogs_com/guushuuse/53/2009051502.jpg" width="458" border="0" /></p>
<p>&nbsp; </p>
<p style="text-indent: 21pt">System.Collections. ICollection</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ICollection&nbsp;:&nbsp;IEnumerable<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">}<br />
</span></div>
<p>&nbsp;</p>
<p style="text-indent: 21pt">System.Collections. ICloneable</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ICloneable<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;Clone();<br />
}<br />
</span></div>
<p style="text-indent: 21pt">&nbsp; </p>
<p style="text-indent: 21pt">System.Collections. Stack</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_211914" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_211914').style.display='none'; document.getElementById('Code_Open_Image_211914').style.display='inline'; document.getElementById('Code_Open_Text_211914').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_211914" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_211914').style.display='none'; getElementById('Code_Closed_Image_211914').style.display='inline'; getElementById('Code_Closed_Text_211914').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_211914">Code</span><span id="Code_Open_Text_211914" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Stack&nbsp;:&nbsp;ICollection,&nbsp;ICloneable<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;Object&nbsp;Clone()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stack&nbsp;s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Stack(_size);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s._size&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_size;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Array.Copy(_array,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;s._array,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;_size);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s._version&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_version;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;s;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">}<br />
</span></span></div>
<p>&nbsp; </p>
<p style="text-indent: 21pt">System.Collections. Queue</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_211941" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_211941').style.display='none'; document.getElementById('Code_Open_Image_211941').style.display='inline'; document.getElementById('Code_Open_Text_211941').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_211941" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_211941').style.display='none'; getElementById('Code_Closed_Image_211941').style.display='inline'; getElementById('Code_Closed_Text_211941').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_211941">Code</span><span id="Code_Open_Text_211941" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Queue&nbsp;:&nbsp;ICollection,&nbsp;ICloneable<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;Object&nbsp;Clone()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue&nbsp;q&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Queue(_size);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q._size&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_size;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;numToCopy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_size;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;firstPart&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(_array.Length&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;_head&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;numToCopy)&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;_array.Length&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;_head&nbsp;:&nbsp;numToCopy;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Array.Copy(_array,&nbsp;_head,&nbsp;q._array,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;firstPart);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numToCopy&nbsp;</span><span style="color: #000000">-=</span><span style="color: #000000">&nbsp;firstPart;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(numToCopy&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Array.Copy(_array,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;q._array,&nbsp;_array.Length&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;_head,&nbsp;numToCopy);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q._version&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_version;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;q;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">}<br />
</span></span></div>
<p>&nbsp; </p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">调用代码</span><span style="font-family: 宋体"></p>
<div class="cnblogs_code"><img id="Code_Closed_Image_212007" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_212007').style.display='none'; document.getElementById('Code_Open_Image_212007').style.display='inline'; document.getElementById('Code_Open_Text_212007').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_212007" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_212007').style.display='none'; getElementById('Code_Closed_Image_212007').style.display='inline'; getElementById('Code_Closed_Text_212007').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_212007">Code</span><span id="Code_Open_Text_212007" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Client<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Main()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stack&nbsp;myStack&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Stack();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myStack.Push(</span><span style="color: #800000">"</span><span style="color: #800000">Hello</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myStack.Push(</span><span style="color: #800000">"</span><span style="color: #800000">World</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myStack.Push(</span><span style="color: #800000">"</span><span style="color: #800000">!</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stack&nbsp;myStackCopy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Stack)myStack.Clone();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">foreach</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;s&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;myStackCopy)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadLine();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></span></div>
<p style="text-indent: 21pt">&nbsp; </p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">在</span>.NET Framework<span style="font-family: 宋体">中，可以通过实现</span>ICloneable<span style="font-family: 宋体">接口来实现原型模式，</span>ICloneable<span style="font-family: 宋体">接口只有一个</span>Clone<span style="font-family: 宋体">方法。克隆的实现方法有两种：浅拷贝（</span>shallow copy<span style="font-family: 宋体">）与深拷贝（</span>deep copy<span style="font-family: 宋体">）。</span></p>
<p>&nbsp;<span style="font-family: 宋体">浅拷贝是指当对象的字段值被拷贝时，字段引用的对象不会被拷贝。例如，如果一个对象有一个指向字符串的字段，并且我们对该对象做了一个浅拷贝，那么两个对象将引用同一个字符串。而深拷贝是对对象实例中字段引用的对象也进行拷贝的一种方式，所以如果一个对象有一个指向字符串的字段，并且我们对该对象做了一个深拷贝的话，我们将创建一个新的对象和一个新的字符串</span>--<span style="font-family: 宋体">新对象将引用新字符串。需要注意的是执行深拷贝后，原来的对象和新创建的对象不会共享任何东西；改变一个对象对另外一个对象没有任何影响。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">对于值类型，浅拷贝通过赋值等操作直接实现，将对象中的值类型的字段拷贝到新的对象中；深拷贝和浅拷贝相同，通过赋值等操作直接实现，将对象中的值类型的字段拷贝到新的对象中。</span> <span style="font-family: 宋体">对于引用类型，浅拷贝通过</span>MemberwiseClone <span style="font-family: 宋体">方法创建一个浅副本，方法是创建一个新对象，如果字段是值类型的，则对该字段执行逐位复制，如果字段是引用类型，则复制引用原始对象，与原对象引用同一对象；深拷贝拷贝对象应用，也拷贝对象实际内容，也就是创建了一个新的对象，改变新对象不会影响到原始对象的内容。</span></p>
<p>&nbsp;</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">在下列情况下，应当使用</span>Prototype<span style="font-family: 宋体">模式：</span></p>
<p style="text-indent: 21pt">1<span style="font-family: 宋体">．当一个系统应该独立于它的产品创建，构成和表示时；</span></p>
<p style="text-indent: 21pt">2<span style="font-family: 宋体">．当要实例化的类是在运行时刻指定时，例如，通过动态装载；</span></p>
<p style="text-indent: 21pt">3<span style="font-family: 宋体">．为了避免创建一个与产品类层次平行的工厂类层次时；</span></p>
<p>&nbsp;4<span style="font-family: 宋体">．当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。</span></p>
</span>
<p style="text-indent: 21pt"></span>&nbsp;</p>
 <img src="http://www.cnblogs.com/guushuuse/aggbug/1457951.html?type=1" width="1" height="1" alt=""/><p>评论: 5　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/15/1457951.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/15/1457951.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59194/" target="_blank">网游3大美女高管仅剩刘伟</a><span style="color:gray">(2010-03-19 23:59)</span><br/>· <a href="http://news.cnblogs.com/n/59193/" target="_blank">查理&#183;米勒宣称将一口气公布20个Mac OS X漏洞</a><span style="color:gray">(2010-03-19 23:55)</span><br/>· <a href="http://news.cnblogs.com/n/59192/" target="_blank">Google投资的海底光缆建设完毕</a><span style="color:gray">(2010-03-19 23:53)</span><br/>· <a href="http://news.cnblogs.com/n/59191/" target="_blank">微软2009年所获专利达苹果10倍</a><span style="color:gray">(2010-03-19 23:50)</span><br/>· <a href="http://news.cnblogs.com/n/59190/" target="_blank">门户网站竞相掀起微博圈地运动</a><span style="color:gray">(2010-03-19 22:26)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>DotNet Framework源代码中的模式（五）——Decorator（装饰模式）</title><link>http://www.cnblogs.com/guushuuse/archive/2009/05/14/1456789.html</link><dc:creator>guushuuse</dc:creator><author>guushuuse</author><pubDate>Thu, 14 May 2009 06:17:00 GMT</pubDate><guid>http://www.cnblogs.com/guushuuse/archive/2009/05/14/1456789.html</guid><description><![CDATA[<p>阅读: 1737 评论: 5 作者: <a href="http://www.cnblogs.com/guushuuse/" target="_blank">guushuuse</a> 发表于 2009-05-14 14:17 <a href="http://www.cnblogs.com/guushuuse/archive/2009/05/14/1456789.html" target="_blank">原文链接</a></p><p>动态地给一个对象添加一些额外的职责。就扩展功能而言，Decorator模式比生成子类方式更为灵活。</p>
<p>&nbsp;</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/guushuuse/WindowsLiveWriter/DotNetFrameworkDecorator_C8AB/clip_image001_2.gif"></a></p>
<p><img height="356" alt="" src="http://images.cnblogs.com/cnblogs_com/guushuuse/53/2009051503.gif" width="431" border="0" /></p>
<p>以.NET Framework 2.0 System.IO中类为例</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/guushuuse/WindowsLiveWriter/DotNetFrameworkDecorator_C8AB/clip_image002_2.jpg"></a></p>
<p>&nbsp;</p>
<p><img height="221" alt="" src="http://images.cnblogs.com/cnblogs_com/guushuuse/53/2009051504.jpg" width="449" border="0" />&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_212628" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_212628').style.display='none'; document.getElementById('Code_Open_Image_212628').style.display='inline'; document.getElementById('Code_Open_Text_212628').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_212628" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_212628').style.display='none'; getElementById('Code_Closed_Image_212628').style.display='inline'; getElementById('Code_Closed_Text_212628').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_212628">Code</span><span id="Code_Open_Text_212628" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">System.IO.Stream<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Stream&nbsp;:&nbsp;MarshalByRefObject,&nbsp;IDisposable<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Read([In,&nbsp;Out]&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;buffer,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;offset,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Write(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;buffer,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;offset,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">}<br />
<br />
System.IO.MemoryStream<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MemoryStream&nbsp;:&nbsp;Stream<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;MemoryStream(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;buffer)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Read([In,&nbsp;Out]&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;buffer,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;offset,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Write(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;buffer,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;offset,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
System.IO.FileStream<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;FileStream&nbsp;:&nbsp;Stream<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;FileStream(String&nbsp;path,&nbsp;FileMode&nbsp;mode)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Read([In,&nbsp;Out]&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;buffer,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;offset,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Write(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;buffer,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;offset,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
System.IO.BufferedStream<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;BufferedStream&nbsp;:&nbsp;Stream<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Stream&nbsp;_s;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;BufferedStream(Stream&nbsp;stream)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Read(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;buffer,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;offset,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_s.Read();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Write(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;buffer,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;offset,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_s.Write();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></span></div>
<p>&nbsp;</p>
<p>调用代码&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_212648" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_212648').style.display='none'; document.getElementById('Code_Open_Image_212648').style.display='inline'; document.getElementById('Code_Open_Text_212648').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_212648" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_212648').style.display='none'; getElementById('Code_Closed_Image_212648').style.display='inline'; getElementById('Code_Closed_Text_212648').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_212648">Code</span><span id="Code_Open_Text_212648" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Client<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Main()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileStream&nbsp;stream&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileStream(</span><span style="color: #800000">@"</span><span style="color: #800000">c:\\C:\WINDOWS\system32\drivers\etc\services</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;FileMode.Open);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedStream&nbsp;bufferedStream&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BufferedStream(stream,&nbsp;</span><span style="color: #800080">1024</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>在.NET Framework中，所有的流操作都有一个共同的基类System.IO.Stream，它是一个抽象类，主要包含了Read、Write等行为。针对文件流和内存流的操作，定义了FileStream和MemoryStream类，都继承Stream类，分别实现不同的读写操作。为了提高流的读写性能，需要使用缓存Buffer来存放流数据。此时，Buffer的作用对于流的读写操作而言，就相当于一个装饰的作用。</p>
<p>在以下情况下应当使用装饰模式：</p>
<p>1.需要扩展一个类的功能，或给一个类增加附加责任。</p>
<p>2.需要动态地给一个对象增加功能，这些功能可以再动态地撤销。</p>
<p>3.需要增加由一些基本功能的排列组合而产生的非常大量的功能，从而使继承关系变得不现实。</p>
<img src="http://www.cnblogs.com/guushuuse/aggbug/1456789.html?type=1" width="1" height="1" alt=""/><p>评论: 5　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/14/1456789.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/14/1456789.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59194/" target="_blank">网游3大美女高管仅剩刘伟</a><span style="color:gray">(2010-03-19 23:59)</span><br/>· <a href="http://news.cnblogs.com/n/59193/" target="_blank">查理&#183;米勒宣称将一口气公布20个Mac OS X漏洞</a><span style="color:gray">(2010-03-19 23:55)</span><br/>· <a href="http://news.cnblogs.com/n/59192/" target="_blank">Google投资的海底光缆建设完毕</a><span style="color:gray">(2010-03-19 23:53)</span><br/>· <a href="http://news.cnblogs.com/n/59191/" target="_blank">微软2009年所获专利达苹果10倍</a><span style="color:gray">(2010-03-19 23:50)</span><br/>· <a href="http://news.cnblogs.com/n/59190/" target="_blank">门户网站竞相掀起微博圈地运动</a><span style="color:gray">(2010-03-19 22:26)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>DotNet Framework源代码中的模式（四）——Abstract Factory（抽象工厂模式）</title><link>http://www.cnblogs.com/guushuuse/archive/2009/05/11/1454464.html</link><dc:creator>guushuuse</dc:creator><author>guushuuse</author><pubDate>Mon, 11 May 2009 13:38:00 GMT</pubDate><guid>http://www.cnblogs.com/guushuuse/archive/2009/05/11/1454464.html</guid><description><![CDATA[<p>阅读: 1627 评论: 11 作者: <a href="http://www.cnblogs.com/guushuuse/" target="_blank">guushuuse</a> 发表于 2009-05-11 21:38 <a href="http://www.cnblogs.com/guushuuse/archive/2009/05/11/1454464.html" target="_blank">原文链接</a></p>&#160; <p style="text-indent: 21pt"><span style="font-family: 宋体">提供一个创建一系列相关或相互依赖对象的接口，而无需指定它们具体的类。</span></p>  <p><img height="475" alt="" src="http://images.cnblogs.com/cnblogs_com/guushuuse/53/2009051101.jpg" width="443" border="0" /></p>  <p>&#160; </p>  <p style="text-indent: 21pt"><span style="font-family: 宋体">以</span>.NET Framework 2.0 System.Data<span style="font-family: 宋体">中类为例</span></p>  <p style="text-indent: 21pt"><span style="font-family: 宋体"><img height="409" alt="" src="http://images.cnblogs.com/cnblogs_com/guushuuse/53/2009051102.jpg" width="640" border="0" /></span></p>  <p style="text-indent: 21pt"><span style="font-family: 宋体">&#160; </span>    <div class="cnblogs_code"><img id="Code_Closed_Image_213600" onclick="this.style.display=&#39;none&#39;; document.getElementById(&#39;Code_Closed_Text_213600&#39;).style.display=&#39;none&#39;; document.getElementById(&#39;Code_Open_Image_213600&#39;).style.display=&#39;inline&#39;; document.getElementById(&#39;Code_Open_Text_213600&#39;).style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_213600" style="display: none" onclick="this.style.display=&#39;none&#39;; document.getElementById(&#39;Code_Open_Text_213600&#39;).style.display=&#39;none&#39;; getElementById(&#39;Code_Closed_Image_213600&#39;).style.display=&#39;inline&#39;; getElementById(&#39;Code_Closed_Text_213600&#39;).style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span class="cnblogs_code_Collapse" id="Code_Closed_Text_213600">Code</span><span id="Code_Open_Text_213600" style="display: none">       <br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">System.Data.Common.DbProviderFactory         <br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000"> DbProviderFactory         <br />{          <br />&#160;&#160;&#160; </span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">virtual</span><span style="color: #000000"> DbConnection CreateConnection()         <br />&#160;&#160;&#160; {          <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color: #0000ff">return</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">null</span><span style="color: #000000">;         <br />&#160;&#160;&#160; }          <br />          <br />&#160;&#160;&#160; </span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">virtual</span><span style="color: #000000"> DbCommand CreateCommand()         <br />&#160;&#160;&#160; {          <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color: #0000ff">return</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">null</span><span style="color: #000000">;         <br />&#160;&#160;&#160; }&#160; <br />}          <br />          <br />System.Data.SqlClient.SqlClientFactory          <br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">sealed</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000"> SqlClientFactory : DbProviderFactory, IServiceProvider         <br />{          <br />&#160;&#160;&#160; </span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">override</span><span style="color: #000000"> DbConnection CreateConnection()         <br />&#160;&#160;&#160; {          <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color: #0000ff">return</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">new</span><span style="color: #000000"> SqlConnection();         <br />&#160;&#160;&#160; }          <br />          <br />&#160;&#160;&#160; </span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">override</span><span style="color: #000000"> DbCommand CreateCommand()         <br />&#160;&#160;&#160; {          <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color: #0000ff">return</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">new</span><span style="color: #000000"> SqlCommand();         <br />&#160;&#160;&#160; }          <br />          <br />}          <br />          <br />System.Data.Odbc.OdbcFactory          <br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">sealed</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000"> OdbcFactory : DbProviderFactory         <br />{          <br />&#160;&#160;&#160; </span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">override</span><span style="color: #000000"> DbConnection CreateConnection()         <br />&#160;&#160;&#160; {          <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color: #0000ff">return</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">new</span><span style="color: #000000"> OdbcConnection();         <br />&#160;&#160;&#160; }          <br />          <br />&#160;&#160;&#160; </span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">override</span><span style="color: #000000"> DbCommand CreateCommand()         <br />&#160;&#160;&#160; {          <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color: #0000ff">return</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">new</span><span style="color: #000000"> OdbcCommand();         <br />&#160;&#160;&#160; }          <br />          <br />}          <br />          <br />System.Data.Common.DbConnection          <br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000"> DbConnection : Component, IDbConnection         <br />{          <br />          <br />}          <br />          <br />System.Data.SqlClient.SqlConnection          <br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">sealed</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">partial</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000"> SqlConnection : DbConnection, ICloneable         <br />{          <br />          <br />}          <br />          <br />System.Data.Odbc.OdbcConnection          <br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">sealed</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">partial</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000"> OdbcConnection : DbConnection, ICloneable         <br />{          <br />          <br />}          <br />          <br />System.Data.Common.DbCommand          <br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000"> DbCommand : Component, IDbCommand         <br />{          <br />          <br />}          <br />          <br />System.Data.SqlClient.SqlCommand          <br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">sealed</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000"> SqlCommand : DbCommand, ICloneable         <br />{          <br />          <br />}          <br />          <br />System.Data.Odbc.OdbcCommand          <br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">sealed</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000"> OdbcCommand : DbCommand, ICloneable         <br />{          <br />          <br />}          <br /></span></span></div>    <p>&#160;</p>    <p>&#160; </p>    <p style="text-indent: 21pt"><span style="font-family: 宋体">通过使用</span>DbProviderFactory<span style="font-family: 宋体">，只需要修改配置文件，就可以实现不同数据库访问的目的。</span></p>    <p style="text-indent: 21pt">&#160;</p>    <div class="cnblogs_code"><img id="Code_Closed_Image_213641" onclick="this.style.display=&#39;none&#39;; document.getElementById(&#39;Code_Closed_Text_213641&#39;).style.display=&#39;none&#39;; document.getElementById(&#39;Code_Open_Image_213641&#39;).style.display=&#39;inline&#39;; document.getElementById(&#39;Code_Open_Text_213641&#39;).style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_213641" style="display: none" onclick="this.style.display=&#39;none&#39;; document.getElementById(&#39;Code_Open_Text_213641&#39;).style.display=&#39;none&#39;; getElementById(&#39;Code_Closed_Image_213641&#39;).style.display=&#39;inline&#39;; getElementById(&#39;Code_Closed_Text_213641&#39;).style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span class="cnblogs_code_Collapse" id="Code_Closed_Text_213641">Code</span><span id="Code_Open_Text_213641" style="display: none">       <br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000"> Client         <br />{          <br />&#160;&#160;&#160; </span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">static</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">void</span><span style="color: #000000"> Main()         <br />&#160;&#160;&#160; {          <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color: #0000ff">string</span><span style="color: #000000"> connectionString </span><span style="color: #000000">=</span><span style="color: #000000"> System.Configuration.ConfigurationManager.AppSettings[</span><span style="color: #800000">&quot;</span><span style="color: #800000">DB_CONNECTION_STRING</span><span style="color: #800000">&quot;</span><span style="color: #000000">];         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color: #0000ff">string</span><span style="color: #000000"> providerName </span><span style="color: #000000">=</span><span style="color: #000000"> System.Configuration.ConfigurationManager.AppSettings[</span><span style="color: #800000">&quot;</span><span style="color: #800000">DB_PROVIDER_NAME</span><span style="color: #800000">&quot;</span><span style="color: #000000">];         <br />          <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; DbProviderFactory factory </span><span style="color: #000000">=</span><span style="color: #000000"> DbProviderFactories.GetFactory(providerName);         <br />          <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; DbConnection connection </span><span style="color: #000000">=</span><span style="color: #000000"> factory.CreateConnection();         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; connection.ConnectionString </span><span style="color: #000000">=</span><span style="color: #000000"> connectionString;         <br />          <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color: #0000ff">using</span><span style="color: #000000"> (connection)         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {          <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; DbCommand command </span><span style="color: #000000">=</span><span style="color: #000000"> factory.CreateCommand();         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; command.CommandText </span><span style="color: #000000">=</span><span style="color: #000000">         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color: #800000">&quot;</span><span style="color: #800000">INSERT INTO t_users(user_username, user_password) VALUES('admin' ,'admin))</span><span style="color: #800000">&quot;</span><span style="color: #000000">;         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; command.Connection </span><span style="color: #000000">=</span><span style="color: #000000"> connection;         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; command.ExecuteNonQuery();          <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }          <br />&#160;&#160;&#160; }          <br />}          <br /></span></span></div>    <p style="text-indent: 21pt">&#160; </p>    <p style="text-indent: 21pt"><span style="font-family: 宋体">抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口，而无需制定它们具体的类</span>. <span style="font-family: 宋体">在软件系统中，经常面临着&#8220;一系列相互依赖的对象&#8221;的创建工作；同时由于需求的变化，往往存在着更多系列对象的创建工作。如何应对这种变化？如何绕过常规的对象的创建方法（</span>new<span style="font-family: 宋体">），提供一种&#8220;封装机制&#8221;来避免客户程序和这种&#8220;多系列具体对象创建工作&#8221;的紧耦合？这就是我们要说的抽象工厂模式。提供一个创建一系列相关或相互依赖对象的接口，而无需指定它们具体的类。</span></p>    <p style="text-indent: 21pt">Abstract Factory<span style="font-family: 宋体">模式的特点：</span></p>    <p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: wingdings">l </span><span style="font-family: 宋体">分离了具体的类。抽象工厂模式帮助你控制一个应用创建的对象的类，因为一个工厂封装创建产品对象的责任和过程。它将客户和类的实现分离，客户通过他们的抽象接口操纵实例，产品的类名也在具体工厂的实现中被分离，它们不出现在客户代码中。</span></p>    <p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: wingdings">l </span><span style="font-family: 宋体">它使得易于交换产品系列。一个具体工厂类在一个应用中仅出现一次——即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置，这是因为一个抽象工厂创建了一个完整的产品系列，所以整个产品系列会立刻改变。</span></p>    <p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: wingdings">l </span><span style="font-family: 宋体">它有利于产品的一致性。当一个系列的产品对象被设计成一起工作时，一个应用一次只能使用同一个系列中的对象，这一点很重要，而抽象工厂很容易实现这一点。</span></p>    <p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: wingdings">l </span><span style="font-family: 宋体">难以支持新种类的产品。难以扩展抽象工厂以生产新种类的产品。这是因为抽象工厂几口确定了可以被创建的产品集合，支持新种类的产品就需要扩展该工厂接口，这将涉及抽象工厂类及其所有子类的改变。</span></p>    <p style="margin-left: 42pt">&#160;</p>    <p style="text-indent: 9.95pt"><span style="font-family: 宋体">在以下情况下应当考虑使用抽象工厂模式：</span></p>    <p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: wingdings">l </span><span style="font-family: 宋体">一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节，这对于所有形态的工厂模式都是重要的。</span> </p>    <p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: wingdings">l </span><span style="font-family: 宋体">这个系统有多于一个的产品族，而系统只消费其中某一产品族。</span> </p>    <p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: wingdings">l </span><span style="font-family: 宋体">同属于同一个产品族的产品是在一起使用的，这一约束必须在系统的设计中体现出来。</span> </p>    <p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: wingdings">l </span><span style="font-family: 宋体">系统提供一个产品类的库，所有的产品以同样的接口出现，从而使客户端不依赖于实现。</span></p></p> <img src="http://www.cnblogs.com/guushuuse/aggbug/1454464.html?type=1" width="1" height="1" alt=""/><p>评论: 11　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/11/1454464.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/11/1454464.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59194/" target="_blank">网游3大美女高管仅剩刘伟</a><span style="color:gray">(2010-03-19 23:59)</span><br/>· <a href="http://news.cnblogs.com/n/59193/" target="_blank">查理&#183;米勒宣称将一口气公布20个Mac OS X漏洞</a><span style="color:gray">(2010-03-19 23:55)</span><br/>· <a href="http://news.cnblogs.com/n/59192/" target="_blank">Google投资的海底光缆建设完毕</a><span style="color:gray">(2010-03-19 23:53)</span><br/>· <a href="http://news.cnblogs.com/n/59191/" target="_blank">微软2009年所获专利达苹果10倍</a><span style="color:gray">(2010-03-19 23:50)</span><br/>· <a href="http://news.cnblogs.com/n/59190/" target="_blank">门户网站竞相掀起微博圈地运动</a><span style="color:gray">(2010-03-19 22:26)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Middleware（中间件）</title><link>http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453791.html</link><dc:creator>guushuuse</dc:creator><author>guushuuse</author><pubDate>Sun, 10 May 2009 13:35:00 GMT</pubDate><guid>http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453791.html</guid><description><![CDATA[<p>阅读: 164 评论: 0 作者: <a href="http://www.cnblogs.com/guushuuse/" target="_blank">guushuuse</a> 发表于 2009-05-10 21:35 <a href="http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453791.html" target="_blank">原文链接</a></p>&nbsp;
<p style="text-indent: 21pt"><span style="font-family: 宋体">中间件已经成为构建网络分布式异构信息系统不可缺少的关键技术，与操作系统、数据库管理系统并列为基础软件体系的三大支柱。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">中间件（</span>middleware<span style="font-family: 宋体">）是基础软件的一大类，属于可复用软件的范畴。顾名思义，中间件处于操作系统软件与用户的应用软件的中间。中间件在操作系统、网络和数据库之上，应用软件的下层，总的作用是为处于自己上层的应用软件提供运行与开发的环境，帮助用户灵活、高效地开发和集成复杂的应用软件。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">在众多关于中间件的定义中，比较普遍被接受的是</span>IDC<span style="font-family: 宋体">表述的：中间件是一种独立的系统软件或服务程序，分布式应用软件借助这种软件在不同的技术之间共享资源，中间件位于客户机服务器的操作系统之上，管理计算资源和网络通信。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">中间件的分类：</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">消息中间件</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">数据访问中间件</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">远程调用中间件</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">事务处理中间件</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">对象请求代理中间件</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">中间件的特性：</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">易用性</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">位置透明性：应用不必知道对方网络和应用的地址；不经重新编译，就可把一个应用从一台机器上转移到另一台机器</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">消息传输的完整性：消息不应丢失或重复</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">消息格式的完整性：消息格式不应被破坏</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">语言透明性：使用中间件的程序应能与另一个用不同语言编写的程序通信；如果用不同语言重写一个程序，其他程序应不受影响</span></p>
<img src="http://www.cnblogs.com/guushuuse/aggbug/1453791.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453791.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453791.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59194/" target="_blank">网游3大美女高管仅剩刘伟</a><span style="color:gray">(2010-03-19 23:59)</span><br/>· <a href="http://news.cnblogs.com/n/59193/" target="_blank">查理&#183;米勒宣称将一口气公布20个Mac OS X漏洞</a><span style="color:gray">(2010-03-19 23:55)</span><br/>· <a href="http://news.cnblogs.com/n/59192/" target="_blank">Google投资的海底光缆建设完毕</a><span style="color:gray">(2010-03-19 23:53)</span><br/>· <a href="http://news.cnblogs.com/n/59191/" target="_blank">微软2009年所获专利达苹果10倍</a><span style="color:gray">(2010-03-19 23:50)</span><br/>· <a href="http://news.cnblogs.com/n/59190/" target="_blank">门户网站竞相掀起微博圈地运动</a><span style="color:gray">(2010-03-19 22:26)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>EA（Enterprise Architecture，企业架构）</title><link>http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453786.html</link><dc:creator>guushuuse</dc:creator><author>guushuuse</author><pubDate>Sun, 10 May 2009 13:27:00 GMT</pubDate><guid>http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453786.html</guid><description><![CDATA[<p>阅读: 163 评论: 1 作者: <a href="http://www.cnblogs.com/guushuuse/" target="_blank">guushuuse</a> 发表于 2009-05-10 21:27 <a href="http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453786.html" target="_blank">原文链接</a></p>&nbsp;
<p style="text-indent: 21pt"><span style="font-family: 宋体">针对于企业应用，依据不同的关注点，架构可以分为如下几类：</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">业务架构（</span>Business Architecture<span style="font-family: 宋体">）：关注于业务及其流程；</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">应用架构（</span>Application Architecture<span style="font-family: 宋体">）：关注于应用系统设计；</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">基础架构（</span>Infrastructure Architecture<span style="font-family: 宋体">）：关注于基础技术；</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">数据架构（</span>Data Architecture<span style="font-family: 宋体">）：关注于数据存储及其规划；</span></p>
<p style="text-indent: 21pt">&nbsp;</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">这里所说的企业应用架构，即属于应用架构，包括如下几个部分：</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">目标和愿景。即应用系统所面临的问题域。</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">评价指标。从哪些纬度和指标来评价和度量解决方案。</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">原则和方法论。为解决这些问题，所采用的原则及其方法论。</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">技术架构。架构的技术层面，给出相应的设计以及结构，描述应用系统。</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">组织因素。架构的组织层面，组织的各个部分如何参与</span></p>
<img src="http://www.cnblogs.com/guushuuse/aggbug/1453786.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453786.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453786.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59194/" target="_blank">网游3大美女高管仅剩刘伟</a><span style="color:gray">(2010-03-19 23:59)</span><br/>· <a href="http://news.cnblogs.com/n/59193/" target="_blank">查理&#183;米勒宣称将一口气公布20个Mac OS X漏洞</a><span style="color:gray">(2010-03-19 23:55)</span><br/>· <a href="http://news.cnblogs.com/n/59192/" target="_blank">Google投资的海底光缆建设完毕</a><span style="color:gray">(2010-03-19 23:53)</span><br/>· <a href="http://news.cnblogs.com/n/59191/" target="_blank">微软2009年所获专利达苹果10倍</a><span style="color:gray">(2010-03-19 23:50)</span><br/>· <a href="http://news.cnblogs.com/n/59190/" target="_blank">门户网站竞相掀起微博圈地运动</a><span style="color:gray">(2010-03-19 22:26)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>HTTP（Hypertext Transfer Protocol，超文本传输协议）</title><link>http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453782.html</link><dc:creator>guushuuse</dc:creator><author>guushuuse</author><pubDate>Sun, 10 May 2009 13:20:00 GMT</pubDate><guid>http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453782.html</guid><description><![CDATA[<p>阅读: 126 评论: 1 作者: <a href="http://www.cnblogs.com/guushuuse/" target="_blank">guushuuse</a> 发表于 2009-05-10 21:20 <a href="http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453782.html" target="_blank">原文链接</a></p>&nbsp;
<p>HTTP<span style="font-family: 宋体">的发展是万维网协会（</span>World Wide Web Consortium<span style="font-family: 宋体">）和</span>Internet<span style="font-family: 宋体">工作小组（</span>Internet Engineering Task Force<span style="font-family: 宋体">）合作的结果，（他们）最终发布了一系列的</span>RFC<span style="font-family: 宋体">，其中最著名的就是</span>RFC 2616<span style="font-family: 宋体">。</span>RFC 2616<span style="font-family: 宋体">定义了</span>HTTP<span style="font-family: 宋体">协议的我们今天普遍使用的一个版本——</span>HTTP 1.1<span style="font-family: 宋体">。</span></p>
<p style="text-indent: 21pt">HTTP<span style="font-family: 宋体">是一个用于在客户端和服务器间请求和应答的协议。一个</span>HTTP<span style="font-family: 宋体">的客户端，诸如一个</span>web<span style="font-family: 宋体">浏览器，通过建立一个到远程主机特殊端口（默认端口为</span>80<span style="font-family: 宋体">）的连接，初始化一个请求。一个</span>HTTP<span style="font-family: 宋体">服务器通过监听特殊端口等待客户端发送一个请求序列，</span> <span style="font-family: 宋体">就像&#8220;</span>GET / HTTP/1.1<span style="font-family: 宋体">&#8221;（用来请求网页服务器的默认页面），有选择的接收像</span>email<span style="font-family: 宋体">一样的</span>MIME<span style="font-family: 宋体">消息，此消息中包含了大量用来描述请求各个方面的信息头序列，响应一个选择的保留数据主体。接收到一个请求序列后（如果要的话，还有消息），服务器会发回一个回复，如&#8220;</span>200 OK<span style="font-family: 宋体">&#8221;，同时发回一个它本报的消息，此消息的主体可能是被请求的文件、错误消息或者其他的一些信息。</span></p>
<p style="text-indent: 21pt">&nbsp;</p>
<p style="text-indent: 21pt">HTTP<span style="font-family: 宋体">报文由从客户机到服务器的请求和从服务器到客户机的响应构成。请求报文格式如下：</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">请求行——通用信息头——请求头——实体头——报文主体</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">请求行以方法字段开始，后面分别是</span> URL <span style="font-family: 宋体">字段和</span> HTTP <span style="font-family: 宋体">协议版本字段，并以</span> CRLF <span style="font-family: 宋体">结尾。</span>SP <span style="font-family: 宋体">是分隔符。除了在最后的</span> CRLF <span style="font-family: 宋体">序列中</span> CF <span style="font-family: 宋体">和</span> LF <span style="font-family: 宋体">是必需的之外，其他都可以不要。有关通用信息头，请求头和实体头方面的具体内容可以参照相关文件。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">应报文格式如下：</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">状态行——通用信息头——响应头——实体头——报文主体</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">状态码元由</span>3<span style="font-family: 宋体">位数字组成，表示请求是否被理解或被满足。原因分析是对原文的状态码作简短的描述，状态码用来支持自动操作，而原因分析用来供用户使用。客户机无需用来检查或显示语法。有关通用信息头，响应头和实体头方面的具体内容可以参照相关文件。</span></p>
<p style="text-indent: 21pt">&nbsp;</p>
<p style="text-indent: 21pt">&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;HTTP/1.1<span style="font-family: 宋体">协议中共定义了八种方法来指示确认的资源执行所需的行为：</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>OPTIONS<span style="font-family: 宋体">——返回服务器针对特定资源所支持的</span>HTTP<span style="font-family: 宋体">请求方法，这可以用来检查网络服务器的功能。</span> </p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>HEAD<span style="font-family: 宋体">——向服务器索要与</span>GET<span style="font-family: 宋体">请求相一致的响应，只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下，就可以获取包含在响应消息头中的元信息。</span> </p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>GET<span style="font-family: 宋体">——向特定的资源发出请求。</span>GET<span style="font-family: 宋体">方法不应当被用于产生副作用的操作中。</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>POST<span style="font-family: 宋体">——向指定资源提交数据进行处理请求。数据被包含在请求体中，</span>POST<span style="font-family: 宋体">请求可能会导致新的资源的建立和</span>/<span style="font-family: 宋体">或已有资源的修改。</span> </p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>PUT<span style="font-family: 宋体">——向指定资源位置上传其最新内容。</span> </p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>DELETE<span style="font-family: 宋体">——删除指定资源。</span> </p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>TRACE<span style="font-family: 宋体">——回显服务器收到的请求。</span> </p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>CONNECT <span style="font-family: 宋体">——</span>HTTP/1.1<span style="font-family: 宋体">协议中预留给能够将连接改为管道方式的代理服务器。</span></p>
<p style="text-indent: 21pt">&nbsp;</p>
<p style="text-indent: 21pt">&nbsp;</p>
<p style="text-indent: 21pt">&nbsp;</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">所有</span> HTTP <span style="font-family: 宋体">响应的第一行都是状态行</span>, <span style="font-family: 宋体">依次是当前</span> HTTP <span style="font-family: 宋体">版本号，</span>3<span style="font-family: 宋体">位数字组成的状态代码，以及描述状态的短语，彼此由空格分隔。状态代码的第一个数字代表当前响应的类型：</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>1xx <span style="font-family: 宋体">消息——请求已被服务器接收，继续处理</span> </p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>2xx <span style="font-family: 宋体">成功——请求已成功被服务器接收、理解、并接受</span> </p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>3xx <span style="font-family: 宋体">重定向——需要后续操作才能完成这一请求</span> </p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>4xx <span style="font-family: 宋体">请求错误——请求含有词法错误或者无法被执行</span> </p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>5xx <span style="font-family: 宋体">服务器错误——服务器在处理某个正确请求时发生错误</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">常用的</span> HTTP <span style="font-family: 宋体">状态码：</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>200 OK<span style="font-family: 宋体">——</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>302 Found<span style="font-family: 宋体">——</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>304 Not Modified<span style="font-family: 宋体">——</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>401 Unauthorized<span style="font-family: 宋体">——</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>403 Forbidden<span style="font-family: 宋体">——</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>404 Not Found<span style="font-family: 宋体">——</span></p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span>500 Internal Server Error<span style="font-family: 宋体">——</span></p>
<p>&nbsp;</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">常用的响应头：</span></p>
<p style="text-indent: 21pt">Server<span style="font-family: 宋体">——</span>Web <span style="font-family: 宋体">服务器的名称和版本。</span> </p>
<p style="text-indent: 21pt">Date<span style="font-family: 宋体">——当前日期（格林威治标准时间）。</span> </p>
<p style="text-indent: 21pt">Last-modified<span style="font-family: 宋体">——上次修改文档的日期。</span> &nbsp;</p>
<p style="text-indent: 21pt">Expires<span style="font-family: 宋体">——文档到期的日期。</span></p>
<p style="text-indent: 21pt">Content-length<span style="font-family: 宋体">——随附数据的长度（以字节为单位）。</span></p>
<p style="text-indent: 21pt">Content-type <span style="font-family: 宋体">——随附数据的</span>MIME <span style="font-family: 宋体">类型。</span> &nbsp;</p>
<span style="font-size: 10.5pt; font-family: 'Times New Roman','serif'">WWW-authenticate</span><span style="font-size: 10.5pt; font-family: 宋体">——在验证时使用，其中的内容用于告诉客户机软件需要提供哪些验证信息（例如用户名和密码）。</span> 
 <img src="http://www.cnblogs.com/guushuuse/aggbug/1453782.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453782.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453782.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59194/" target="_blank">网游3大美女高管仅剩刘伟</a><span style="color:gray">(2010-03-19 23:59)</span><br/>· <a href="http://news.cnblogs.com/n/59193/" target="_blank">查理&#183;米勒宣称将一口气公布20个Mac OS X漏洞</a><span style="color:gray">(2010-03-19 23:55)</span><br/>· <a href="http://news.cnblogs.com/n/59192/" target="_blank">Google投资的海底光缆建设完毕</a><span style="color:gray">(2010-03-19 23:53)</span><br/>· <a href="http://news.cnblogs.com/n/59191/" target="_blank">微软2009年所获专利达苹果10倍</a><span style="color:gray">(2010-03-19 23:50)</span><br/>· <a href="http://news.cnblogs.com/n/59190/" target="_blank">门户网站竞相掀起微博圈地运动</a><span style="color:gray">(2010-03-19 22:26)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>DotNet Framework源代码中的模式（三）——Iteartor（迭代器模式）</title><link>http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453726.html</link><dc:creator>guushuuse</dc:creator><author>guushuuse</author><pubDate>Sun, 10 May 2009 11:04:00 GMT</pubDate><guid>http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453726.html</guid><description><![CDATA[<p>阅读: 1465 评论: 1 作者: <a href="http://www.cnblogs.com/guushuuse/" target="_blank">guushuuse</a> 发表于 2009-05-10 19:04 <a href="http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453726.html" target="_blank">原文链接</a></p>&nbsp;
<p style="text-indent: 21pt"><span style="font-family: 宋体">提供一种方法顺序访问一个聚合对象中各个元素，而又不需暴露该对象的内部表示。</span></p>
<p>&nbsp;</p>
<p><img height="292" alt="" src="http://images.cnblogs.com/cnblogs_com/guushuuse/53/2009051001.jpg" width="385" border="0" /></p>
<p>&nbsp;</p>
<p>&nbsp; </p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">以</span>.NET Framework 2.0 System.Collections<span style="font-family: 宋体">中类为例</span></p>
<p><img height="308" alt="" src="http://images.cnblogs.com/cnblogs_com/guushuuse/53/2009051002.jpg" width="536" border="0" />&nbsp; </p>
<p style="text-indent: 21pt">System.Collections. IEnumerable</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;IEnumerable<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;IEnumerator&nbsp;GetEnumerator();<br />
}<br />
</span></div>
<p>&nbsp; </p>
<p style="text-indent: 21pt">System.Collections.ICollection</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ICollection&nbsp;:&nbsp;IEnumerable<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Count&nbsp;{&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;IsSynchronized&nbsp;{&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;SyncRoot&nbsp;{&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CopyTo(Array&nbsp;array,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;index);<br />
}<br />
</span></div>
<p>&nbsp;</p>
<p>&nbsp; </p>
<p style="text-indent: 21pt">System.Collections.IEnumerator</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;IEnumerator<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;Current&nbsp;{&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;MoveNext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Reset();<br />
}<br />
</span></div>
<p style="text-indent: 21pt">&nbsp;</p>
<p>&nbsp;&nbsp; </p>
<p style="text-indent: 21pt">System.Collections.Stack</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_190143" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_190143').style.display='none'; document.getElementById('Code_Open_Image_190143').style.display='inline'; document.getElementById('Code_Open_Text_190143').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_190143" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_190143').style.display='none'; getElementById('Code_Closed_Image_190143').style.display='inline'; getElementById('Code_Closed_Text_190143').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_190143">Code</span><span id="Code_Open_Text_190143" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Stack&nbsp;:&nbsp;ICollection,&nbsp;ICloneable<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Object[]&nbsp;_array;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Storage&nbsp;for&nbsp;stack&nbsp;elements&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_size;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;IEnumerator&nbsp;GetEnumerator()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StackEnumerator(</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">}&nbsp;<br />
</span></span></div>
<p style="text-indent: 21pt">&nbsp; </p>
<p style="text-indent: 21pt">System.Collections.StackEnumerator</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_190216" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_190216').style.display='none'; document.getElementById('Code_Open_Image_190216').style.display='inline'; document.getElementById('Code_Open_Text_190216').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_190216" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_190216').style.display='none'; getElementById('Code_Closed_Image_190216').style.display='inline'; getElementById('Code_Closed_Text_190216').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_190216">Code</span><span id="Code_Open_Text_190216" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;StackEnumerator&nbsp;:&nbsp;IEnumerator,&nbsp;ICloneable<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">internal</span><span style="color: #000000">&nbsp;StackEnumerator(Stack&nbsp;stack)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;Object&nbsp;Current<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;MoveNext()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Reset()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">}<br />
</span></span></div>
<p style="text-indent: 21pt">&nbsp; </p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">调用程序</span><span style="font-family: 宋体"></p>
<div class="cnblogs_code"><img id="Code_Closed_Image_190251" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_190251').style.display='none'; document.getElementById('Code_Open_Image_190251').style.display='inline'; document.getElementById('Code_Open_Text_190251').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_190251" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_190251').style.display='none'; getElementById('Code_Closed_Image_190251').style.display='inline'; getElementById('Code_Closed_Text_190251').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_190251">Code</span><span id="Code_Open_Text_190251" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Client<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Main()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stack&nbsp;myStack&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Stack();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myStack.Push(</span><span style="color: #800000">"</span><span style="color: #800000">Hello</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myStack.Push(</span><span style="color: #800000">"</span><span style="color: #800000">World</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myStack.Push(</span><span style="color: #800000">"</span><span style="color: #800000">!</span><span style="color: #800000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">foreach</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;s&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;myStack)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadLine();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></span></div>
<p style="text-indent: 21pt"></span>&nbsp;</p>
<p>C#<span style="font-family: 宋体">的</span>foreach<span style="font-family: 宋体">语句常用来迭代可枚举的集合的元素。为了实现可枚举，一个集合必须有一个无参的</span>GetEnumerator<span style="font-family: 宋体">方法，这个方法返回一个枚举器（实现</span>IEnumerator<span style="font-family: 宋体">接口）。</span>Stack<span style="font-family: 宋体">类的</span>GetEnumerator<span style="font-family: 宋体">方法返回的</span>StackEnumerator<span style="font-family: 宋体">类就是一个枚举器。通常，枚举器的实现比较复杂，但</span>C#<span style="font-family: 宋体">引入了迭代器机制，可以简化枚举器的实现。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: 宋体">迭代器是一种方法、</span>get <span style="font-family: 宋体">访问器或运算符，它通过使用</span> yield <span style="font-family: 宋体">关键字对数组或集合类执行自定义迭代。</span>yield <span style="font-family: 宋体">返回语句会导致源序列中的元素在访问源序列中的下一个元素之前立即返回给调用方。尽管您以方法的形式编写迭代器，但编译器会将其转换为一个实际上是状态机的嵌套类。只要客户端代码中的</span> foreach <span style="font-family: 宋体">循环继续进行，此类就会跟踪迭代器的位置。</span></p>
<p style="text-indent: 9.95pt">&nbsp;</p>
<p style="text-indent: 9.95pt">Stack<span style="font-family: 宋体">类的代码中并没有使用</span>C#2.0<span style="font-family: 宋体">的迭代器机制，使用迭代器机制，就不需要实现</span>IEnumerator<span style="font-family: 宋体">接口的</span>StackEnumerator<span style="font-family: 宋体">类，</span>Stack<span style="font-family: 宋体">类的</span>GetEnumerator<span style="font-family: 宋体">方法可以简化为：</span>&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;IEnumerator&nbsp;GetEnumerator()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_size&nbsp;&#8211;&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">i)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">yield</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;_array[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src="http://www.cnblogs.com/guushuuse/aggbug/1453726.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453726.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guushuuse/archive/2009/05/10/1453726.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59194/" target="_blank">网游3大美女高管仅剩刘伟</a><span style="color:gray">(2010-03-19 23:59)</span><br/>· <a href="http://news.cnblogs.com/n/59193/" target="_blank">查理&#183;米勒宣称将一口气公布20个Mac OS X漏洞</a><span style="color:gray">(2010-03-19 23:55)</span><br/>· <a href="http://news.cnblogs.com/n/59192/" target="_blank">Google投资的海底光缆建设完毕</a><span style="color:gray">(2010-03-19 23:53)</span><br/>· <a href="http://news.cnblogs.com/n/59191/" target="_blank">微软2009年所获专利达苹果10倍</a><span style="color:gray">(2010-03-19 23:50)</span><br/>· <a href="http://news.cnblogs.com/n/59190/" target="_blank">门户网站竞相掀起微博圈地运动</a><span style="color:gray">(2010-03-19 22:26)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>