﻿<?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>博客园-一方乐土</title><link>http://www.cnblogs.com/bit-sand/</link><description>精诚所至，金石为开！</description><language>zh-cn</language><lastBuildDate>Thu, 28 Aug 2008 07:18:33 GMT</lastBuildDate><pubDate>Thu, 28 Aug 2008 07:18:33 GMT</pubDate><ttl>60</ttl><item><title>我的CSS备忘录---高级选择器、框模型、定位</title><link>http://www.cnblogs.com/bit-sand/archive/2008/07/06/WebStandard_Css.html</link><dc:creator>任力</dc:creator><author>任力</author><pubDate>Sun, 06 Jul 2008 02:02:00 GMT</pubDate><guid>http://www.cnblogs.com/bit-sand/archive/2008/07/06/WebStandard_Css.html</guid><wfw:comment>http://www.cnblogs.com/bit-sand/comments/1138924.html</wfw:comment><comments>http://www.cnblogs.com/bit-sand/archive/2008/07/06/WebStandard_Css.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/bit-sand/comments/commentRss/1138924.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bit-sand/services/trackbacks/1138924.html</trackback:ping><description><![CDATA[摘要: 学习CSS以前总感觉是设计人员的事情，这种想法随着时间的向后推移，发现根本不是那会事，这不，赶紧找了本精通CSS看了起来，也从中学到了不少东西。
我把关键的部分也记录下来，方便自己，方便大家！&nbsp;&nbsp;<a href='http://www.cnblogs.com/bit-sand/archive/2008/07/06/WebStandard_Css.html'>阅读全文</a><img src ="http://www.cnblogs.com/bit-sand/aggbug/1138924.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41937/" target="_blank">[新闻]Google拟在9月发布自有浏览器 或采用火狐内核</a>]]></description></item><item><title>职业生涯5个必经阶段，你在哪个阶段？</title><link>http://www.cnblogs.com/bit-sand/archive/2008/05/16/1200469.html</link><dc:creator>任力</dc:creator><author>任力</author><pubDate>Fri, 16 May 2008 05:37:00 GMT</pubDate><guid>http://www.cnblogs.com/bit-sand/archive/2008/05/16/1200469.html</guid><wfw:comment>http://www.cnblogs.com/bit-sand/comments/1200469.html</wfw:comment><comments>http://www.cnblogs.com/bit-sand/archive/2008/05/16/1200469.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/bit-sand/comments/commentRss/1200469.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bit-sand/services/trackbacks/1200469.html</trackback:ping><description><![CDATA[摘要: 职业管理顾问认为，一个人的职业生涯发展可分作五个阶段，把握住每个阶段可能出现的问题，提前规划，才能让自己掌握主动权。&nbsp;&nbsp;<a href='http://www.cnblogs.com/bit-sand/archive/2008/05/16/1200469.html'>阅读全文</a><img src ="http://www.cnblogs.com/bit-sand/aggbug/1200469.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41936/" target="_blank">[新闻]微软正在构思将Wi-Fi带入汽车</a>]]></description></item><item><title>收集CSS规范</title><link>http://www.cnblogs.com/bit-sand/archive/2008/04/25/1170869.html</link><dc:creator>任力</dc:creator><author>任力</author><pubDate>Fri, 25 Apr 2008 04:46:00 GMT</pubDate><guid>http://www.cnblogs.com/bit-sand/archive/2008/04/25/1170869.html</guid><wfw:comment>http://www.cnblogs.com/bit-sand/comments/1170869.html</wfw:comment><comments>http://www.cnblogs.com/bit-sand/archive/2008/04/25/1170869.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cnblogs.com/bit-sand/comments/commentRss/1170869.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bit-sand/services/trackbacks/1170869.html</trackback:ping><description><![CDATA[摘要: 与大家分享一下CSS的简单规范，方便部门之间的合作&nbsp;&nbsp;<a href='http://www.cnblogs.com/bit-sand/archive/2008/04/25/1170869.html'>阅读全文</a><img src ="http://www.cnblogs.com/bit-sand/aggbug/1170869.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41935/" target="_blank">[新闻]对比测试：IE8 Beta 2 VS Firefox 3.0.1</a>]]></description></item><item><title>旁听复旦大学软件学院课一天有感</title><link>http://www.cnblogs.com/bit-sand/archive/2008/04/06/fudan.html</link><dc:creator>任力</dc:creator><author>任力</author><pubDate>Sat, 05 Apr 2008 16:46:00 GMT</pubDate><guid>http://www.cnblogs.com/bit-sand/archive/2008/04/06/fudan.html</guid><wfw:comment>http://www.cnblogs.com/bit-sand/comments/1138797.html</wfw:comment><comments>http://www.cnblogs.com/bit-sand/archive/2008/04/06/fudan.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/bit-sand/comments/commentRss/1138797.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bit-sand/services/trackbacks/1138797.html</trackback:ping><description><![CDATA[摘要: <div><img src="http://www.fudan.edu.cn/new_dep/img/logo.gif" style="float:right; display:block">想看看复旦是什么样的,同时也想听听复旦的研究生课程主要介绍的是什么?<br>今天早晨,早早的起来,与总程一起去听课！准备去旁听一天复旦的软件课。锁定目标:复旦大学软件学院.</div>&nbsp;&nbsp;<a href='http://www.cnblogs.com/bit-sand/archive/2008/04/06/fudan.html'>阅读全文</a><img src ="http://www.cnblogs.com/bit-sand/aggbug/1138797.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41934/" target="_blank">[新闻]iPhone存在严重密码安全漏洞</a>]]></description></item><item><title>盖茨哭了----微软洽购雅虎致盖茨鲍尔默股票损失达7.9亿美元</title><link>http://www.cnblogs.com/bit-sand/articles/1094650.html</link><dc:creator>任力</dc:creator><author>任力</author><pubDate>Fri, 07 Mar 2008 02:07:00 GMT</pubDate><guid>http://www.cnblogs.com/bit-sand/articles/1094650.html</guid><wfw:comment>http://www.cnblogs.com/bit-sand/comments/1094650.html</wfw:comment><comments>http://www.cnblogs.com/bit-sand/articles/1094650.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/bit-sand/comments/commentRss/1094650.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bit-sand/services/trackbacks/1094650.html</trackback:ping><description><![CDATA[摘要: 1月31日(微软提出收购雅虎要约前一天),微软股票收报32.6美元,到现在已经下跌14%;而1月31日,雅虎收报为19.18美元,到现在却上涨近50%.&nbsp;&nbsp;<a href='http://www.cnblogs.com/bit-sand/articles/1094650.html'>阅读全文</a><img src ="http://www.cnblogs.com/bit-sand/aggbug/1094650.html?type=2" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41931/" target="_blank">[新闻]GC2008：星际争霸2进程报告 微调进程延续</a>]]></description></item><item><title>艳照门连锁反应之长春电脑维修</title><link>http://www.cnblogs.com/bit-sand/articles/1094633.html</link><dc:creator>任力</dc:creator><author>任力</author><pubDate>Fri, 07 Mar 2008 01:56:00 GMT</pubDate><guid>http://www.cnblogs.com/bit-sand/articles/1094633.html</guid><wfw:comment>http://www.cnblogs.com/bit-sand/comments/1094633.html</wfw:comment><comments>http://www.cnblogs.com/bit-sand/articles/1094633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/bit-sand/comments/commentRss/1094633.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bit-sand/services/trackbacks/1094633.html</trackback:ping><description><![CDATA[摘要: 香港娱乐圈“艳照门”事件闹得沸沸扬扬,竟让很多要维修电脑的人心存顾忌,担心隐私外泄.记者近来在采访中发现,长春市一些电脑维修店就推出徕客新措:与客户签订《电脑数据信息保密协议》.&nbsp;&nbsp;<a href='http://www.cnblogs.com/bit-sand/articles/1094633.html'>阅读全文</a><img src ="http://www.cnblogs.com/bit-sand/aggbug/1094633.html?type=2" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41931/" target="_blank">[新闻]GC2008：星际争霸2进程报告 微调进程延续</a>]]></description></item><item><title>土豆网获得2008奥运会转播权</title><link>http://www.cnblogs.com/bit-sand/articles/tudou.html</link><dc:creator>任力</dc:creator><author>任力</author><pubDate>Fri, 07 Mar 2008 01:17:00 GMT</pubDate><guid>http://www.cnblogs.com/bit-sand/articles/tudou.html</guid><wfw:comment>http://www.cnblogs.com/bit-sand/comments/1094553.html</wfw:comment><comments>http://www.cnblogs.com/bit-sand/articles/tudou.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/bit-sand/comments/commentRss/1094553.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bit-sand/services/trackbacks/1094553.html</trackback:ping><description><![CDATA[摘要: 王微是中国最有名的视频网站之一“土豆网”的创始人，最近碰上了很多“意外事故”。2月28日，《亚洲华尔街日报》报道称，拥有2008年奥运会转播权的中央电视台于当日授权土豆网和Myspace中国转播奥运赛事的权利。这一报道引起了巨大的漩涡，各大网站顿时哗然。因为谁都知道2008年奥运会的网站视频播放权是巨大的优势资源，没想到土豆网居然能“捷足先登”。 &nbsp;&nbsp;<a href='http://www.cnblogs.com/bit-sand/articles/tudou.html'>阅读全文</a><img src ="http://www.cnblogs.com/bit-sand/aggbug/1094553.html?type=2" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41931/" target="_blank">[新闻]GC2008：星际争霸2进程报告 微调进程延续</a>]]></description></item><item><title>深入理解.NET内存回收机制</title><link>http://www.cnblogs.com/bit-sand/archive/2008/02/22/gc.html</link><dc:creator>任力</dc:creator><author>任力</author><pubDate>Fri, 22 Feb 2008 13:26:00 GMT</pubDate><guid>http://www.cnblogs.com/bit-sand/archive/2008/02/22/gc.html</guid><wfw:comment>http://www.cnblogs.com/bit-sand/comments/1078200.html</wfw:comment><comments>http://www.cnblogs.com/bit-sand/archive/2008/02/22/gc.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/bit-sand/comments/commentRss/1078200.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bit-sand/services/trackbacks/1078200.html</trackback:ping><description><![CDATA[<p><font face="Verdana">转载自：<a href="http://www.chinamacro.com/blog/visit_detail.aspx?blogid=177">http://www.chinamacro.com/blog/visit_detail.aspx?blogid=177</a></font><br />
.Net平台提供了许多新功能，这些功能能够帮助程序员生产出更高效和稳定的代码。其中之一就是垃圾回收器（GC）。这篇文章将深入探讨这一功能，了解它是如何工作的以及如何编写代码来更好地使用这一.Net平台提供的功能。 <br />
<br />
<strong>.Net中的内存回收机制</strong><br />
<br />
垃圾回收器是用来管理应用程序的内存分配和释放的。在垃圾回收器出现以前，程序员在使用内存时需要向系统申请内存空间。有些语言，例如Visual Basic，可以自动完成向系统申请内存空间的工作。但是在诸如Visual C++的语言中要求程序员在程序代码中申请内存空间。如果程序员在使用了内存之后忘了释放内存，则会引起内存泄漏。但是有了垃圾回收器，程序员就不必关心内存中对象在离开生存期后是否被释放的问题。当一个应用程序在运行的时候，垃圾回收器设置了一个托管堆。托管堆和C语言中的堆向类似，但是程序员不需要从托管堆中释放对象，并且在托管堆中对象的存放是连续的。<br />
<br />
每次当开发人员使用 new 运算符创建对象时，运行库都从托管堆为该对象分配内存。新创建的对象被放在上次创建的对象之后。垃圾回收器保存了一个指针，该指针总是指向托管堆中最后一个对象之后的内存空间。当新的对象被产生时，运行库就知道应该将新的对象放在内存的什么地方。同时开发人员应该将相同类型的对象放在一起。例如当开发人员希望向数据库写入数据的时侯，首先需要创建一个连接对象，然后是Command对象，最后是DataSet对象。如果这些对象放在托管堆相邻的区域内，存取它们就非常快。<br />
<br />
当垃圾回收器的指针指向托管堆以外的内存空间时，就需要回收内存中的垃圾了。在这个过程中，垃圾回收器首先假设在托管堆中所有的对象都需要被回收。然后它在托管堆中寻找被根对象引用的对象（根对象就是全局，静态或处于活动中的局部变量以及寄存器指向的对象），找到后将它们加入一个有效对象的列表中，并在已经搜索过的对象中寻找是否有对象被新加入的有效对象引用。直到垃圾回收器检查完所有的对象后，就有一份根对象和根对象直接或间接引用了的对象的列表，而其它没有在表中的对象就被从内存中回收。<br />
<br />
当对象被加入到托管堆中时，如果它实现了finalize（）方法，垃圾回收器会在它的终结列表（Finalization List）中加入一个指向该对象的指针。当该对象被回收时，垃圾回收器会检查终结列表，看是否需要调用对象的finalize（）方法。如果有的话，垃圾回收器将指向该对象的指针加入一个完成器队列中，该完成器队列保存了那些准备调用finalize（）方法的对象。到了这一步对象还不是真正的垃圾对象。因此垃圾回收器还没有把他们从托管堆中回收。<br />
<br />
当对象准备被终结时，另一个垃圾回收器线程会调用在完成器队列中每个对象的finalize（）方法。当调用完成后，线程将指针从完成器队列中移出，这样垃圾回收器就知道在下一次回收对象时可以清除被终结的对象了。从上面可以看到垃圾回收机制带来的很大一部分额外工作就是调用finalize（）方法，因此在实际编程中开发人员应该避免在类中实现finalize（）方法。<br />
<br />
对于finalize（）方法的另一个问题是开发人员不知道什么时候它将被调用。它不像C++中的析构函数在删除一个对象时被调用。为了解决这个问题，在.Net中提供了一个接口IDisposable。微软建议在实现带有fianlize（）方法的类的时侯按照下面的模式定义对象：<br />
<br />
<table bgcolor="#ffffff" border="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td><br />
            public class Class1 : IDisposable <br />
            {<br />
            public Class1()<br />
            {<br />
            }<br />
            <br />
            ~Class1 ()<br />
            {<br />
            //垃圾回收器将调用该方法，因此参数需要为false。<br />
            Dispose (false);<br />
            }<br />
            <br />
            //该方法定义在IDisposable接口中。<br />
            public void Dispose ()<br />
            {<br />
            //该方法由程序调用，在调用该方法之后对象将被终结。<br />
            //因为我们不希望垃圾回收器再次终结对象，因此需要从终结列表中去除该对象。<br />
            GC.SuppressFinalize (this);<br />
            //因为是由程序调用该方法的，因此参数为true。<br />
            Dispose (true);<br />
            }<br />
            <br />
            //所有与回收相关的工作都由该方法完成<br />
            private void Dispose(bool disposing)<br />
            <script language="Javascript">document.write("<img src='http://counter.yesky.com/counter.shtml?CID=72348964619288576&AID=-1&refer="+escape(document.referrer)+"&cur="+escape(document.URL)+"' src_cetemp='http://counter.yesky.com/counter.shtml?CID=72348964619288576&AID=-1&refer="+escape(document.referrer)+"&cur="+escape(document.URL)+"' border='0' alt='' width='0' height='0' />");</script>
            <img alt="" src="http://counter.yesky.com/counter.shtml?CID=72348964619288576&amp;AID=-1&amp;refer=http%3A//www.baidu.com/s%3Fie%3Dgb2312%26bs%3DIDisposable%25B5%25C4%25BB%25D8%25CA%25D5%25B9%25FD%25B3%25CC%26sr%3D%26z%3D%26cl%3D3%26f%3D8%26wd%3DDispose%2528bool+disposing%2529%25B2%25BB%25CA%25C7CRL%25CC%25E1%25B9%25A9%25B5%25C4%25D2%25BB%25B8%25F6%25BB%25FA%25D6%25C6%252C+%25B6%25F8%25BD%25F6%25BD%25F6%25CA%25C7%25D2%25BB%25B8%25F6%25C9%25E8%25BC%25C6%25C4%25A3%25CA%25BD%2528%25D7%25F7%25CE%25AA%25D2%25BB%25B8%25F6IDisposable%25BD%25D3%25BF%25DA%25B5%25C4%25B7%25BD%25B7%25A8%2529%252C%25CB%25FC%25B5%25C4%25C4%25BF%25B5%25C4%25CA%25C7%25C8%25C3%25B9%25A9%25C0%25E0%25B6%25D4%25CF%25F3%25B5%25C4%25CA%25B9%25D3%25C3%25D5%25DF%2528%25BF%25CD%25BB%25A7%2529%25D4%25DA%25CA%25B9%25D3%25C3%25CD%25EA%25C0%25E0%26ct%3D0&amp;cur=http%3A//www.chinamacro.com/blog/visit_detail.aspx%3Fblogid%3D177" border="0" height="0" width="0" /> <img alt="" src="http://counter.yesky.com/counter.shtml?CID=72348964619288576&amp;AID=-1&amp;refer=http%3A//www.yesky.com/20030311/1656401_1.shtml&amp;cur=http%3A//www.yesky.com/20030311/1656401.shtml" border="0" height="0" width="0" /> {<br />
            lock(this) //避免产生线程错误。<br />
            {<br />
            if (disposing)<br />
            {<br />
            //需要程序员完成释放对象占用的资源。<br />
            }<br />
            <br />
            //对象将被垃圾回收器终结。在这里添加其它和清除对象相关的代码。<br />
            }<br />
            }<br />
            }<br />
            </td>
        </tr>
    </tbody>
