﻿<?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>博客园-笑缘的DotNet-Thinking-&gt;Asking&amp;Studying-&gt;Doing  </title><link>http://www.cnblogs.com/jetxia/</link><description>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;以镜为鉴，可正衣冠； 以人为鉴，可明是非； 以史为鉴，可知兴衰； 以败为鉴，可预胜负。</description><language>zh-cn</language><lastBuildDate>Sun, 07 Sep 2008 02:12:25 GMT</lastBuildDate><pubDate>Sun, 07 Sep 2008 02:12:25 GMT</pubDate><ttl>60</ttl><item><title>最近开始学习BI了</title><link>http://www.cnblogs.com/jetxia/archive/2008/07/16/1244472.html</link><dc:creator>笑缘</dc:creator><author>笑缘</author><pubDate>Wed, 16 Jul 2008 08:18:00 GMT</pubDate><guid>http://www.cnblogs.com/jetxia/archive/2008/07/16/1244472.html</guid><wfw:comment>http://www.cnblogs.com/jetxia/comments/1244472.html</wfw:comment><comments>http://www.cnblogs.com/jetxia/archive/2008/07/16/1244472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jetxia/comments/commentRss/1244472.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jetxia/services/trackbacks/1244472.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;公司成立了BI COE，最近一直在做这方面的入门工作，以前对BI不是很了解，经过Master的几节讲解，开始对BI有所认识，由于公司主要是基于Microsoft的各项技术，所以关于BI的学习和研究主要还是SSIS、SSAS、SSRS，除了SSAS以前没有用过外，其实IS和RS在以前项目中还是比较常用，只不过没有专门的的去学习IS和RS的东西，这几天先开始看MSDN，由于看英语文档还是有些吃力，所以就MSDN （CN、EN）一块看了，即学了技术有提高了英语，呵呵不错的方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;先说说IS吧，这段时间看了IS的一些基本概念，对IS的开发有了简单的学习和认识，知道了IS中的Package、Control Flow、Data Flow、Container等。感觉真的是入门级啊，从QuickStart的小Demo中开始学习IS。到目前为止，已经初步知道了IS Toolbox中常用的一些Component，但是对于很多详细的设置和使用等还是没有使用过，这以后主要是要多了解使用这些组件的场景，自己多深入学习。
<img src ="http://www.cnblogs.com/jetxia/aggbug/1244472.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42130/" target="_blank">[新闻]Google十年市值达1500亿美元 创造奇迹</a>]]></description></item><item><title>我们需要更团结 希望大家奔走先告(转)</title><link>http://www.cnblogs.com/jetxia/archive/2008/04/17/1157808.html</link><dc:creator>笑缘</dc:creator><author>笑缘</author><pubDate>Thu, 17 Apr 2008 04:23:00 GMT</pubDate><guid>http://www.cnblogs.com/jetxia/archive/2008/04/17/1157808.html</guid><wfw:comment>http://www.cnblogs.com/jetxia/comments/1157808.html</wfw:comment><comments>http://www.cnblogs.com/jetxia/archive/2008/04/17/1157808.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/jetxia/comments/commentRss/1157808.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jetxia/services/trackbacks/1157808.html</trackback:ping><description><![CDATA[摘要: 　我们需要更团结 希望大家奔走先告<br>　　1、多省油 多乘坐公共交通出行 能做车就不要开车 能开窗户就不要开 空调<br>　　2、多省电 路灯不用就关掉， 能用耳机就不要开音箱，家电不用就要把整个开关拔下来 又省电又安全 希望政府把夜景工程的灯光就关掉 <br>　　3、支持国货 能买到国货就不要买外国货 促进内需 钱要给自己人赚 <br>　　4、努力工作 多开发和制造更好的产品 实业才是救国之本<br>　　5、尊重自己 尊重国人 不要崇洋媚外 <br>　　6、告诉台湾 西藏 包括其他民族的青年 为什么我们现在还这么痛苦别的国家看不起，因为我们的祖辈太喜欢窝里斗，。 <br>　　7、告诉身边的每一个人 中国只有强大才会有更好的家 ，落后就要挨打挨骂 <br>　　8、政府在进步 督促政府更快的进步 而不是推到他 那样高兴的是美日 痛苦的是自己&nbsp;&nbsp;<a href='http://www.cnblogs.com/jetxia/archive/2008/04/17/1157808.html'>阅读全文</a><img src ="http://www.cnblogs.com/jetxia/aggbug/1157808.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42129/" target="_blank">[新闻]GMail:回过头来支持IE6</a>]]></description></item><item><title>学会忘记，学会原谅！</title><link>http://www.cnblogs.com/jetxia/archive/2008/02/15/1069340.html</link><dc:creator>笑缘</dc:creator><author>笑缘</author><pubDate>Fri, 15 Feb 2008 01:57:00 GMT</pubDate><guid>http://www.cnblogs.com/jetxia/archive/2008/02/15/1069340.html</guid><wfw:comment>http://www.cnblogs.com/jetxia/comments/1069340.html</wfw:comment><comments>http://www.cnblogs.com/jetxia/archive/2008/02/15/1069340.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jetxia/comments/commentRss/1069340.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jetxia/services/trackbacks/1069340.html</trackback:ping><description><![CDATA[<font size="+0">长大了，却变得麻木了；</font><wbr><br />
<font size="+0">过往的种种开心都不在；</font><wbr><br />
<font size="+0">似乎记住的只有伤害；</font><wbr><br />
<font size="+0">似近似远；</font><wbr><br />
<font size="+0">忙碌的平凡摧毁着心的易感；</font><wbr><br />
<br />
<font size="+0">不经意抑或故意间；</font><wbr><br />
<font size="+0">已伤害了你和你的牵挂与思念；</font><wbr><br />
<font size="+0">光秃秃的原野，空廖的土地；</font><wbr><br />
<font size="+0">眼泪滴下 成冰；</font><wbr><br />
<br />
<font size="+0">没有什么不可原谅；</font><wbr><br />
<font size="+0">总在长大，总在承受与遗忘；</font><wbr><br />
<font size="+0">忘记别人的不好吧；</font><wbr><br />
<font size="+0">生命在阳光下延续萌芽；</font><wbr><br />
<br />
<font size="+0">试着学会感恩；</font><wbr><br />
<font size="+0">学会忘记；</font><wbr><br />
<font size="+0">学会关心；</font><wbr><br />
<font size="+0">学会原谅；</font><wbr><br />
<font size="+0">学会关心别人的感受；</font><wbr><br />
<font size="+0">学会原谅别人的不知与伤害。</font><wbr><br />
<p>&nbsp;</p>
<img src ="http://www.cnblogs.com/jetxia/aggbug/1069340.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42128/" target="_blank">[新闻]Google十年大变样</a>]]></description></item><item><title>.NET Framework 开源咯</title><link>http://www.cnblogs.com/jetxia/archive/2008/01/17/1043153.html</link><dc:creator>笑缘</dc:creator><author>笑缘</author><pubDate>Thu, 17 Jan 2008 08:27:00 GMT</pubDate><guid>http://www.cnblogs.com/jetxia/archive/2008/01/17/1043153.html</guid><wfw:comment>http://www.cnblogs.com/jetxia/comments/1043153.html</wfw:comment><comments>http://www.cnblogs.com/jetxia/archive/2008/01/17/1043153.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jetxia/comments/commentRss/1043153.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jetxia/services/trackbacks/1043153.html</trackback:ping><description><![CDATA[<p>期待已久的.NET Framework终于在本周开源了，微软在MS-RL协议下终于公开了.NET Framework源代码，我们只可以自由查看，不允许直接进行修改。<br />
第一批开放的源代码包括：<br />
<font face="Verdana"><br />
.NET基本类库：<br />
System，System.CodeDom，System.Collections,System.ComponentModel, System.Diagnostics, System.Drawing, System.Globalization, System.IO, System.Net, System.Reflection, System.Runtime, System.Security, System.Text, System.Threading</font></p>
<p><font face="Verdana">ASP.NET:<br />
System.Web, System.Web.Extensions</font></p>
<p><font face="Verdana">Windows Forms：<br />
System.Windows.Forms</font></p>
<p><font face="Verdana">Windows Presentation Foundation：<br />
System.Windows</font></p>
<p><font face="Verdana">ADO.NET和 XML：<br />
System.Data<br />
System.Xml</font><br />
转自：<font face="Verdana"><a href="http://www.cnblogs.com/Terrylee/archive/2008/01/17/net-framework-source-code-now-available.html">http://www.cnblogs.com/Terrylee/archive/2008/01/17/net-framework-source-code-now-available.html</a></font><br />
转自：<font face="Verdana"><a href="http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx">http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx</a></font></p>
 <img src ="http://www.cnblogs.com/jetxia/aggbug/1043153.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42127/" target="_blank">[新闻]谷歌十年创新路</a>]]></description></item><item><title>软件项目团队有效性和五原则</title><link>http://www.cnblogs.com/jetxia/archive/2008/01/17/1042601.html</link><dc:creator>笑缘</dc:creator><author>笑缘</author><pubDate>Thu, 17 Jan 2008 03:10:00 GMT</pubDate><guid>http://www.cnblogs.com/jetxia/archive/2008/01/17/1042601.html</guid><wfw:comment>http://www.cnblogs.com/jetxia/comments/1042601.html</wfw:comment><comments>http://www.cnblogs.com/jetxia/archive/2008/01/17/1042601.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jetxia/comments/commentRss/1042601.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jetxia/services/trackbacks/1042601.html</trackback:ping><description><![CDATA[对于软件项目团队，人员的技巧和经验可能对生产率产生高达10倍的影响。在《人月神话》中曾提到对于一个100人的团队，最好是只保留25个经验丰富的项目经理进行开发，而解散其它成员。当实际上一个软件团队不可能要求每个人都经验丰富，经过充分的培训和智商奇高，都是牛人的团队往往更容易出现混乱。因此需要谨慎实施只雇佣优秀开发人员的想法，一个更好的方式是多考虑如何去建设一个有战斗力的团队或者是如何真正去保证团队的有效性。<br />
<br />
平衡和工作匹配是软件项目团队的重要方面。只要失去了平衡，团队就会变得脆弱。正如一个成功的橄榄球队，进攻，防守，教练，替补，传球等各种角色和活动都不可少，伟大的球队需要在每个位置都有关键球员，但是球队中不可能每个人都是球星。因此球员应该更多关注如何赢得比赛胜利，而不是单纯的个人荣誉。<br />
<br />
团队合作远比个人总和重要，因此项目经理需要真正做到人尽其材，每个人才都能够真正找到适合自己的位置，这样人才的配置才能达到一个平衡状态。对于如何为软件项目提供人员时候，波姆提出以下五项原则:<br />
<br />
1.顶尖人才原则-使用更好和更少的人员<br />
<br />
对大多数项目都有一个自然合适的团队规模，偏差太大都不利于发挥团队的能动性。另外团队中不可避免的有辅助性工作要做，必须要为软件项目团队配置如《人月神话》外科手术队伍中谈及的一些秘书和辅助人员，但是我们需要搞清楚的是核心团队的人数要尽可能的少，以保证高度的概念完整性。<br />
<br />
2.工作匹配原则-把任务分给技能和动力都匹配的人<br />
<br />
对软件团队，辨别难以琢磨的个人技能并做到最优分配是相当困难的，而且项目经理的个人主观意愿也可能使分配复杂化。在软件项目团队中最胜任编码的程序员总是希望能够得到提升上升为设计师和经理，由于帕金森定律导致的金字塔上升现象在软件项目团队更加明显。我们不能承认编码工作的重要性，也不能给高效编码人员更高的薪水，好的编码人员都在朝上走，在用的编码人员都很难是经验丰富的高效率人员。人才不能发挥所长，对工程师和管理者来讲是一个双重的打击。<br />
<br />
3.职业发展原则-帮助员工的自我实现并取得好成绩<br />
<br />
新员工刚进入团队中的时候职业发展原则是很有效的，可以帮助员工技能的完善和自我价值实现。当对于老员工和技能达到一定层次的员工，这点上往往是困难的，组织或团队不可能一直产生很多新的东西或应用新的技术，团队中也不可能一直都存在职业发展的机会。在组织中，组织的培训受益最大的往往是中等或中等以下的员工，而团队的培训往往更是战术性的，关注的是结束后就能马上应用的内容，而不会太多关注和培训业界新的知识和技术。<br />
<br />
4.群组平衡原则-选择与其他人互为补充和协调一致的人员<br />
<br />
在软件项目中我们不仅仅是关注项目的进度，质量，范围和成本四要素的平衡。还需要关注人员角色分工的平衡，冒险和保守的平衡，外部和内部的平衡，纪律和灵活性间的平衡等等。任何一个方面失去平衡，项目都可能处于危险中。<br />
<br />
<br />
5.逐步淘汰原则-一个不称职的人留在组织内对谁都没有好处<br />
<br />
不称职可以给你提供寻找更好员工或四使用更少员工的理由，不称职会阻碍其它组员自我实现能力，并且在某些方面会破坏团队内的平衡，给团队其它成员造成不称职也可以在团队中生存和获取报酬的负面影响。<br />
<br />
软件开发是一项集体运动，项目经理必须培养一种团队合作，而不是单纯的追求个人成功的氛围。群组平衡和工作匹配应该是最主要的目标，因为顶尖人才原则和逐步淘汰原则必须在群组平衡的前提下实施。另外职业发展原则不可以过分强调，因为过分强调这一原则而忽视了团队成功的个人或组织在竞争激励的市场上不会长久。<br />
<br />
转自csdn：<font face="Verdana">http://sd.csdn.net/page/54a154b6-4bec-4f2f-8741-b39366a050a2</font>
<img src ="http://www.cnblogs.com/jetxia/aggbug/1042601.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42127/" target="_blank">[新闻]谷歌十年创新路</a>]]></description></item><item><title>提高程序的传输效率，减少带宽的占用，启用IIS6中GZip压缩</title><link>http://www.cnblogs.com/jetxia/archive/2008/01/16/1040848.html</link><dc:creator>笑缘</dc:creator><author>笑缘</author><pubDate>Wed, 16 Jan 2008 02:13:00 GMT</pubDate><guid>http://www.cnblogs.com/jetxia/archive/2008/01/16/1040848.html</guid><wfw:comment>http://www.cnblogs.com/jetxia/comments/1040848.html</wfw:comment><comments>http://www.cnblogs.com/jetxia/archive/2008/01/16/1040848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jetxia/comments/commentRss/1040848.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jetxia/services/trackbacks/1040848.html</trackback:ping><description><![CDATA[IIS6内建Gzip压缩的支持，但是没有比较好的设置管理界面。<br />
参考：<a href="http://support.microsoft.com/kb/234497/en-us" target="_blank">ms-kb:234497</a><br />
<br />
首先，打开IIS管理界面，在"网站"标签上点右键-&gt;属性。<br />
"服务"标签下的"HTTP 压缩"：<br />
根据需求选中 "压缩应用程序文件" 或者 "压缩静态文件"。<br />
临时目录对应的文件夹，通常是"C:\WINDOWS\IIS Temporary Compressed Files"，需要给 IUSR_机器名 写的权限。<br />
<br />
然后，<br />
&nbsp;
<fieldset style="border-right: #999 1px solid; border-top: #999 1px solid; border-left: #999 1px solid; width: 487px; border-bottom: #999 1px solid; height: 332px"><legend>引用内容</legend>
<blockquote style="padding-right: 10px; padding-left: 10px; padding-bottom: 10px; padding-top: 10px">在IIS管理界面， "计算机名" 标签上点右键-&gt;属性。<br />
选择 "允许直接编辑配置数据库"<br />
打开 "C:\WINDOWS\system32\inetsrv\MetaBase.xml"，<br />
在 &lt;IIsCompressionScheme Location="/LM/W3SVC/Filters/Compression/deflate"&gt;节和&lt;IIsCompressionScheme Location="/LM/W3SVC/Filters/Compression/gzip"&gt;节，<br />
修改HcDynamicCompressionLevel为9。(性能/压缩比最好)<br />
修改HcFileExtensions为"htm html txt" (可扩展，带引号)<br />
修改HcScriptFileExtensions为"asp exe dll aspx" (可扩展，带引号)<br />
保存文件。<br />
关闭 "允许直接编辑配置数据库"选项。</blockquote></fieldset><br />
<br />
上一步骤也可如此：<br />
<br />
<fieldset style="border-right: #999 1px solid; border-top: #999 1px solid; border-left: #999 1px solid; width: 406px; border-bottom: #999 1px solid; height: 479px"><legend>引用内容</legend>
<blockquote style="padding-right: 10px; padding-left: 10px; padding-bottom: 10px; padding-top: 10px">运行cmd，进入"C:\InetPub\AdminScripts" 执行：<br />
CSCRIPT.EXE ADSUTIL.VBS SET W3Svc/Filters/Compression/GZIP/HcDynamicCompressionLevel 9<br />
CSCRIPT.EXE ADSUTIL.VBS SET W3Svc/Filters/Compression/GZIP/HcFileExtensions "htm" "html" "txt"<br />
CSCRIPT.EXE ADSUTIL.VBS SET W3Svc/Filters/Compression/GZIP/HcScriptFileExtensions "asp" "exe" "dll" "aspx"<br />
CSCRIPT.EXE ADSUTIL.VBS SET W3Svc/Filters/Compression/DEFLATE/HcDynamicCompressionLevel 9<br />
CSCRIPT.EXE ADSUTIL.VBS SET W3Svc/Filters/Compression/DEFLATE/HcFileExtensions "htm" "html" "txt"<br />
CSCRIPT.EXE ADSUTIL.VBS SET W3Svc/Filters/Compression/DEFLATE/HcScriptFileExtensions "asp" "exe" "dll" "aspx"</blockquote></fieldset><br />
<br />
最后，执行"iisreset"，重起IIS。<br />
<br />
IIS5下的gzip压缩，请参阅：<a href="http://support.microsoft.com/kb/322603/en-us" target="_blank">ms-kb:322603</a><br />
<br />
APACHE下的gzip压缩请参阅：<a href="http://www.sinzy.net/blog/Read.asp?ID=44&amp;BID=6732" target="_blank">使用Apache的mod_gzip对WEB服务器进行HTTP压缩优化</a><br />
 <img src ="http://www.cnblogs.com/jetxia/aggbug/1040848.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42126/" target="_blank">[新闻]十年回顾：Google的互联网经济</a>]]></description></item><item><title>分页存储过程（收藏）</title><link>http://www.cnblogs.com/jetxia/archive/2008/01/15/1040225.html</link><dc:creator>笑缘</dc:creator><author>笑缘</author><pubDate>Tue, 15 Jan 2008 10:03:00 GMT</pubDate><guid>http://www.cnblogs.com/jetxia/archive/2008/01/15/1040225.html</guid><wfw:comment>http://www.cnblogs.com/jetxia/comments/1040225.html</wfw:comment><comments>http://www.cnblogs.com/jetxia/archive/2008/01/15/1040225.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jetxia/comments/commentRss/1040225.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jetxia/services/trackbacks/1040225.html</trackback:ping><description><![CDATA[前几天去面试，问我写没写过分页存储过程，这个东西其实很简单，以前也经常用，但是从没有自己写过实现，所以就说没有写过。就因为这个就直接fail了。<br />