</table>
<br />
现在我们了解了垃圾回收器工作的基本原理，接下来让我们看一看垃圾回收器内部是如何工作的。目前有很多种类型的垃圾回收器。微软实现了一种生存期垃圾回收器（Generational Garbage Collector）。生存期垃圾回收器将内存分为很多个托管堆，每一个托管堆对应一种生存期等级。生存期垃圾回收器遵循着下面的原则：<br />
<br />
新生成的对象，其生存期越短；而对象生成时间越长的对象，其生存期也就越长。对于垃圾回收器来说，回收一部分对象总是比回收全部对象要快，因此垃圾回收器对于那些生存期短的对象回收的频率要比生存期长的对象的回收频率高。<br />
<br />
.Net中的垃圾回收器中目前有三个生存期等级：0，1和2。0、1、2等级对应的托管堆的初始化大小分别是256K，2M和10M。垃圾回收器在发现改变大小能够提高性能的话，会改变托管堆的大小。例如当应用程序初始化了许多小的对象,并且这些对象会被很快回收的话，垃圾回收器就会将0等级的托管堆变为128K，并且提高回收的频率。如果情况相反，垃圾回收器发现在0等级的托管堆中不能回收很多空间时，就会增加托管堆的大小。<br />
在应用程序初始化的之前，所有等级的托管堆都是空的。当对象被初始化的时候，他们会按照初始化的先后顺序被放入等级为0的托管堆中。在托管堆中对象的存放是连续的，这样使得托管堆存取对象的速度很快，因为托管对不必对内存进行搜索。垃圾回收器中保存了一个指针指向托管堆中最后一个对象之后的内存空间。图一中显示了一个包含四个对象的0等级的托管堆。<br />
<br />
<img alt="" src="http://www.yesky.com/20030311/jt-2003-3-11-image002.jpg" height="74" width="220" /><br />
图一 包含四个对象的托管堆<br />
<br />
当0等级托管堆被对象填满后，例如候程序初始化了新的对象，使0等级托管堆的大小超过了256K，垃圾回收器会检查托管堆中的所有对象，看是否有对象可以回收。当开始回收操作时，如前面提到的，垃圾回收器会找出根节点和根节点直接或间接引用了的对象，然后将这些对象转移到1等级托管堆中，并将0等级托管堆的指针移到最开始的位置以清除所有的对象。同时垃圾回收器会压缩1等级托管堆以保证所有对象之间没有内存空隙。当1等级托管堆满了之后，会将对象转移到2等级的托管堆。<br />
<br />
例如在图一之后，垃圾回收器开始回收对象，假定D对象将被回收，同时程序创建了E和F对象。这时候托管堆中的对象如图二所示。<br />
<br />
<img alt="" src="http://www.yesky.com/20030311/jt-2003-3-11-image003.gif" height="74" width="265" /><br />
图二 回收对象后的0等级和1等级托管堆<br />
<br />
然后程序创建了新的对象G和H，再一次触发了垃圾回收器。对象E将被回收。这时候托管堆中的对象如图三所示。<br />
<br />
<img alt="" src="http://www.yesky.com/20030311/jt-2003-3-11-image004.gif" height="67" width="362" /><br />
<br />
生存期垃圾回收器的原则也有例外的情况。当对象的大小超过84K时，对象会被放入"大对象区"。大对象区中的对象不会被垃圾回收器回收，也不会被压缩。这样做是为了强制垃圾回收器只能回收小对象以提高程序的性能。<br />
<br />
<strong>控制垃圾回收器</strong><br />
<br />
在.Net框架中提供了很多方法使开发人员能够直接控制垃圾回收器的行为。通过使用GC.Collect（）或GC.Collect（int GenerationNumber）开发人员可以强制垃圾回收器对所有等级的托管堆进行回收操作。在大多数的情况下开发人员不需要干涉垃圾回收器的行为，但是有些情况下，例如当程序进行了非常复杂的操作后希望确认内存中的垃圾对象已经被回收，就可以使用上面的方法。另一个方法是GC.WaitForPendingFinalizers（），它可以挂起当前线程，直到处理完成器队列的线程清空该队列为止。<br />
<br />
使用垃圾回收器最好的方法就是跟踪程序中定义的对象，在程序不需要它们的时候手动释放它们。例如程序中的一个对象中有一个字符串属性，该属性会占用一定的内存空间。当该属性不再被使用时，开发人员可以在程序中将其设定为null，这样垃圾回收器就可以回收该字符串占用的空间。另外，如果开发人员确定不再使用某个对象时，需要同时确定没有其它对象引用该对象，否则垃圾回收器不会回收该对象。<br />
<br />
另外值得一提的是finalize（）方法应该在较短的时间内完成，这是因为垃圾回收器给finalize（）方法限定了一个时间，如果finalize（）方法在规定时间内还没有完成，垃圾回收器会终止运行finalize（）方法的线程。在下面这些情况下程序会调用对象的finalize（）方法：<br />
<br />
0等级垃圾回收器已满<br />
<br />
程序调用了执行垃圾回收的方法<br />
<br />
公共语言运行库正在卸载一个应用程序域<br />
<br />
公共语言运行库正在被卸载<br />
（原文地址：<a href="http://www.yesky.com/20030311/1656401.shtml">http://www.yesky.com/20030311/1656401.shtml</a>）</p>
<p>&nbsp;</p>
<h2><span style="font-size: 14pt;">对.Net 垃圾回收Finalize 和Dispose的理解 </span></h2>
<p><strong>我们先来谈谈析构函数。<br />
<br />
</strong></p>
<p>析构函数是不可继承的。因此，除了自已所声明的析构函数外，一个类不具有其他析构函数。</p>
<p>由于析构函数要求不能带有参数，因此它不能被重载，所以一个类至多只能有一个析构函数。</p>
<p>析构函数是自动调用的，它不能被显式调用。当任何代码都不再可能使用一个实例时，该实例就符合被销毁的条件。此后，它所对应的实例析构函数随时均可能被调用。销毁一个实例时，按照从派生程度最大到派生程度最小的顺序，调用该实例的继承链中的各个析构函数。析构函数可以在任何线程上执行。</p>
<p>下列示例的输出</p>
<pre class="code">using System;<br />
class A<br />
{<br />
~A() {<br />
Console.WriteLine("A's destructor");<br />
}<br />
}<br />
class B: A<br />
{<br />
~B() {<br />
Console.WriteLine("B's destructor");<br />
}<br />
}<br />
class Test<br />
{<br />
static void Main() {<br />
B b = new B();<br />
b = null;<br />
GC.Collect();<br />
GC.WaitForPendingFinalizers();<br />
}<br />
}</pre>
<p>为</p>
<pre class="code">B's destructor<br />
A's destructor</pre>
<p>这是由于继承链中的析构函数是按照从派生程度最大到派生程度最小的顺序调用的。</p>
<p>析构函数实际上是重写了 <code class="ce"><font face="新宋体">System.Object</font></code> 中的虚方法 <code class="ce"><font face="新宋体">Finalize</font></code>。C# 程序中不允许重写此方法或直接调用它（或它的重写）。例如，下列程序</p>
<pre class="code">class A<br />
{<br />
override protected void Finalize() {}   // error<br />
public void F() {<br />
this.Finalize();                     // error<br />
}<br />
}</pre>
<p>包含两个错误。</p>
<p>编译器的行为就像此方法和它的重写根本不存在一样。因此，以下程序：</p>
<pre class="code">class A<br />
{<br />
void Finalize() {}                     // permitted<br />
}</pre>
<p>是有效的，所声明的方法隐藏了 <code class="ce"><font face="新宋体">System.Object</font></code> 的 <code class="ce"><font face="新宋体">Finalize</font></code> 方法。<br />
<br />
<br />
<strong>好，现在我们开始来谈谈Finalize 和Dispose。</strong><br />
<br />
<strong>Finalize 和Dispose(bool disposing)和 Dispose() 的相同点:</strong> </p>
<p>这三者都是为了释放非托管资源服务的.</p>
<p><strong>Finalize 和 Dispose() 和Dispose(bool disposing)的不同点:</strong> </p>
<ol>
    <li>Finalize是CLR提供的一个机制, 它保证如果一个类实现了Finalize方法,那么当该类对象被垃圾回收时,垃圾回收器会调用Finalize方法.而该类的开发者就必须在Finalize方法中处理 非托管资源的释放. 但是什么时候会调用Finalize由垃圾回收器决定,该类对象的使用者(客户)无法控制.从而无法及时释放掉宝贵的非托管资源.由于非托管资源是比较宝贵了,所以这样会降低性能.
    </li>
    <li>Dispose(bool disposing)不是CRL提供的一个机制, 而仅仅是一个设计模式(作为一个IDisposable接口的方法),它的目的是让供类对象的使用者(客户)在使用完类对象后,可以及时手动调用非托管资源的释放,无需等到该类对象被垃圾回收那个时间点.这样类的开发者就只需把原先写在Finalize的释放非托管资源的代码,移植到Dispose(bool disposing)中.&nbsp; 而在Finalize中只要简单的调用 "Dispose(false)"(为什么传递false后面解释)就可以了. </li>