今天把这个存储过程放到这里作为警言<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008080">--</span><span style="color: #008080">&nbsp;获取指定页的数据&nbsp;</span><span style="color: #008080"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">Create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">PROCEDURE</span><span style="color: #000000">&nbsp;pagination<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">@tblName</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">&nbsp;表名&nbsp;</span><span style="color: #008080"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">@strGetFields</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">1000</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">*</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">&nbsp;需要返回的列&nbsp;</span><span style="color: #008080"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">@fldName</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">)</span><span style="color: #808080">=</span><span style="color: #ff0000">''</span><span style="color: #000000">,&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">&nbsp;排序的字段名&nbsp;</span><span style="color: #008080"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">@PageSize</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">10</span><span style="color: #000000">,&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">&nbsp;页尺寸&nbsp;</span><span style="color: #008080"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">@PageIndex</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">&nbsp;页码&nbsp;</span><span style="color: #008080"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">@doCount</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bit</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">&nbsp;返回记录总数,&nbsp;非&nbsp;0&nbsp;值则返回&nbsp;</span><span style="color: #008080"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">@OrderType</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bit</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">&nbsp;设置排序类型,&nbsp;非&nbsp;0&nbsp;值则降序&nbsp;</span><span style="color: #008080"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">@strWhere</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">1500</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">''</span><span style="color: #000000">&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">&nbsp;查询条件&nbsp;(注意:&nbsp;不要加&nbsp;where)&nbsp;</span><span style="color: #008080"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">AS</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">declare</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strSQL</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">5000</span><span style="color: #000000">)&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">&nbsp;主语句&nbsp;</span><span style="color: #008080"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">declare</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strTmp</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">110</span><span style="color: #000000">)&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">&nbsp;临时变量&nbsp;</span><span style="color: #008080"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">declare</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strOrder</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">400</span><span style="color: #000000">)&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">&nbsp;排序类型&nbsp;</span><span style="color: #008080"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@doCount</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">!=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">begin</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strWhere</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">!=</span><span style="color: #ff0000">''</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strSQL</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;"</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">count</span><span style="color: #000000">(</span><span style="color: #808080">*</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;Total&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">"&nbsp;+&nbsp;@tblName&nbsp;+&nbsp;"</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;"</span><span style="color: #808080">+</span><span style="color: #008000">@strWhere</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strSQL</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;"</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">count</span><span style="color: #000000">(</span><span style="color: #808080">*</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;Total&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">"&nbsp;+&nbsp;@tblName&nbsp;+&nbsp;"</span><span style="color: #ff0000">]</span><span style="color: #000000">"&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">以上代码的意思是如果@doCount传递过来的不是0，就执行总数统计。以下的所有代码都是@doCount为0的情况&nbsp;</span><span style="color: #008080"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">begin</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@OrderType</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">!=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">begin</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strTmp</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;"</span><span style="color: #808080">&lt;</span><span style="color: #000000">(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">min</span><span style="color: #000000">"&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strOrder</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">"&nbsp;+&nbsp;@fldName&nbsp;+"</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">desc</span><span style="color: #000000">"&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">如果@OrderType不是0，就执行降序，这句很重要！&nbsp;</span><span style="color: #008080"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">begin</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strTmp</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;"</span><span style="color: #808080">&gt;</span><span style="color: #000000">(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">max</span><span style="color: #000000">"&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strOrder</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">"&nbsp;+&nbsp;@fldName&nbsp;+"</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">asc</span><span style="color: #000000">"&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&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: #008000">@PageIndex</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">begin</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&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: #008000">@strWhere</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">''</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strSQL</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;"</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">top</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">str</span><span style="color: #000000">(</span><span style="color: #008000">@PageSize</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">"&nbsp;"</span><span style="color: #808080">+</span><span style="color: #008000">@strGetFields</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">"&nbsp;+&nbsp;@tblName&nbsp;+&nbsp;"</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strWhere</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;"&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strOrder</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&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">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strSQL</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;"</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">top</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">str</span><span style="color: #000000">(</span><span style="color: #008000">@PageSize</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">"&nbsp;"</span><span style="color: #808080">+</span><span style="color: #008000">@strGetFields</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">"+&nbsp;@tblName&nbsp;+&nbsp;"</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;"</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strOrder</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">如果是第一页就执行以上代码，这样会加快执行速度&nbsp;</span><span style="color: #008080"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></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">end</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">begin</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">以下代码赋予了@strSQL以真正执行的SQL代码&nbsp;</span><span style="color: #008080"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></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;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strSQL</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;"</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">top</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">str</span><span style="color: #000000">(</span><span style="color: #008000">@PageSize</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">"&nbsp;"</span><span style="color: #808080">+</span><span style="color: #008000">@strGetFields</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">"&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@tblName&nbsp;+&nbsp;"</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">"&nbsp;+&nbsp;@fldName&nbsp;+&nbsp;"</span><span style="color: #ff0000">]</span><span style="color: #000000">"&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strTmp</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"(</span><span style="color: #ff0000">[</span><span style="color: #ff0000">"+&nbsp;@fldName&nbsp;+&nbsp;"</span><span style="color: #ff0000">]</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">top</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">str</span><span style="color: #000000">((</span><span style="color: #008000">@PageIndex</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">)</span><span style="color: #808080">*</span><span style="color: #008000">@PageSize</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">"+&nbsp;@fldName&nbsp;+&nbsp;"</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">"&nbsp;+&nbsp;@tblName&nbsp;+&nbsp;"</span><span style="color: #ff0000">]</span><span style="color: #000000">"&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strOrder</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;")&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;tblTmp)"</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strOrder</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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: #008000">@strWhere</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">''</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strSQL</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;"</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">top</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">str</span><span style="color: #000000">(</span><span style="color: #008000">@PageSize</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">"&nbsp;"</span><span style="color: #808080">+</span><span style="color: #008000">@strGetFields</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">"&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@tblName&nbsp;+&nbsp;"</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">"&nbsp;+&nbsp;@fldName&nbsp;+&nbsp;"</span><span style="color: #ff0000">]</span><span style="color: #000000">"&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strTmp</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"(</span><span style="color: #ff0000">[</span><span style="color: #ff0000">"&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@fldName&nbsp;+&nbsp;"</span><span style="color: #ff0000">]</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">top</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">str</span><span style="color: #000000">((</span><span style="color: #008000">@PageIndex</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">)</span><span style="color: #808080">*</span><span style="color: #008000">@PageSize</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">"&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@fldName&nbsp;+&nbsp;"</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">"&nbsp;+&nbsp;@tblName&nbsp;+&nbsp;"</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strWhere</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;"&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strOrder</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;")&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;tblTmp)&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strWhere</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;"&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@strOrder</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">end</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">exec</span><span style="color: #000000">&nbsp;(</span><span style="color: #008000">@strSQL</span><span style="color: #000000">)<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">GO</span></div>
<img src ="http://www.cnblogs.com/jetxia/aggbug/1040225.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42123/" target="_blank">[新闻]Google 10周年大事记</a>]]></description></item><item><title>asp.net页面的生存周期</title><link>http://www.cnblogs.com/jetxia/archive/2008/01/11/1035126.html</link><dc:creator>笑缘</dc:creator><author>笑缘</author><pubDate>Fri, 11 Jan 2008 05:24:00 GMT</pubDate><guid>http://www.cnblogs.com/jetxia/archive/2008/01/11/1035126.html</guid><wfw:comment>http://www.cnblogs.com/jetxia/comments/1035126.html</wfw:comment><comments>http://www.cnblogs.com/jetxia/archive/2008/01/11/1035126.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jetxia/comments/commentRss/1035126.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jetxia/services/trackbacks/1035126.html</trackback:ping><description><![CDATA[<p><font face="Verdana">当一个页面请求发送到WEB服务器时，不论该事件是由页面提交还是由页面重定向而激发的，页面在其被创建到释放的过程中都会运行一系列的事件。一个ASP.NET页面从被创建到释放的过程包含10个事件。</font></p>
<p><font face="Verdana">　　（1）对象初始化Init事件：页面初始化的标志是Init事件。页面中的控件（包括页面本身）都是在它们最初的Form中被首次初始化的。在成功创建页面的控件树后，对应用程序激发这个事件。当Init事件发生时，在.aspx源文件中静态声明的所有控件都以实例化并取其默认值。应该注意到，这是还没有视图状态信息可供使用。虽然可以重载OnInit方法，但是系统并不保证这些控件实例是按照怎样的顺序被创建的。</font></p>
<p><font face="Verdana">　　（2）加载视图：在初始化之后，页面框架立即加载该页面的视图状态（ViewState）。所谓视图状态就是一些名称/值对的集合，例如可以保存TextBox控件的ID和Text属性值。它一般被用于在一个往返行程中存留信息到服务器，即参与HTTP请求与响应。</font></p>
<p><font face="Verdana">　　页面视图状态被存储在＜input type=&#8221;hidden&#8221;＞字段中，做为_VIEWSTAE的值进行记录。该视图状态通过ASP.NE自动维护。通过重写LoadViewState方法组件，开发人员可控制如何还原视图状态以及如何将其内容影射到内部状态。LoadViewState方法就是从ViewState中获取上一次的状态，并按照页面的控件树的结构，用递归来遍历整个树，将对应的状态恢复到每一个控件上。</font></p>
<p><font face="Verdana">　　（3）处理回发数据：还原了视图状态，页面树种的各个控件的状态就与浏览器上次呈现该页面时这些控件所处的状态相同。下一步需要更新这些控件的状态以发送给客户端。</font></p>
<p><font face="Verdana">　　回发数据处理阶段是各个控件有机会更新其状态，以便准确的反映相应的HTML元素在客户端的状态。例如，一个服务器TextBox控件对应的HTML元素是＜input type=text＞，在回发数据阶段，TextBox控件将检索＜input＞标记的当前值并用它刷新其内部状态。每个控件负责从以发送的数据中提取相应值，并更新其某些属性。TextBox控件将更新Text属性，而CheckBox控件将刷新其Checked属性。服务器控件和HTML元素之间的匹配关系由二者的ID确定。</font></p>
<p><font face="Verdana">　　页框架将在每个提交数据的控件上实现IpostBackDataHandler接口，然后激发LoadPostData事件，通过页面解析发现实现了IpostBackDataHandle接口的控件，这样就能正确的回传数据更新控件状态。在识别控件时，ASP.NET通过匹配控件的唯一标示符来更新正确的控件，该标识符具有名称值集和中的名称值对。这也就是在所有特定的页中每个控件都需要一个唯一标识符的原因之一。其他的步骤都由框架来完成，例如确定每个标识符在环境中是否唯一以及控件的基本属性等。</font></p>
<p><font face="Verdana">LostPostData方法的原型如下：<br />
Public virtual bool LoadPostData(string postDatakey, NameValueCollection postCollection)</font></p>
<p><font face="Verdana">　　PostDataKey是标识控件的关键字，可以理解为控件的ID,postCollection是包含回发数据的集合，可以理解为视图状态值。该方法返回一个bool值，如果是true，则表示控件状态因回发而更改；否则返回false。页框架会更跟踪所有返回true的控件并在这些控件上调用RaisePostDataChangeEvent事件。</font></p>
<p><font face="Verdana">　　LoadPostData方法是由System..Web.WebControls.Control定义的，而添加的每一个服务器控件也是从System..Web.WebControls.Control继承的，所以对于数据的回发处理并不需要干预。</font></p>
<p><font face="Verdana">　　（4）加载页面Load：在回发数据处理阶段结束时，页面中的所有控件都根据客户端上所输入的更改来更新的状态。此时，对页面激发OnLoad事件。对于这个事件，相信大多数朋友都会比较熟悉，用Visual Studio.Net生成的页面中的Page_Load方法就是响应Load事件的方法，对于每一次请求，Load事件都会触发，Page_Load方法也就会执行。可以利用该方法执行一些页面初始化，例如准备好数据库的连接字符串。在事件引用中，为了提高性能，通常使用Page类的IsPostBack属性判断是不是数据回发。</font></p>
<p><font face="Verdana">　　（5）回发更改通知RaisePostDataChanged：如（3）所述，在所有实现了IpostBackDataHandler接口的控件被正确的回传数据更新后，每个控件都有一个布尔值的标识，标识其自上一次提交后改控件的数据是被更改还是保持其值。然后ASP.NET通过搜索页来寻找任何显示控件数据被更改的标识并激发RaisePostDataChanged。RaisePostDataChanged事件直到Load事件发生后，所有控件被更新后才激发。这保证了在控件被回传数据更新前，其他控件的数据在RaisePostDataChanged事件中没有被手动更改过。虽然也可以在Page的基础上自己定义数据更改的事件，但通常这个事件由太大用处。</font></p>
<p><font face="Verdana">　　（6）处理回发事件RaisePostBackEvent：当回传更新导致数据改变而引发服务器端事件后，引发回传的对象会在RaisePostBackEvent事件中被处理。这种引发回传的对象往往是一个按钮被单击或者其状态改变而引发回传的控件。例如Button触发乐Onclick事件、客户端修改了某个文本框的文本、同时将AutoPostBack设置为true、触发TextChanged事件等。</font></p>
<p><font face="Verdana">　　很多代码都在这个事件中执行，因为这是控制事件驱动逻辑的理想位置。为了保证呈现到浏览器的数据的正确性，在一系列的回传事件后，RaisePostBackEvent事件最终被激发。基于一致性考虑，会传中改变的控件直到这个函数被执行后才被更新。在实际的ASP.NET开发工作中要做的工作就是在此事件发生前处理代码。</font></p>
<p><font face="Verdana">　　（7） 预呈现PreRender：在处理回发事件后，页面就准备进行呈现。这一阶段的标志是PreRender事件。各个控件可利用这个很好的时机，以便执行任何需要在保存视图状态和呈现输出结果的前一刻完成得最后一些更新操作。最终请求的处理都会转变为发挥服务器的响应，预呈现这个阶段就是执行在最终呈现之前所做的状态的更改，因为在呈现一个控件之前，必须更具它的属性来产生HTML,比如Style属性。这是典型的例子，这预呈现之前，可以更改一个控件的Style，当执行预呈现时，就可以把Style保存下来，做为呈现阶段显示HTML的样式信息。</font></p>
<p><font face="Verdana">　　（8）保存状态SaveViewState：下一个状态为SaveViewState，在这一状态中所有控件以及页面本身可以刷新自己的SaveState集合的内容。所得到的视图状态随后得以序列化、进行哈希运算、进行Base64编码并关联到VI-EMSTATE隐藏自端。</font></p>
<p><font face="Verdana">　　（9）呈现视图Render：到这里，实际上页面对请求的处理基本就告一段落了，在Render事件中，也调用对象是它们呈现为HTML，然后也收集HTML发送给客户。客户接收到HTML标记后进行重组，最终显示给客户。当Render事件被重载时，开发者可以为浏览器创建定值的HTML，此时页面创建的任何HTML都还没有生效。Render方法用HtmlTextWriter对象做参数并由它产生HTML送给浏览器。这主要用于自定义控件的开发。</font></p>
<p><font face="Verdana">　　（10）处置Disposed：执行销毁控件前的所有最终清理操作。在此阶段必须释放对昂贵资源的引用，如内存的退出、数据库的连接等。</font></p>
<p><font face="Verdana">　　（11）卸载Unload：一个页面的最后生存标志就是Unload事件，该事件在页面对象被解除之前发生。在此事件中，可以调用Dispose方法尽可能释放占用的任何关键资源（例如，文件、图形对象以及数据库连接）。 </font></p>
<img src ="http://www.cnblogs.com/jetxia/aggbug/1035126.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42122/" target="_blank">[新闻]Google上下二十年</a>]]></description></item><item><title>C# Heap(ing) Vs Stack(ing) in .NET: Part IV</title><link>http://www.cnblogs.com/jetxia/archive/2008/01/07/1029498.html</link><dc:creator>笑缘</dc:creator><author>笑缘</author><pubDate>Mon, 07 Jan 2008 12:59:00 GMT</pubDate><guid>http://www.cnblogs.com/jetxia/archive/2008/01/07/1029498.html</guid><wfw:comment>http://www.cnblogs.com/jetxia/comments/1029498.html</wfw:comment><comments>http://www.cnblogs.com/jetxia/archive/2008/01/07/1029498.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jetxia/comments/commentRss/1029498.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jetxia/services/trackbacks/1029498.html</trackback:ping><description><![CDATA[<font face="Courier New">http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory_401282006141834PM/csharp_memory_4.aspx</font><br />
<br />
<p><font face="Verdana, Arial, Helvetica, sans-serif">Even though with the .NET framework we don't have to actively worry about memory management and garbage collection (GC), we still have to keep memory management and GC in mind in order to optimize the performance of our applications. Also, having a basic understanding of how memory management works will help explain the behavior of the variables we work with in every program we write.&nbsp; In this article we'll look into Garbage Collection (GC) and some ways to keep our applications running efficiently by using static class members.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif" size="3"><strong>Smaller Feet == More Efficient Allocation.</strong></font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">To get a better understanding of why a smaller footprint will be more efficient will require us to delve a bit deeper into the anatomy of .NET memory allocation and Garbage Collection (GC).</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><strong>Graphing</strong></font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Let's look at this from the GC's point of view.&nbsp;If we are responsible for "taking out the trash" we need a plan to do this effectively.&nbsp;Obviously, we need to determine what is garbage and what is not (this might be a bit painful for the pack-rats out there).&nbsp; </font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">In order to determine what needs to be kept, we'll first make the assumption that everything not being used is trash (those piles of old papers in the corner, the box of junk in the attic, everything in the closets, etc.)&nbsp; Imagine we live with our two good friends: Joseph Ivan Thomas (JIT) and Cindy Lorraine Richmond (CLR).&nbsp;Joe and Cindy keep track of what they are using and give us a list of things they need to keep.&nbsp;We'll call the initial list our "root" list because we are using it as a starting point.&nbsp; We'll be keeping a master list to graph where everything is in the house that we want to keep.&nbsp;Anything that is needed to make things on our list work will be added to the graph (if we're keeping the TV we don't throw out the remote control for the TV, so it will be added to the list.&nbsp;If we're keeping the computer the keyboard and monitor will be added to the "keep" list).</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">This is how the GC determines what to keep as well.&nbsp;It receives a list of "root" object references to keep from just-in-time (JIT) compiler and common language runtime (CLR) (Remember Joe and Claire?) and then recursively searches object references to build a graph of what should be kept.&nbsp; </font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Roots consist of:</font></p>
<ul>
    <li><font face="Verdana, Arial, Helvetica, sans-serif">Global/Static pointers. One way to make sure our objects are not garbage collected by keeping a reference to them in a static variable.</font>
    <li><font face="Verdana, Arial, Helvetica, sans-serif">Pointers on the stack. We don't want to throw away what our application's threads still need in order to execute.</font>
    <li><font face="Verdana, Arial, Helvetica, sans-serif">CPU register pointers. Anything in the managed heap that is pointed to by a memory address in the CPU should be preserved (don't throw it out).</font></li>
</ul>
<p><img alt="" hspace="0" src="http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory_401282006141834PM/Images/Stacking_Heaping1.gif" align="baseline" border="0" /></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">In the above diagram, objects 1, 3, and 5 in our managed heap are referenced from a root 1 and 5 are directly referenced and 3 is found during the recursive search.&nbsp; If we go back to our analogy and object 1 is our television, object 3 could be our remote control. After all objects are graphed we are ready to move on to the next step, compacting.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><strong>Compacting</strong></font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Now that we have graphed what objects we will keep, we can just move the "keeper objects" around to pack things up.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><img alt="" hspace="0" src="http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory_401282006141834PM/Images/Stacking_Heaping2.gif" align="baseline" border="0" /></font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Fortunately, in our house we don't need to clean out the space before we put something else there. Since Object 2 is not needed, as the GC we'll move Object 3 down and fix the pointer in Object 1.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><img alt="" hspace="0" src="http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory_401282006141834PM/Images/Stacking_Heaping3.gif" align="baseline" border="0" /></font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Next, as the GC, we'll copy Object 5 down</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><img alt="" hspace="0" src="http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory_401282006141834PM/Images/Stacking_Heaping4.gif" align="baseline" border="0" /></font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Now that everything is cleaned up we just need to write a sticky note and put it on the top of our compacted heap to let Claire know where to put new objects.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><img alt="" hspace="0" src="http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory_401282006141834PM/Images/Stacking_Heaping5.gif" align="baseline" border="0" /></font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Knowing the nitty-gritty of CG helps in understanding that moving objects around can be very taxing. As you can see, it makes sense that if we can reduce the size of what we have to move, we'll improve the whole GC process because there will be less to copy.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><strong>What about things outside the managed heap?</strong></font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">As the person responsible for garbage collection, one problem we run into in cleaning house is how to handle objects in the car. When cleaning, we need to clean everything up.&nbsp;What if the laptop is in the house and the batteries are in the car?</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">There are situations where the GC needs to execute code to clean up non-managed resources such as files, database connections, network connections, etc. One possible way to handle this is through a finalizer.</font></p>
<font face="Verdana, Arial, Helvetica, sans-serif">
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; color: blue; font-family: Verdana">class</span><span style="font-size: 10pt; font-family: Verdana"> Sample</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">{</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~Sample()</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// FINALIZER: CLEAN UP HERE</span></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">}</span></p>
<p></font><font face="Verdana, Arial, Helvetica, sans-serif">During object creation, all objects with a finalizer are added to a finalization queue. Let's say objects 1, 4, and 5 have finalizers and are on the finalization queue.&nbsp; Let's look at what happens when objects 2 and 4 are no longer referenced by the application and ready for garbage collection.<br />
&nbsp;<br />
<img alt="" hspace="0" src="http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory_401282006141834PM/Images/Stacking_Heaping6.gif" align="baseline" border="0" />&nbsp;</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Object 2 is treated in the usual fashion. However, when we get to object 4, the GC sees that it is on the finalization queue and instead of reclaiming the memory object 4 owns, object 4 is moved and it's finalizer is added to a special queue named freachable. <br />
&nbsp;<br />
<img alt="" hspace="0" src="http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory_401282006141834PM/Images/Stacking_Heaping7.gif" align="baseline" border="0" />&nbsp;</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">There is a dedicated thread for executing freachable queue items. Once the finalizer is executed by this thread on Object 4, it is removed from the freachable queue. Then and only then is Objet 4 ready for collection.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><img alt="" hspace="0" src="http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory_401282006141834PM/Images/Stacking_Heaping8.gif" align="baseline" border="0" /></font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">So Object 4 lives on until the next round of GC.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Because adding a finalizer to our classes creates additional work for GC it can be very expensive and adversely affect the performance garbage collection and thus our program. Only use finalizers when you are absolutely sure you need them.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">A better practice is to be sure to clean up non-managed resources. As you can imagine, it is preferable to explicitly close connections and use the IDisposable interface for cleaning up instead of a finalizer where possible.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><strong>IDisposaible</strong></font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Classes that implement IDisposable perform clean-up in the Dispose() method (which is the only signature of the interface). So if we have a ResouceUser class instead of using a finalizer as follows:</font></p>
<font face="Verdana, Arial, Helvetica, sans-serif">
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; color: blue; font-family: Verdana">public</span><span style="font-size: 10pt; font-family: Verdana"> <span style="color: blue">class</span> ResourceUser </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">{</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~ResourceUser() <span style="color: green">// THIS IS A FINALIZER</span></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// DO CLEANUP HERE</span></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">}</span></p>
<p></font><font face="Verdana, Arial, Helvetica, sans-serif">We can use IDisposable as a better way to implement the same functionality:</font></p>
<font face="Verdana, Arial, Helvetica, sans-serif">
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; color: blue; font-family: Verdana">public</span><span style="font-size: 10pt; font-family: Verdana"> <span style="color: blue">class</span> ResourceUser : IDisposable</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">{</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; color: blue; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #region</span><span style="font-size: 10pt; font-family: Verdana"> IDisposable Members</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">void</span> Dispose()</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// CLEAN UP HERE!!!</span></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; color: blue; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #endregion</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">}</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-family: Verdana"><font size="3">&nbsp;</font></span></p>
<p></font><font face="Verdana, Arial, Helvetica, sans-serif">IDisposable in integrated with the using keyword. At the end of the using block Dispose() is called on the object declared in using(). The object should not be referenced after the using block because it should be essentially considered "gone" and ready to be cleaned up by the GC.</font></p>
<font face="Verdana, Arial, Helvetica, sans-serif">
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; color: blue; font-family: Verdana">public</span><span style="font-size: 10pt; font-family: Verdana"> <span style="color: blue">static</span> <span style="color: blue">void</span> DoSomething()</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">{</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">ResourceUser rec = <span style="color: blue">new</span> ResourceUser();</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; color: blue; font-family: Verdana">using</span><span style="font-size: 10pt; font-family: Verdana"> (rec)</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">{</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// DO SOMETHING</span></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">} <span style="color: green">// DISPOSE CALLED HERE</span></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// DON'T ACCESS rec HERE</span></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">}</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-family: Verdana"><font size="3">&nbsp;</font></span></p>
<p></font><font face="Verdana, Arial, Helvetica, sans-serif">I like putting the declaration for the object in the using block because it makes more sense visabally and rec is no longer available outside of the scope of the using block. Whis this pattern is more in line with the intention of the IDisposible interface, it is not required.</font></p>
<font face="Verdana, Arial, Helvetica, sans-serif">
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; color: blue; font-family: Verdana">public</span><span style="font-size: 10pt; font-family: Verdana"> <span style="color: blue">static</span> <span style="color: blue">void</span> DoSomething()</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">{</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; color: blue; font-family: Verdana">using</span><span style="font-size: 10pt; font-family: Verdana"> (ResourceUser rec = <span style="color: blue">new</span> ResourceUser())</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">{</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// DO SOMETHING</span></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">} <span style="color: green">// DISPOSE CALLED HERE</span></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">}</span></p>
<p></font><font face="Verdana, Arial, Helvetica, sans-serif">By using using() with classes that implement IDisposible we can perform our cleanup without putting additional overhead on the GC by forcing it to finalize our objects.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif" size="3"><strong>Static Methods</strong></font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Static methods belong to the type, not the instance of our object. This enables us to create items that are shared by all our classes and "trim the fat" so to speak. Only pointers to our static method have to be moved around in memory (8 bytes).&nbsp; The static method itself will be loaded once, very early in the application lifecycle, instead of being contained in each instance of our class. Of course, the bigger the method the more efficiency we gain by making it static. If our methods are small (under 8 bytes) we will actually get worse performance out of making it static because the pointer would be larger than the method it points to.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Here's the details...</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Let's say we have a class with a public method SayHello();</font></p>
<font face="Verdana, Arial, Helvetica, sans-serif">
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; color: blue; font-family: Verdana">class</span><span style="font-size: 10pt; font-family: Verdana"> Dude</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">{</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">private</span> <span style="color: blue">string</span> _Name = "Don";</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">void</span> SayHello()</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(<span style="color: blue">this</span>._Name + " says Hello");</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">}</span><span style="font-family: Verdana"><font size="3">&nbsp;</font></span></p>
<p></font><font face="Verdana, Arial, Helvetica, sans-serif">With every instance of our Dude class we take up space in memory for the SayHello() method.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><img alt="" hspace="0" src="http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory_401282006141834PM/Images/Stacking_Heaping9.gif" align="baseline" border="0" /></font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">A (possibly) more efficient way is to make the method static so that we only have one "SayHello()" in memory no matter how many Dudes are around. Because static members are not instance members we can't use a reference to "this" and have to pass variables into the method to accomplish the same result.&nbsp; </font></p>
<font face="Verdana, Arial, Helvetica, sans-serif">
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; color: blue; font-family: Verdana">class</span><span style="font-size: 10pt; font-family: Verdana"> Dude</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">{</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">private</span> <span style="color: blue">string</span> _Name = "Don";</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: blue">void</span> SayHello(<span style="color: blue">string</span> pName)</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(pName + " says Hello");</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">}</span><span style="font-family: Verdana"><font size="3">&nbsp;</font></span></p>
</font>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><img alt="" hspace="0" src="http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory_401282006141834PM/Images/Stacking_Heaping10.gif" align="baseline" border="0" />&nbsp;</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Keep in mind what happens on the stack when we pass variables (see part II of this series). We have to decide on a case-by-case basis whether using a static method gives us improved performance. For instance, if a static method requires too many parameters and does not have very much internal logic (a small footprint), it is entirely possible we would loose more efficiency in calling a static method that we would gain.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><strong>Static Variables: Watch Out!</strong></font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">There are a couple of things we want to watch out for with static variables. If we have a class with a static method that we want to return a unique number, the following implementation will be buggy: </font></p>
<font face="Verdana, Arial, Helvetica, sans-serif">
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; color: blue; font-family: Verdana">class</span><span style="font-size: 10pt; font-family: Verdana"> Counter</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">{</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">private</span> <span style="color: blue">static</span> <span style="color: blue">int</span> s_Number = 0;</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: blue">int</span> GetNextNumber()</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span> newNumber = s_Number;</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// DO SOME STUFF</span></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s_Number = newNumber + 1;</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> newNumber;</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">}</span></p>
<p></font><font face="Verdana, Arial, Helvetica, sans-serif">If two threads call GetNextNumber() at the same time and both are assigned the same value for newNumber before s_Number is incremented they will return the same result!</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">We need to explicitly lock the read/write memory operations to static variables in the method so only one thread at a time can execute them. Thread management is a very large topic and there are many ways to approach thread synchronization. Using the lock() keyword is one way to ensure only one thread can access a block of code at a time. As a best practice, you should lock as little code as possible because threads have to wait in a queue to execute the code in the lock()&nbsp; block and it can be inefficient.</font></p>
<font face="Verdana, Arial, Helvetica, sans-serif">
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; color: blue; font-family: Verdana">class</span><span style="font-size: 10pt; font-family: Verdana"> Counter</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">{</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">private</span> <span style="color: blue">static</span> <span style="color: blue">int</span> s_Number = 0;</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: blue">int</span> GetNextNumber()</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">lock</span> (<span style="color: blue">typeof</span>(Counter))</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span> newNumber = s_Number;</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// DO SOME STUFF</span></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newNumber += 1;</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s_Number = newNumber;</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> newNumber;</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">}</span></p>
<p></font><font face="Verdana, Arial, Helvetica, sans-serif"><strong>Static Variables: Watch Out... Number 2!</strong></font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">The next thing we have to watch out for objects referenced by static variables.&nbsp; Remember, how anything that is referenced by a "root" is not cleaned up. Here's one of the ugliest examples I can come up with:</font></p>
<font face="Verdana, Arial, Helvetica, sans-serif">
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; color: blue; font-family: Verdana">class</span><span style="font-size: 10pt; font-family: Verdana"> Olympics</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">{</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">static</span> Collection&lt;Runner&gt; TryoutRunners;</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">}</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; color: blue; font-family: Verdana">class</span><span style="font-size: 10pt; font-family: Verdana"> Runner</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">{</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">private</span> <span style="color: blue">string</span> _fileName;</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">private</span> FileStream _fStream;</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">void</span> GetStats()</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileInfo fInfo = <span style="color: blue">new</span> FileInfo(_fileName);</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _fStream = _fileName.OpenRead();</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">}</span></p>
<p></font><font face="Verdana, Arial, Helvetica, sans-serif">Because the Runner Collection is static for the Olympics class, not only will objects in the collection will not be released for garbage collection (they are all indirectly referenced through a root), but as you probably noticed, every time we&nbsp; run GetStats() the stream is opened to the file. Because it is not closed and never released by GC this code is effectively a disaster waiting to happen. Imagine we have 100,000 runners trying out for the Olympics.&nbsp; We would end up with that many non-collectable objects each with an open resource.&nbsp; Ouch! Talk about poor performance! </font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><strong>Singleton</strong></font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">One trick to keep things light is to keep only one instance of a class in memory at all times.&nbsp;To do this we can use the GOF Singleton Pattern.</font></p>
<font face="Verdana, Arial, Helvetica, sans-serif">
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; color: blue; font-family: Verdana">public</span><span style="font-size: 10pt; font-family: Verdana"> <span style="color: blue">class</span> Earth</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">{</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">private</span> <span style="color: blue">static</span> Earth _instance = <span style="color: blue">new</span> Earth();</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">private</span> Earth() { }</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">static</span> Earth GetInstance() { <span style="color: blue">return</span> _instance; }</span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Verdana">}</span></p>
<p></font><font face="Verdana, Arial, Helvetica, sans-serif">We have a private constructor so only Earth can execute it's constructor and make an Earth. We have a static instance of Earth and a static method to get the instance. This particular implementation is thread safe because the CLR ensures thread safe creation of static variables. This is the most elegant way I have found to implement the singleton pattern in C#.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><strong>The 2.0 Static Class</strong></font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">In the .NET 2.0 Framework we can have a static class which is a class in which all the members must be static. This is useful for utility classes and will definitely save us memory space because this class will only exist in one place in memory and it can not be instantiated no matter what.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><strong>In Conclusion...</strong></font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">So to wrap up, some things we can do to improve GC performance are:</font></p>
<ol>
    <li><font face="Verdana, Arial, Helvetica, sans-serif">Clean up. Don't leave resources open!&nbsp; Be sure to close all connections that are opened and clean up all non-managed objects as soon as possible. As a general rule when using non-managed objects, instantiate as late as possible and clean up as soon as possible.</font>
    <li><font face="Verdana, Arial, Helvetica, sans-serif">Don't overdo references.&nbsp; Be reasonable when using references objects.&nbsp; Remember, if our object is alive, all of it's referenced objects will not be collected (and so on, and so on). When we are done with something referenced by class, we can remove it by either setting the reference to null.&nbsp; One trick I like to do is setting unused references to a custom light weight NullObject to avoid getting null reference exceptions. The fewer references laying about when the GC kicks off, the less pressure the mapping process will be.&nbsp;</font>
    <li><font face="Verdana, Arial, Helvetica, sans-serif">Easy does it with finalizers. Finalizers are expensive during GC we should ONLY use them if we can justify it.&nbsp;If we can use IDisposible instead of a finalizer, it will be more efficient because our object can be cleaned up in one GC pass instead of two.</font>
    <li><font face="Verdana, Arial, Helvetica, sans-serif">Keep objects and their children together.&nbsp;It is easier on the GC to copy large chunks of memory together instead of having to essentially de-fragment the heap at each pass, so when we declare a object composed of many other objects, we should instantiate them as closely together as possible.</font>
    <li><font face="Verdana, Arial, Helvetica, sans-serif">And finally... keep objects lighter by making the methods static where appropriate.</font></li>
</ol>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Next time we'll look even more closely at the GC process and look into ways to check under the hood as your program executes to discover problems that may need to be cleaned up.</font></p>
 <img src ="http://www.cnblogs.com/jetxia/aggbug/1029498.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42120/" target="_blank">[新闻]中华英才网面临外资吞并</a>]]></description></item><item><title>C# Heap(ing) Vs Stack(ing) in .NET: Part III</title><link>http://www.cnblogs.com/jetxia/archive/2008/01/07/1029496.html</link><dc:creator>笑缘</dc:creator><author>笑缘</author><pubDate>Mon, 07 Jan 2008 12:58:00 GMT</pubDate><guid>http://www.cnblogs.com/jetxia/archive/2008/01/07/1029496.html</guid><wfw:comment>http://www.cnblogs.com/jetxia/comments/1029496.html</wfw:comment><comments>http://www.cnblogs.com/jetxia/archive/2008/01/07/1029496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jetxia/comments/commentRss/1029496.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jetxia/services/trackbacks/1029496.html</trackback:ping><description><![CDATA[<font face="Courier New">http://www.c-sharpcorner.com/UploadFile/rmcochran/chsarp_memory401152006094206AM/chsarp_memory4.aspx<br />
<br />
<p><font face="Verdana, Arial, Helvetica, sans-serif">Even though with the .NET framework we don't have to actively worry about memory management and garbage collection (GC), we still have to keep memory management and GC in mind in order to optimize the performance of our applications. Also, having a basic understanding of how memory management works will help explain the behavior of the variables we work with in every program we write.&nbsp;In this article we'll cover an issue that arises from having reference variables in the heap and how to fix it using ICloneable.</font></p>
<p><strong><font face="Verdana, Arial, Helvetica, sans-serif">A Copy Is Not A Copy.</font></strong></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">To clearly define the problem, let's examine what happens when there is a value type on the heap versus having a reference type on the heap.&nbsp;First we'll look at&nbsp;the value type. Take the following class and struct.&nbsp;We have a Dude class which contains a Name element and two Shoe(s). We have a CopyDude() method to make it easier to make new Dudes.</font></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">struct</span> Shoe{</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">string</span> Color;</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></p>
<p style="margin: 0in 0in 0pt"><font size="3"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;</font></font></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">class</span> Dude</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">public</span> <span style="color: blue">string</span> Name;</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> Shoe RightShoe;</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> Shoe LeftShoe;</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> Dude CopyDude()</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dude newPerson = <span style="color: blue">new</span> Dude();</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newPerson.Name = Name;</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newPerson.LeftShoe = LeftShoe;</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newPerson.RightShoe = RightShoe;</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> newPerson;</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">string</span> ToString()</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">return</span> (Name + " : Dude!, I have a " + RightShoe.Color&nbsp;+ </font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " shoe on my right foot, and a " +</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LeftShoe.Color + " on my left foot.");</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;</font></span></p>
<p><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Our Dude class is a variable type and because the Shoe struct is a member element of the class they both end up on the heap.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><img alt="" hspace="0" src="http://www.c-sharpcorner.com/UploadFile/rmcochran/chsarp_memory401152006094206AM/Images/heapvsstack3-1.gif" align="baseline" border="0" />&nbsp;</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">When we run the following method:</font></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: blue">void</span> Main()</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class1 pgm = <span style="color: blue">new</span> Class1();</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dude Bill = <span style="color: blue">new</span> Dude();</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bill.Name = "Bill";</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bill.LeftShoe = <span style="color: blue">new</span> Shoe();</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bill.RightShoe = <span style="color: blue">new</span> Shoe();</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bill.LeftShoe.Color = Bill.RightShoe.Color = "Blue";</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dude Ted =&nbsp;Bill.CopyDude();</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ted.Name = "Ted";</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ted.LeftShoe.Color = Ted.RightShoe.Color = "Red";</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Bill.ToString());</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Ted.ToString());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;</font></span></p>
<p><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">We get the expected output:</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Bill : Dude!, I have a Blue shoe on my right foot, and a Blue on my left foot.<br />
Ted : Dude!, I have a Red shoe on my right foot, and a Red on my left foot.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">What happens if we make the Shoe a reference type?&nbsp; Herein lies the problem.&nbsp;If we change the Shoe to a reference type as follows:</font></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">class</span> Shoe{</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">string</span> Color;</font></span></p>
<p><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">and run the exact same code in Main(), look how our input changes:</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Bill : Dude!, I have a Red shoe on my right foot, and a Red on my left foot<br />
Ted : Dude!, I have a Red shoe on my right foot, and a Red on my left foot</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">The Red shoe is on the other foot.&nbsp;This is clearly an error. Do you see why it's happening?&nbsp;Here's what we end up with in the heap.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><img alt="" hspace="0" src="http://www.c-sharpcorner.com/UploadFile/rmcochran/chsarp_memory401152006094206AM/Images/heapvsstack3-2.gif" align="baseline" border="0" />&nbsp;</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Because we now are using Shoe as a reference type instead of a value type and when the contents of a reference type are copied only the pointer is copied (not the actual object being pointed to), we have to do some extra work to make our Shoe reference type behave more like a value type.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Luckily, we have an interface that will help us out: ICloneable.&nbsp;This interface is basically a contract that all Dudes will agree to and defines how a reference type is duplicated in order to avoid our "shoe sharing" error. All of our classes that need to be "cloned" should use the ICloneable interface, including the Shoe class.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">ICloneable consists of one method: Clone()</font></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">object</span> Clone()</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; color: blue; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;</font></span></p>
<p><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</font></span></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Here's how we'll implement it in the Shoe class:</font></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">class</span> Shoe : ICloneable</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">string</span> Color;</font></span></p>
<p style="margin: 0in 0in 0pt"><font face="Verdana, Arial, Helvetica, sans-serif"><span style="font-size: 9pt; color: blue; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #region</span><span style="font-size: 9pt; font-family: 'Courier New'"> ICloneable Members</span></font></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">object</span> Clone()</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;{</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shoe newShoe = <span style="color: blue">new</span> Shoe();</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newShoe.Color = Color.Clone() <span style="color: blue">as</span> <span style="color: blue">string</span>;</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> newShoe;</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; color: blue; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #endregion</font></span></p>
<p><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Inside the Cone() method, we just make a new Shoe, clone all the reference types and copy all the value types and return the new object. You probably noticed that the string class already implements ICloneable so we can call Color.Clone().&nbsp;Because Clone() returns a reference to an object, we have to "retype" the reference before we can set the Color of the shoe.</font></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif">Next, in our CopyDude() method we need to clone the shoes instead of copying them</font></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> Dude CopyDude()</font></span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; font-family: 'Courier New'"><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font></span></p>
<p styl