</ol>
<p><strong>这个时候我们可能比较疑惑,为什么还需要一个Dispose()方法?难道只有一个Dispose(bool disposing)或者只有一个Dispose()不可以吗?</strong> <br />
答案是:&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只有一个Dispose()不可以. 为什么呢?因为如果只有一个Dispose()而没有Dispose(bool disposing)方法.那么在处理实现非托管资源释放的代码中无法判断该方法是客户调用的还是垃圾回收器通过Finalize调用的.无法实现判断如果是客户手动调用,那么就不希望垃圾回收器再调用Finalize()(调用GC.SupperFinalize方法).另一个可能的原因(:我们知道如果是垃圾回收器通过Finalize调用的,那么在释放代码中我们可能还会引用其他一些托管对象,而此时这些托管对象可能已经被垃圾回收了, 这样会导致无法预知的执行结果(千万不要在Finalize中引用其他的托管对象). <br />
<br />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所以确实需要一个bool disposing参数, 但是如果只有一个Dispose(bool disposing),那么对于客户来说,就有一个很滑稽要求,Dispose(false)已经被Finalize使用了,必须要求客户以Dispose(true)方式调用,但是谁又能保证客户不会以Dispose(false)方式调用呢?所以这里采用了一中设计模式:重载&nbsp; 把Dispose(bool disposing)实现为 protected, 而Dispose()实现为Public,那么这样就保证了客户只能调用Dispose()(内部调用Dispose(true)//说明是客户的直接调用),客户无法调用Dispose(bool disposing). <br />
</p>
<p><strong>范例如下:</strong> </p>
<p><span style="color: #008000;">public class BaseResource: IDisposable <br />
{ <br />
&nbsp; //前面我们说了<font style="color: #008000;" color="#000000">析构函数实际上是重写了 <code class="ce"><font face="新宋体">System.Object</font></code> 中的虚方法 <code class="ce"><font face="新宋体">Finalize</font></code>, </font>默认情况下,一个类是没有析构函数的,也就是说,对象被垃圾回收时不会被调用Finalize方法 <br />
&nbsp; ~BaseResource()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 为了保持代码的可读性性和可维护性,千万不要在这里写释放非托管资源的代码 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 必须以Dispose(false)方式调用,以false告诉Dispose(bool disposing)函数是从垃圾回收器在调用Finalize时调用的 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dispose(false); <br />
&nbsp;&nbsp; } <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; //&nbsp;无法被客户直接调用 <br />
&nbsp;&nbsp; // 如果 disposing 是 true, 那么这个方法是被客户直接调用的,那么托管的,和非托管的资源都可以释放 <br />
&nbsp;&nbsp; // 如果 disposing 是 false, 那么函数是从垃圾回收器在调用Finalize时调用的,此时不应当引用其他托管对象所以,只能释放非托管资源 <br />
&nbsp;&nbsp; protected virtual void Dispose(bool disposing) <br />
&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 那么这个方法是被客户直接调用的,那么托管的,和非托管的资源都可以释放 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(disposing) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 释放 托管资源 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OtherManagedObject.Dispose(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //释放非托管资源 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DoUnManagedObjectDispose(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 那么这个方法是被客户直接调用的,告诉垃圾回收器从Finalization队列中清除自己,从而阻止垃圾回收器调用Finalize方法.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(disposing)&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;GC.SuppressFinalize(this);&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; }&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; //可以被客户直接调用 <br />
&nbsp;&nbsp; public void Dispose() <br />
&nbsp;&nbsp; { <br />
&nbsp;&nbsp; &nbsp;&nbsp;//必须以Dispose(true)方式调用,以true告诉Dispose(bool disposing)函数是被客户直接调用的 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dispose(true);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; } <br />
}</span> <br />
<br />
上面的范例达到的目的: <br />
<br />
1/ 如果客户没有调用Dispose(),未能及时释放托管和非托管资源,那么在垃圾回收时,还有机会执行Finalize(),释放非托管资源,但是造成了非托管资源的未及时释放的空闲浪费 </p>
<p>2/ 如果客户调用了Dispose(),就能及时释放了托管和非托管资源,那么该对象被垃圾回收时,不回执行Finalize(),提高了非托管资源的使用效率并提升了系统性能</p>
<img src ="http://www.cnblogs.com/bit-sand/aggbug/1078200.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41930/" target="_blank">[新闻]科学家在世界最大对撞机中观察到首批粒子</a>]]></description></item><item><title>.NET设计模式(3): 抽象工厂模式</title><link>http://www.cnblogs.com/bit-sand/archive/2008/01/31/abstract_factory.html</link><dc:creator>任力</dc:creator><author>任力</author><pubDate>Thu, 31 Jan 2008 08:46:00 GMT</pubDate><guid>http://www.cnblogs.com/bit-sand/archive/2008/01/31/abstract_factory.html</guid><wfw:comment>http://www.cnblogs.com/bit-sand/comments/1059270.html</wfw:comment><comments>http://www.cnblogs.com/bit-sand/archive/2008/01/31/abstract_factory.html#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://www.cnblogs.com/bit-sand/comments/commentRss/1059270.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bit-sand/services/trackbacks/1059270.html</trackback:ping><description><![CDATA[摘要: 继续用怎样穿衣服的思想和大家一块谈谈抽象工厂模式。&nbsp;&nbsp;<a href='http://www.cnblogs.com/bit-sand/archive/2008/01/31/abstract_factory.html'>阅读全文</a><img src ="http://www.cnblogs.com/bit-sand/aggbug/1059270.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41929/" target="_blank">[新闻]阿里巴巴利润增1.36倍</a>]]></description></item><item><title>OO与设计模式的原则、目标</title><link>http://www.cnblogs.com/bit-sand/archive/2008/01/31/oo.html</link><dc:creator>任力</dc:creator><author>任力</author><pubDate>Thu, 31 Jan 2008 04:11:00 GMT</pubDate><guid>http://www.cnblogs.com/bit-sand/archive/2008/01/31/oo.html</guid><wfw:comment>http://www.cnblogs.com/bit-sand/comments/1059672.html</wfw:comment><comments>http://www.cnblogs.com/bit-sand/archive/2008/01/31/oo.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/bit-sand/comments/commentRss/1059672.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bit-sand/services/trackbacks/1059672.html</trackback:ping><description><![CDATA[<span style="color: #0000ff;"><span style="color: #000000;">前两天，和一<a href="http://www.cnblogs.com/chjw8016" target="_blank">朋友</a>聊到OO设计原则时，对设计模式有了更深的了解，在这里总结一下，与大家分享。</span><br />
<strong>OO(Object&#8211;Oriented )面向对象&nbsp;<br />
</strong></span>&nbsp;&nbsp;OO方法(Object-Oriented Method，面向对象方法，面向对象的方法)是一种把面向对象的思想应用于软件开发过程中，指导开发活动的系统方法，简称OO (Object-Oriented)方法，是建立在&#8220;对象&#8221;概念基础上的方法学。对象是由数据和容许的操作组成的封装体，与客观实体有直接对应关系，一个对象类定义了具有相似性质的一组对象。而每继承性是对具有层次关系的类的属性和操作进行共享的一种方式。所谓面向对象就是基于对象概念，以对象为中心，以类和继承为构造机制，来认识、理解、刻画客观世界和设计、构建相应的软件系统。<br />
<br />
<strong style="color: #0000ff;">OO的设计目标：</strong><br />
<ul>
    <li>可扩展性：有了新的需求，新的性能可以容易添加到系统中，不影响现有的性能，也不会带来新的缺陷。
    </li>
    <li>可修改性：系统一部分的代码要修改时不会破坏系统的现有结构，也不会影响到其它的部分。
    </li>
    <li>可替换性：可以将系统中的某些代码替换为相同接口的其它类，不会影响到系统。 </li>
</ul>
<p><strong style="color: #0000ff;">设计模式的设计原则：</strong></p>
<ul>
    <li>&#8220;开放--封闭&#8221;原则：<br />
    设计模式的核心原则。软件实体（类，模块，函数）对于扩展是开放的,对于修改是关闭的 。实现开闭原则的关键就是抽象化。&#8220;开放--封闭&#8221;原则中，不允许修改的是抽象的类或者接口。允许扩展的是具体的实现类,抽象类和接口在&#8220;开-闭&#8221;原则中扮演着极其重要的角色 。
    </li>
    <li><font face="Verdana">封装变化点原则：<br />
    <font face="Verdana">这是对"开-闭"原则最好的实现..不要把你的可变因素放在多个类中,或者散落在程序的各个角落..你应该将可变的因素,封套起来..并且切忌不要把所用的可变因素封套在一起..最好的解决办法是,分块封套你的可变因素!!避免超大类,超长类,超长方法的出现!!给你的程序增加艺术气息,将程序艺术化是我们的目标!!</font></font>
    </li>
    <li><font face="Verdana">里氏代换原则：<br />
    任何基类可以出现的地方，子类也可以出现 。</font>
    </li>
    <li><font face="Verdana">依赖倒转原则：<br />
    要依赖抽象,而不要依赖具体的实现。</font><font face="Verdana">抽象不应当依赖于细节，细节应当依赖于抽象；要针对接口编程，不要针对实现编程</font>
    </li>
    <li><font face="Verdana">单一职责原则：<br />
    一个类应该只有一个引起它变化的原因。</font>
    </li>
    <li><font face="Verdana">接口隔离法则 ：<br />
    为了做到尽可能小的耦合性，我们需要使用接口来规范类，用接口来约束类。要达到迪米特法则的要求，最好就是实现接口隔离法则。</font><font face="Verdana">使用多个专门的接口比使用单一的总接口要好.从一个客户类的角度来讲：一个类对另外一个类的依赖性应当是建立在最小的接口上的。一个接口应当简单地代表一个角色，而不是多个角色。多个演员可以同时演一个角色，就象孙悟空的孩儿一样。</font>
    </li>
    <li><font face="Verdana">合成/聚合原则：<br />
    要尽量使用合成/聚合原则,而不是继承关系达到软件复用的目的。<font face="Verdana">聚合用来表示&#8220;拥有&#8221;或整体与部分的关系，而合成则用来表示一种强得多的&#8220;拥有&#8221;关系。在一个合成关系里，部分和整体的生命周期是一样的。合成就象所说的&#8220;合成品&#8221;，拆开就坏。</font></font>
    </li>
    <li><font face="Verdana">迪米特法则：<br />
    系统中的类,尽量不要与其他类互相作用，减少类之间的耦合度。</font> <font face="Verdana">一个对象应当对其它对象有尽可能少的了解，两个类不必直接通信，可以通过第三者(抽象)转发这个调用，这个抽象的第三者可以是门面，可以是调停者，甚至是一个抽象类或接口，模块要独立，独立被封装，他们只靠public的API来通信，只要有可能，一个类应当设计成不变类，其属性都应该是私有的，如果一个类有太多的public访问权限的方法，可以考虑使用多个类把一个类的私有方法和公有方法分开。</font>
    </li>
</ul>
<p>聚合(Aggregation):</p>
<p>&nbsp;&nbsp; 这是一种松散的对象间的关系.举个例子:计算机和他的外围设备就是一例.</p>
<p>&nbsp; 用来表示拥有关系或者整体与部分的关系。</p>
<p>组合(Composition):</p>
<p>这是一种非常强的对象间的关系,举个例子,树和它的树叶之间的关系.</p>
<p>在一个合成里，部分与整体的生命周期都是一样的。一个合成的新对象完全拥有对其组成</p>
<p>部分的支配权。包括他们的创建和毁灭。</p>
<p>最后总结一下：</p>
<p>聚合：</p>
<ul>
    <li>&nbsp;聚合有时能够不依赖部分而存在，有时又不能</li>
    <li>部分可以独立于聚合而存在</li>
    <li>如果有一部分遗失，聚合会给人一种不完全的感觉</li>
    <li>部分的所有权可以由几个聚合来共享，比如打印机</li>
</ul>
<p>合成：</p>
<ul>
    <li>部分某一时刻只能属于某一个组成</li>
    <li>组成唯一的负责处理它的所有部分--这就意味着负责他们的创建与销毁</li>
    <li>倘若对于部分的职责由其他对象来承担的话，组成也就可以放松这些职责。</li>
    <li>如果组成销毁的话，它必须销毁所有的部分，或者把负责他们的权利转移给其他对象。</li>
</ul>
<ul></ul>
    <p><strong><span style="color: #0000ff;"><strong>设计模式所解决的问题：</strong></span></strong><br />
    <font face="Verdana">通过显示指定类创建对象:<br />
    &nbsp;&nbsp;&nbsp;&nbsp; 相关的设计模式：简单工厂、工厂方法、抽象工厂。<br />
    紧耦合:<br />
    &nbsp;&nbsp;&nbsp; 相关的设计模式：抽象工厂、命令模式、外观模式、中介者模式、观察者模式、职责链模式等。<br />
    对对象表示或实现的依赖:<br />
    &nbsp;&nbsp;&nbsp;&nbsp; 相关的设计模式：抽象工厂、桥接模式、备忘录模式、代理模式等。<br />
    通过生成子类扩展功能:<br />
    &nbsp;&nbsp;&nbsp;&nbsp; 相关的设计模式：桥接模式、职责链模式、组合模式、装饰模式、观察者模式、策略模式等。<br />
    有能方便地修改类:<br />
    &nbsp;&nbsp;&nbsp;&nbsp; 相关的设计模式：适配器模式、装饰模式、访问者模式等。<br />
    对算法的依赖:<br />
    &nbsp;&nbsp;&nbsp;&nbsp; 相关设计模式： 生成器模式、迭代模式、策略模式、模板方法模式、访问者模式等。<br />
    对软硬件环境的依赖:<br />
    &nbsp;&nbsp;&nbsp;&nbsp; 相关设计模式：抽象工厂模式、桥接模式等。</font></p>
    <p>参考：<font face="Verdana">http://ankye1234.blog.163.com/blog/static/964828920075444512292/</font></p>
<img src ="http://www.cnblogs.com/bit-sand/aggbug/1059672.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41929/" target="_blank">[新闻]阿里巴巴利润增1.36倍</a>]]></description></item><item><title>.NET设计模式(2): 工厂方法模式</title><link>http://www.cnblogs.com/bit-sand/archive/2008/01/26/factory_method.html</link><dc:creator>任力</dc:creator><author>任力</author><pubDate>Sat, 26 Jan 2008 08:57:00 GMT</pubDate><guid>http://www.cnblogs.com/bit-sand/archive/2008/01/26/factory_method.html</guid><wfw:comment>http://www.cnblogs.com/bit-sand/comments/1054004.html</wfw:comment><comments>http://www.cnblogs.com/bit-sand/archive/2008/01/26/factory_method.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.cnblogs.com/bit-sand/comments/commentRss/1054004.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bit-sand/services/trackbacks/1054004.html</trackback:ping><description><![CDATA[摘要: 我们继续来说"new"的问题，我们在简单工厂模式中，将实例化对象的工作推迟到了专门负责创建对象的工厂类中，这样，在我们事先预知的情况下，可以根据我们的需要动态创建产品类。但是，我们的预知是有限的，客户的变化可能是无限的。&nbsp;&nbsp;<a href='http://www.cnblogs.com/bit-sand/archive/2008/01/26/factory_method.html'>阅读全文</a><img src ="http://www.cnblogs.com/bit-sand/aggbug/1054004.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41928/" target="_blank">[新闻]Google Gears覆盖四大浏览器 Safari版推出</a>]]></description></item><item><title>.NET设计模式(1): 简单工厂模式</title><link>http://www.cnblogs.com/bit-sand/archive/2008/01/25/simple_Factory_Pattern.html</link><dc:creator>任力</dc:creator><author>任力</author><pubDate>Fri, 25 Jan 2008 10:27:00 GMT</pubDate><guid>http://www.cnblogs.com/bit-sand/archive/2008/01/25/simple_Factory_Pattern.html</guid><wfw:comment>http://www.cnblogs.com/bit-sand/comments/1053207.html</wfw:comment><comments>http://www.cnblogs.com/bit-sand/archive/2008/01/25/simple_Factory_Pattern.html#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://www.cnblogs.com/bit-sand/comments/commentRss/1053207.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bit-sand/services/trackbacks/1053207.html</trackback:ping><description><![CDATA[摘要: 最近一直在看设计模式，想把自己的学习笔记与大家分享一下，如果能帮助大家的话，我会非常高兴，同时也欢迎大家指出里面的不足，我们一起在探讨中提高。园子里其实关于此类文章已经很多了，如果dudu感觉放在首页欠妥的话，可以调一下。&nbsp;&nbsp;<a href='http://www.cnblogs.com/bit-sand/archive/2008/01/25/simple_Factory_Pattern.html'>阅读全文</a><img src ="http://www.cnblogs.com/bit-sand/aggbug/1053207.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41927/" target="_blank">[新闻]Internet Explorer 8 Beta 2 发布</a>]]></description></item><item><title>nslookup命令详解-----网络命令详解五</title><link>http://www.cnblogs.com/bit-sand/archive/2007/12/14/nslookup.html</link><dc:creator>任力</dc:creator><author>任力</author><pubDate>Thu, 13 Dec 2007 17:10:00 GMT</pubDate><guid>http://www.cnblogs.com/bit-sand/archive/2007/12/14/nslookup.html</guid><wfw:comment>http://www.cnblogs.com/bit-sand/comments/994305.html</wfw:comment><comments>http://www.cnblogs.com/bit-sand/archive/2007/12/14/nslookup.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/bit-sand/comments/commentRss/994305.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bit-sand/services/trackbacks/994305.html</trackback:ping><description><![CDATA[摘要: Nslookup显示可用来诊断域名系统 (DNS) 基础结构的信息。只有在已安装 TCP/IP 协议的情况下才可以使用 Nslookup 命令行工具。&nbsp;&nbsp;<a href='http://www.cnblogs.com/bit-sand/archive/2007/12/14/nslookup.html'>阅读全文</a><img src ="http://www.cnblogs.com/bit-sand/aggbug/994305.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41924/" target="_blank">[新闻]中国软件协会：SAP羞辱国产软件是不正当竞争</a>]]></description></item><item><title>override与new的区别</title><link>http://www.cnblogs.com/bit-sand/archive/2007/11/07/new.html</link><dc:creator>任力</dc:creator><author>任力</author><pubDate>Wed, 07 Nov 2007 09:10:00 GMT</pubDate><guid>http://www.cnblogs.com/bit-sand/archive/2007/11/07/new.html</guid><wfw:comment>http://www.cnblogs.com/bit-sand/comments/952376.html</wfw:comment><comments>http://www.cnblogs.com/bit-sand/archive/2007/11/07/new.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.cnblogs.com/bit-sand/comments/commentRss/952376.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bit-sand/services/trackbacks/952376.html</trackback:ping><description><![CDATA[摘要: 昨天参加面试，遇到一个关于new修饰符的题，由于本人不慎，给搞错了，纠其原因，还是因为我的C#基础知识不牢固，在此，为大家分享一下：&nbsp;&nbsp;<a href='http://www.cnblogs.com/bit-sand/archive/2007/11/07/new.html'>阅读全文</a><img src ="http://www.cnblogs.com/bit-sand/aggbug/952376.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41923/" target="_blank">[新闻]福布斯：Facebook网站十大最火爆游戏</a>]]></description></item><item><title>微软CEO鲍尔默誓死 PK Google</title><link>http://www.cnblogs.com/bit-sand/articles/1094583.html</link><dc:creator>任力</dc:creator><author>任力</author><pubDate>Wed, 10 Oct 2007 01:29:00 GMT</pubDate><guid>http://www.cnblogs.com/bit-sand/articles/1094583.html</guid><wfw:comment>http://www.cnblogs.com/bit-sand/comments/1094583.html</wfw:comment><comments>http://www.cnblogs.com/bit-sand/articles/1094583.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/bit-sand/comments/commentRss/1094583.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bit-sand/services/trackbacks/1094583.html</trackback:ping><description><![CDATA[摘要: 微软(Microsoft)首席执行官CEO鲍尔默(Steve Ballmer)周四称,他将在在线广告和网页搜索市场与Google的对抗中赢得市场份额.<br>周三在拉斯维加举行的微软MIX08在线技术说明会上,鲍尔默重申,微软收购雅虎的412亿美元的出价是公平的,并称,如果这笔交易成功的话,将加速微软其成为Google有力的竞争对手的步伐.&nbsp;&nbsp;<a href='http://www.cnblogs.com/bit-sand/articles/1094583.html'>阅读全文</a><img src ="http://www.cnblogs.com/bit-sand/aggbug/1094583.html?type=2" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41922/" target="_blank">[新闻]谷歌允许用户评论搜索结果调整顺序</a>]]></description></item></channel></rss>