<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[零度の博客]]></title>
  <subtitle type="html"><![CDATA[互联网信息大杂汇博客]]></subtitle>
  <id>http://www.freearc.net/</id> 
  <link rel="alternate" type="text/html" href="http://www.freearc.net/" /> 
  <link rel="self" type="application/atom+xml" href="http://www.freearc.net/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.4.1022">PJBlog2</generator> 
  <updated>2008-09-05T09:59:49+08:00</updated> 

  <entry>
	  <title type="html"><![CDATA[[图]加入简单参数 让谷歌浏览器Google Chrome单进程运行]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=16" label="技术教程" /> 
	  <updated>2008-09-05T09:59:49+08:00</updated>
	  <published>2008-09-05T09:59:49+08:00</published>
		  <summary type="html"><![CDATA[<p>大多数人都会在怨恨Google Chrome的多线程吃内存吧？而且即使标签独立进程，它的稳定性也不见得高到哪里去，经常遇到要崩溃就<img alt="" src="http://www.freearc.net//attachments/month_0809/l20089595453.jpg" align="right" />一起崩溃的情况，不如让他老实点~这里是一个单进程的方法：）内存省多了，速度也一如既往的快。</p>
<p>单线程方法：右键选择chrome的快捷方式,选属性。默认应该显示的是&ldquo;快捷方式&rdquo;选项卡。 你需要做的就是在&ldquo;目标&rdquo;的路径后面加上下面这个参数:</p>
<p>--single-process</p>
<p>请注意前面要有个空格,然后保存这个快捷方式（操作前你可以复制一下桌面快捷方式 把其中一个命名为单线程Chrome） 例子：</p>
<p>比如目标改成: &quot;C:\Documents and Settings\admin\Local Settings\Application Data\Google\Chrome\Application\chrome.exe&quot; --single-process </p>
<p>试试看吧,或许除去这个心病,你会觉得它可爱一点儿:)</p>
<p align="center"><img alt="" src="http://www.freearc.net//attachments/month_0809/v2008959535.jpg" /></p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=318" /> 
	  <id>http://www.freearc.net/default.asp?id=318</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[JavaScript：eval(function(p,a,c,k,e,d)系列解密程序.]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=8" label="程序源码" /> 
	  <updated>2008-09-01T15:31:20+08:00</updated>
	  <published>2008-09-01T15:31:20+08:00</published>
		  <summary type="html"><![CDATA[<div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&lt;!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Transitional//EN&#34; &#34;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" target="_blank">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>&#34;&gt;<br/>&lt;html xmlns=&#34;<a href="http://www.w3.org/1999/xhtml" target="_blank">http://www.w3.org/1999/xhtml</a>&#34;&gt;<br/>&lt;head&gt;<br/>&lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=gb2312&#34; /&gt;<br/>&lt;title&gt;JavaScript：eval(function(p,a,c,k,e,d)系列解密程序.&lt;/title&gt;<br/>&lt;script type=&#34;text/javascript&#34; language=&#34;javascript&#34;&gt;<br/>a=62; <br/>function encode() { <br/> var code = document.getElementById(&#39;code&#39;).value; <br/> code = code.replace(/[\r\n]+/g, &#39;&#39;); <br/> code = code.replace(/&#39;/g, &#34;\\&#39;&#34;); <br/> var tmp = code.match(/\b(\w+)\b/g); <br/> tmp.sort(); <br/> var dict = []; <br/> var i, t = &#39;&#39;; <br/> for(var i=0; i&lt;tmp.length; i++) { <br/>&nbsp;&nbsp; if(tmp[i] != t) dict.push(t = tmp[i]); <br/> } <br/> var len = dict.length; <br/> var ch; <br/> for(i=0; i&lt;len; i++) { <br/>&nbsp;&nbsp; ch = num(i); <br/>&nbsp;&nbsp; code = code.replace(new RegExp(&#39;\\b&#39;+dict[i]+&#39;\\b&#39;,&#39;g&#39;), ch); <br/>&nbsp;&nbsp; if(ch == dict[i]) dict[i] = &#39;&#39;; <br/> } <br/> document.getElementById(&#39;code&#39;).value = &#34;eval(function(p,a,c,k,e,d){e=function(c){return(c&lt;a?&#39;&#39;:e(parseInt(c/a)))+((c=c%a)&gt;35?String.fromCharCode(c+29):c.toString(36))};if(!&#39;&#39;.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return&#39;\\\\w+&#39;};c=1};while(c--)if(k[c])p=p.replace(new RegExp(&#39;\\\\b&#39;+e(c)+&#39;\\\\b&#39;,&#39;g&#39;),k[c]);return p}(&#34; <br/>&nbsp;&nbsp; + &#34;&#39;&#34;+code+&#34;&#39;,&#34;+a+&#34;,&#34;+len+&#34;,&#39;&#34;+ dict.join(&#39;|&#39;)+&#34;&#39;.split(&#39;|&#39;),0,{}))&#34;; <br/>} <br/><br/>function num(c) { <br/> return(c&lt;a?&#39;&#39;:num(parseInt(c/a)))+((c=c%a)&gt;35?String.fromCharCode(c+29):c.toString(36)); <br/>} <br/><br/>function run() { <br/> eval(document.getElementById(&#39;code&#39;).value); <br/>} <br/><br/>function decode() { <br/> var code = document.getElementById(&#39;code&#39;).value; <br/> code = code.replace(/^eval/, &#39;&#39;); <br/> document.getElementById(&#39;code&#39;).value = eval(code); <br/>}<br/>&lt;/script&gt;<br/><br/>&lt;/head&gt;<br/><br/>&lt;body&gt;<br/>&lt;textarea id=&#34;code&#34; cols=&#34;80&#34; rows=&#34;20&#34;&gt;&lt;/textarea&gt;<br/>&lt;input type=&#34;button&#34; onclick=&#34;encode()&#34; value=&#34;编码&#34;&gt;<br/>&lt;input type=&#34;button&#34; onclick=&#34;run()&#34; value=&#34;执行&#34;&gt;<br/>&lt;input type=&#34;button&#34; onclick=&#34;decode()&#34; value=&#34;解码&#34;&gt;<br/>&lt;/body&gt;<br/>&lt;/html&gt;<br/></div></div>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=316" /> 
	  <id>http://www.freearc.net/default.asp?id=316</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[SQL Server 2008 正式版安装指南（附序列号）]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=16" label="技术教程" /> 
	  <updated>2008-08-16T09:59:12+08:00</updated>
	  <published>2008-08-16T09:59:12+08:00</published>
		  <summary type="html"><![CDATA[和Visual Studio 2008一样，从官网下载SQL Server 2008的180天试用版其实与正式版内容是基本相同的，唯一的区别就在于安装配置文件中所包含的key。各种版本的SQL Server在进行到这一步之前都是完全一样的：<br/><br/>如果你没有序列号，那么就只能在上面的三种free edition（Enterprise Evaluation、Express、Express with Advanced Service）中选择其一。如果在下面填入序列号，那么就会安装此序列号所对应的SQL版本，这一点和Windows Server 2008是相似的。<br/><br/>提供给大家几个key，仅供学习，请不要用作他用。<br/><br/>Developer:&nbsp;&nbsp;<span style="color:Red">PTTFM-X467G-P7RH2-3Q6CG-4DMYB</span><br/>Enterprise: <span style="color:Red">JD8Y6-HQG69-P9H84-XDTPG-34MBB</span><br/><br/>在安装程序DVD中，默认会提供的序列号是由这个文件的内容来决定的：<br/>其内容如下：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>;SQLSERVER2008 Configuration File<br/>[SQLSERVER2008]<br/>PID=&#34;***XX-***XX-***XX-***XX-***XX&#34;<br/></div></div><br/>只要我们将自己拥有的序列号替换PID=后面的那一串，则在安装过程中，进行到前面提到的输入key一步时，会自动为你填入这里的序列号。微软官方的evaluate版本中没有这个文件，因此默认选择测试版。也就是说，所有的SQL Server 2008安装介质，正式版与试用版间的差别，仅仅就是这个DefaultSetup.ini的PID。如果你的安装介质没有这个文件，可以按照上面的内容自己创建。<br/><br/>所以大家也不必费心思去找去等所谓的“正式版”了，其实内容跟官网的试用版是相同的，只需要按我提供的key选中对应的版本即可。官网测试版下载申请地址：<br/><a href="http://www.microsoft.com/sqlserver/2008/en/us/trial-software.aspx" target="_blank">http://www.microsoft.com/sqlserver/2008/en/us/trial-software.aspx</a>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=315" /> 
	  <id>http://www.freearc.net/default.asp?id=315</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[DoubleClickFix 鼠标双击修正工具 v1.0.1020.0]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=12" label="精品软件" /> 
	  <updated>2008-08-14T07:28:37+08:00</updated>
	  <published>2008-08-14T07:28:37+08:00</published>
		  <summary type="html"><![CDATA[很多鼠标用久了都会出现按键不灵或者“过于灵敏”的问题，比如会把正常的单击事件检测为双击，或是无法正常向主机报告滚轮的滚动方向。<strong>这个工具可以鉴别并屏蔽由鼠标电路自行产生的双击事件以及滚轮的反向滚动事件，这些误产生的指令一般都发生在很短的时间内，和人为的操作有很大的区别。</strong>东西很简单，但是比较实用，解决了我的老鼠标双击问题。附上一个无界面版本，通过命令行启动，可以设为开机运行。<br/><br/><strong>更新内容：</strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;1. 加入日志功能。<br/>&nbsp;&nbsp;&nbsp;&nbsp;2. 修正两个细节问题。<br/>&nbsp;&nbsp;&nbsp;&nbsp;3. 内存及运行效率优化。<br/><br/><strong>说明：</strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;软件可以设置参数：按下和放开鼠标按键的时间间隔、两次双击鼠标按键的时间间隔以及鼠标滚轮反响滚动事件间隔。此外，也可以单独屏蔽鼠标左键或右键，亦或是选择两者都屏蔽。运行程序以后，在设定间隔之内发生的两次鼠标动作将会被屏蔽掉。<br/><br/><strong>打包内容如下：</strong><br/>DoubleClickFix.exe<br/>&nbsp;&nbsp;&nbsp;&nbsp;主程序。使用前“Hook”一次即可。比较简单，一用就会。<br/>DoubleClickAutoFix.exe<br/>&nbsp;&nbsp;&nbsp;&nbsp;命令行版本。直接启动即可，加入/REG和/UNREG可以分别加入和解除系统自启动。<br/>MouseHook.dll<br/>&nbsp;&nbsp;&nbsp;&nbsp;鼠标钩子库。<br/><br/><strong>DoubleClickFix.cfg一些隐含参数：</strong><br/>语言，对应Language.cfg的不同字段 Language=zh-CN<br/>禁止本进程挂接 DisableSelfHook=1<br/>使用白色背景 UseWhiteBackground=1<br/>系统托盘自动提示时间间隔（毫秒） AutoTipsIntervalTime=3000<br/>界面刷新时间间隔（毫秒）RefreshIntervalTime=500<br/>自动清除屏蔽记录 AutoClearCountLog=1<br/>始终显示（反）挂接结果 ShowHookResultForce=0<br/>日志大小限制（单位为KB） LogFileMaxSize=1024<br/><img src="http://www.freearc.net/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.aoouch.cn/AoouchWare/DCF_v1020_0.rar" target="_blank">下载：DCF_v1020_0.rar</a>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=314" /> 
	  <id>http://www.freearc.net/default.asp?id=314</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[《赤壁》完整版 - 在线观看]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=14" label="生活娱乐" /> 
	  <updated>2008-08-07T15:21:15+08:00</updated>
	  <published>2008-08-07T15:21:15+08:00</published>
		  <summary type="html"><![CDATA[<div align="center"><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/flash.gif" alt="" style="margin:0px 2px -3px 0px" border="0"/>Flash动画</div><div class="UBBContent"><div id="temp46851"></div></div></div><script type="text/javascript" language="javascript">MediaShow('swf','temp46851','http://www.56.com/n_v41_/c38_/1_/26_/xunlei250_/zhajm_121594087861x_/7912000_/0_/36561973.swf','480','400');</script></div><br/><strong>片名：</strong>赤壁 <br/><strong>英文片名：</strong>Red Cliff <br/><strong>导演：</strong>吴宇森 <br/><strong>主演：</strong><br/>梁朝伟 饰 周瑜<br/>金城武 饰 诸葛亮 <br/>胡军&nbsp;&nbsp; 饰 赵子龙<br/>林志玲 饰 小乔 <br/>张丰毅 饰 曹操<br/>赵薇饰 孙 尚香 <br/>张震&nbsp;&nbsp; 饰 孙权<br/>尤勇&nbsp;&nbsp; 饰 刘备 <br/>佟大为 饰 孙书财<br/>小宋佳 饰 骊姬 <br/>侯勇&nbsp;&nbsp; 饰 鲁肃<br/>臧金生 饰 张飞 <br/><strong>公映日期：</strong>2008年7月10日<br/><strong>剧情介绍：</strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;东汉末年，权臣曹操挟天子以令诸侯，气焰不可一世。为将当时艳名四播的大小二乔收于铜雀台中，他兴兵八十万南下欲全取孙刘。刘备军师诸葛亮因结盟事宜前往东吴，舌战群儒，他得到了护妻心切的水军大都督周瑜说动吴主孙权答应与曹操一战。周瑜对诸葛亮深为忌惮，设计陷害，诸葛亮神机妙算... ]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=313" /> 
	  <id>http://www.freearc.net/default.asp?id=313</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[《木乃伊3》之龙帝之墓（高清DVD） ]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=14" label="生活娱乐" /> 
	  <updated>2008-08-07T11:28:42+08:00</updated>
	  <published>2008-08-07T11:28:42+08:00</published>
		  <summary type="html"><![CDATA[<div align="center"><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/flash.gif" alt="" style="margin:0px 2px -3px 0px" border="0"/>Flash动画</div><div class="UBBContent"><div id="temp10250"></div></div></div><script type="text/javascript" language="javascript">MediaShow('swf','temp10250','http://6.cn/player.swf?flag=0&amp;vid=NveeC05_1Tk8Rvn2OPP01w','480','400');</script></div><br/><strong>片名：</strong>木乃伊3 - 龙帝之墓<br/><strong>英文名：</strong>The Mummy: Tomb Of The Dragon Emporer<br/><strong>导演：</strong>罗伯·科恩 Rob Cohen<br/><br/><strong>编剧：</strong>约翰-富斯科<br/><strong>主演：</strong>布兰登·弗莱瑟 Brendan Fraser<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;杨紫琼 Michelle Yeoh<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;李连杰 Jet Li<br/><strong>类型：</strong>动作/惊悚/冒险/奇幻/恐怖<br/><strong>国家/地区：</strong>德国/加拿大/美国<br/><strong>上映日期：</strong>2008年7月11日 美国<br/><br/><strong>剧情介绍：</strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;故事在中国拉开序幕，李连杰扮演一名公元前的中国帝王（或将军），由于太过残暴受到女巫（杨紫琼饰）的诅咒，他和他的军队变成了兵马俑被封在地下，等待着被人重新唤醒。到了1946年，里克·奥康纳（布兰登·费雷泽饰）和伊芙琳（玛丽亚·贝罗饰）两人接受了“最后的任务”——负责把一件从中国上海博物馆偷走的珍贵文物还给原主人。此时他们的儿子亚历克斯·奥康纳（卢克·福德饰）已经长大，在父母不知情的情况下，他子承父业也成为一名考古学家，并且正在中国进行考古挖掘……]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=312" /> 
	  <id>http://www.freearc.net/default.asp?id=312</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[百明星齐唱《北京欢迎你》唱响神州雅俗共赏]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=14" label="生活娱乐" /> 
	  <updated>2008-08-07T10:18:06+08:00</updated>
	  <published>2008-08-07T10:18:06+08:00</published>
		  <summary type="html"><![CDATA[<div align="center"><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/flash.gif" alt="" style="margin:0px 2px -3px 0px" border="0"/>Flash动画</div><div class="UBBContent"><div id="temp88223"></div></div></div><script type="text/javascript" language="javascript">MediaShow('swf','temp88223','http://player.youku.com/player.php/sid/XMzM1ODE5MTI=/v.swf','480','400');</script></div><br/>由百名明星合唱的奥运倒计时一百天主题歌《北京欢迎你》在短短三个月里红遍神州大地，目前这首歌已经成为全国各地KTV点唱率最高的歌曲。更有趣的是，很多网友纷纷制作各种版本的《北京欢迎你》也蔚然成为一景。<br/><br/><strong>阵容：百位明星齐献唱</strong><br/><br/>《北京欢迎你》由香港著名词作家林夕作词，中国内地音乐人小柯作曲，成龙、王力宏、周华健、蔡依林、孙燕姿、谢霆锋、范玮琪、林志玲、容祖儿、郑希怡、吴克群、林俊杰、许茹芸、任贤齐、阿杜、何润东、游鸿明、刘欢、那英、孙楠、韩红、谭晶、汪峰、孙悦、韦唯、韩磊、李宇春、周笔畅、张靓颖、羽泉、韩庚、刀郎、黄晓明、陈坤等百位明星共同演绎。由于参与歌曲录音的歌手人数众多，虽然《北京欢迎你》长达7分4秒，但每位歌手只能分配到唱一句，或两人、三人合唱一句；最后四句则是全体大合唱。歌手们以一人一句的演唱方式，用歌声向全世界发出邀请，用音乐为北京奥运加油。<br/><br/>打头阵唱首句歌词“迎接另一个晨曦，带来全新空气”的陈天佳是位只有9岁的北京娃娃。在2004年雅典奥运会闭幕式上，当时只有5岁的陈天佳向全球以英语发出“Welcome to Beijing”的邀请，由她在奥运倒数100天主题曲《北京欢迎你》唱第一句绝对适合。<br/><br/>“台湾第一名模”林志玲虽只唱了半句歌，却也同样快乐，而她那标志性的娃娃音倒也别有一分可爱。“岁月绽放青春笑容，迎接这个日期”是她跟张梓琳合唱，张梓琳是去年“世界小姐”冠军，也是首位夺冠的中国佳丽，她们可称得上最靓的组合。林志玲说：“我参与，我奉献，我真的快乐！”相当陶醉。<br/><br/><strong>特色：民谣风格京腔京韵</strong><br/><br/>“迎接另一个晨曦，带来全新空气，气息改变情味不变，茶香飘满情谊……我家大门常打开，开放怀抱等你，不管远近都是客人，请不用客气。相约好了在一起，我们欢迎你……”《北京欢迎你》融入了北京民谣的风格，运用了京腔、京韵的单弦演奏，跟其他奥运歌曲相比，独具一种清新的中国特色和韵味，表达了北京人喜迎八方宾客的愉悦心情。将“我家种着万年青，开放每段奇迹，为传统的土壤播种，为你留下回忆”的心声娓娓道来，表现了北京人迎接北京奥运会到来的自信姿态。<br/><br/>据北京奥组委文化活动部部长赵东鸣介绍，《北京欢迎你》这首歌从3月初提出创意到制作完成只历经一个半月的时间，录音素材文件却达11G之多，词曲小样更是在5天之内就制作完成。两个星期之内完成100位明星的录音、平面摄影与北京奥运祝福访谈，6天完成所有的后期制作，仅纪录片拍摄的素材就达7000多分钟，有200多名工作人员为其诞生付出了辛勤的汗水。在创作过程中，每一个参与者几乎都有感人的故事。《北京欢迎你》这首歌曲的创作产生表现了华人音乐人热情欢迎世界各地的友人到北京参与奥林匹克运动会的积极姿态和真挚感情。他们用自己的方式在奥运会之外的赛场上奔跑着，以独特的方式诠释奥林匹克精神。<br/><br/><strong>视觉：故宫与“鸟巢”齐出镜</strong><br/><br/>《北京欢迎你》不仅在音乐中采用民谣的形式，而且在MV里融入了北京很多地标景观，使其具有了浓厚的北京特色。选景不但体现新北京的面貌，还展示北京乃至中国的悠久历史。从“鸟巢”、“水立方”等奥运场馆到故宫、天坛、长城等名胜古迹，从国家大剧院、首都机场T3航站楼到具有北京特色的四合院。一批刚刚修缮的文物场所也首次在这部音乐电视中亮相，以这种特殊的礼遇表达对国际友人的欢迎。北京市文物局局长孔繁峙希望能有更多的人通过音乐电视《北京欢迎你》了解北京的历史与文化，感受中国传统文化的魅力。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=311" /> 
	  <id>http://www.freearc.net/default.asp?id=311</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[WinSAT - Vista中的又一彩蛋]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=6" label="网络资讯" /> 
	  <updated>2008-08-04T10:07:26+08:00</updated>
	  <published>2008-08-04T10:07:26+08:00</published>
		  <summary type="html"><![CDATA[WinSAT是什么？ 想必大家都用过Windows Vista中的“Windows体验索引”（现在我都觉得这个名字怪怪的），就是Vista系统中用于硬件评分的那个东东。WinSAT是Windows System Assessment Tool的简称，并作为一个基本工具存在于Vista系统当中。此东东主要用于评估Vista系统性能。<br/><br/><strong>怎样来用WinSAT？</strong><br/>其实WinSAT不仅只是个命令行程序，她是Windows Vista为我们开放的一个标准接口。我们可以通过调用她（Win32_WinSAT类）来实现自己的应用。<br/><br/>例如，我就写了一个类似于Windows体验索引的脚本：<br/><img src="http://www.freearc.net/attachments/month_0808/w20088410354.jpg" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/><br/><img src="http://www.freearc.net/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.winclient.cn/download/WinSAT_Scri&#112;t.rar" target="_blank">点我下载脚本</a><br/><br/><strong>WinSAT彩蛋</strong><br/>WinSAT可谓Vista中的一个彩蛋，我们通过管理员权限打开cmd命令提示符来执行如入命令便可以看到惊人的特效：<br/><br/><span style="color:Red">winsat aurora</span><br/><img src="http://www.freearc.net/attachments/month_0808/y20088410513.png" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/><br/><span style="color:Red">winsat d3d -texshader -totalobj 15</span><br/><img src="http://www.freearc.net/attachments/month_0808/w20088410540.png" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/><br/><span style="color:Red">winsat d3d -objs C(20) -texshader -totalobj 50</span><br/><img src="http://www.freearc.net/attachments/month_0808/x20088410613.png" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/><br/><span style="color:Red">winsat d3d -totalobj 20 -objs C(20) -totaltex 10 -texpobj C(1) -alushader -noalpha -v -time 10</span><br/><img src="http://www.freearc.net/attachments/month_0808/k20088410643.png" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/><br/><span style="color:Red">winsat d3d -totalobj 20 -objs C(20) -totaltex 10 -texpobj C(10) -alushader -v -time 10</span><br/><img src="http://www.freearc.net/attachments/month_0808/v20088410716.png" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/><br/><a href="http://www.winclient.cn/article/96.htm" target="_blank">http://www.winclient.cn/article/96.htm</a>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=310" /> 
	  <id>http://www.freearc.net/default.asp?id=310</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Pjblog的留言本跨站漏洞解决方法]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=16" label="技术教程" /> 
	  <updated>2008-07-28T16:40:52+08:00</updated>
	  <published>2008-07-28T16:40:52+08:00</published>
		  <summary type="html"><![CDATA[如果不用屏蔽关键字的办法。则使用下面的办法修补漏洞，<br/>打开 guestbook.asp 搜索<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&lt;%=UBBCode(HtmlEncode(GuestDB(&#34;book_Content&#34;)),0,GBSet.getKeyValue(&#34;ubbCode&#34;),GBSet.getKeyValue(&#34;ImgCode&#34;),GBSet.getKeyValue(&#34;autoURL&#34;),1)%&gt;<br/></div></div><br/>改为<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&lt;%=CheckStr(UBBCode(HtmlEncode(GuestDB(&#34;book_Content&#34;)),0,GBSet.getKeyValue(&#34;ubbCode&#34;),GBSet.getKeyValue(&#34;ImgCode&#34;),GBSet.getKeyValue(&#34;autoURL&#34;),1))%&gt;<br/></div></div><br/>打开 cls_article.asp 搜索<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&lt;%=UBBCode(HtmlEncode(blog_CommContent),commArr(4,Pcount),blog_commUBB,blog_commIMG,commArr(7,Pcount),commArr(9,Pcount))%&gt;<br/></div></div><br/>改为<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&lt;%=CheckStr(UBBCode(HtmlEncode(blog_CommContent),commArr(4,Pcount),blog_commUBB,blog_commIMG,commArr(7,Pcount),commArr(9,Pcount)))%&gt;<br/></div></div>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=309" /> 
	  <id>http://www.freearc.net/default.asp?id=309</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[分享:让你的Google广告自动改变颜色]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=16" label="技术教程" /> 
	  <updated>2008-07-25T13:39:40+08:00</updated>
	  <published>2008-07-25T13:39:40+08:00</published>
		  <summary type="html"><![CDATA[首先说说让google广告自动切换颜色有什么好处:想象一下如果你的网站或者blog有固定的访问群(请先保证你是一个google ader),他们会有规律的过来访问，ok，这帮人肯定会对你的google广告习以为常了，访问你的页面时，他们会毫不犹豫的忽略你的广告，尽管广告可能带给他们信息！这是因为你的广告位置和广告形象总是一成不变的，广告部分成了他们的“视觉盲区”！<br/><br/><strong>消除“视觉盲区”</strong><br/><br/>怎样消除这个“视觉盲区”呢？我们或许可以通过以下方式:<ul style="list-style-type:decimal"><li>选择Google系统中的图片广告。但是google图片广告在中文里的相关程度太低了，前段时间我的blog里总是出现一个叫什么“强强”的滴眼露广告，天啦，我的blog中从来就没有出现眼镜或者近视眼这两个词，真不明白google ad系统是怎么搞的。所以，图片广告并不是一个好的办法。当然，这可能并不对，如果你的页面内容专业性很高，我相信相关程度还是会很高的。</li><li>改变广告的位置。国外的一些google ader说不时的改变位置可以增加广告点击率。这个办法当然很好，因为改变位置肯定会给人不同的感受。但是就我而言，这个办法对我来说是不适用的!我的blog空间是BSP的，我无法通过改变位置来达到目的，充其量不过在公告栏里改变一下google广告代码的位置。不过这只是对我不适用而已，如果你有自己的网站或者你的blog是独立的，你尽可随意的改变代码位置。不过，这还是有点麻烦，不是吗？ </li><li>改变google广告颜色。好，这就是我要详细说的办法了！想象一下，当你的访问者刷新一下你的页面，你的google广告颜色突然就改变了，是不是有点意思？不信，你刷新一下零度空间，看看我的banner广告颜色是不是改变了？我相信肯定会有朋友对这个东西感兴趣的，说不定你就有点击广告的冲动:=). <br/></li></ul><strong>Google广告自动改变颜色操作指南</strong><br/>前段时间国外有一个wordpress插件，声称能自动改变wordpress里google广告的颜色。可惜，我们的blog不一定是wordpress搭建的，比如donews的就不是，我们没法用。但是，我们不需要这么麻烦，google早就为我们想到办法了，只是，看我们是不是有心人！<br/>看看我的操作就知道了:<ul style="list-style-type:decimal"><li>在google adsense设置里进入广告单元，请注意，链接单元不适用。</li><li>点击调色板的下拉菜单，你会看到“多个调色板”选项，选择“使用多个调色版”<br/><img src="http://www.freearc.net/attachments/month_0807/32008725133814.jpg" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/><br/></li><li>进入后你就可以选择多个调色板了，按ctrl选择适合你页面的:<br/><img src="http://www.freearc.net/attachments/month_0807/g2008725133853.jpg" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/><br/>到没有，我们可以选择多种颜色！选择好后，我们就可以点击“继续”选项得到我们的代码了！<br/></li><li>好，剩下的就是把你的google代码copy到你的网页之中了，然后就等着google自动给你的广告切换颜色吧！<br/></li></ul><strong>题外话</strong><br/>对于google ader来说，要想提高网页广告点击率，真的得动点脑经把我们的广告做得吸引人一点，除了仔细阅读google官方文档外，我们还要向同道中人取经，国外有不少站点的google广告做得非常的有创意，让你一看就有想点击的冲动！作为一个google ader的你，有时间就多看看吧！]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=308" /> 
	  <id>http://www.freearc.net/default.asp?id=308</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[视频：《赤壁》8分钟超长片花欣赏]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=14" label="生活娱乐" /> 
	  <updated>2008-07-25T09:18:14+08:00</updated>
	  <published>2008-07-25T09:18:14+08:00</published>
		  <summary type="html"><![CDATA[由吴宇森执导的《赤壁》取材自长篇历史小说《三国演义》，再现张翼德大闹长坂桥、舌战群儒、草船借箭、曹操败走华容等原著场景。<br/><br/><strong>导演：</strong>吴宇森<br/><strong>演员：</strong>梁朝伟 金城武 张震 林志玲 小宋佳<br/>赵薇 佟大为 巴森 侯勇 胡军 张丰毅<br/>臧金生 尤勇 张山<br/><strong>类型：</strong>历史　　 <strong>地区：</strong>中国<br/><strong>语言：</strong>普通话<br/><strong>上映时间：</strong>2008-07-10（上）<br/><strong>剧情： </strong>《赤壁》上集主要讲述周瑜和诸葛亮力劝蜀吴联军抗曹的故事，吴宇森在他最擅长的兄弟情上特别着墨。电影以赵云的长坂坡之战开场，曹操在击溃刘备后将目标锁定为东吴。孙权派鲁肃以吊唁刘表之名与刘备会面，共商抗曹大计，刘备派诸葛亮前往东吴。同时，孙权的妹妹孙尚香与鲁肃用激将法逼孙权抗曹，由周瑜主持大局。两军赤壁相遇，曹操大败...<br/><div align="center"><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/flash.gif" alt="" style="margin:0px 2px -3px 0px" border="0"/>Flash动画</div><div class="UBBContent"><div id="temp79688"></div></div></div><script type="text/javascript" language="javascript">MediaShow('swf','temp79688','http://player.youku.com/player.php/sid/XMzQwMTU0NzI=/v.swf','504','415');</script></div>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=307" /> 
	  <id>http://www.freearc.net/default.asp?id=307</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[《孢子》游戏封面图正式确认]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=6" label="网络资讯" /> 
	  <updated>2008-07-23T17:29:31+08:00</updated>
	  <published>2008-07-23T17:29:31+08:00</published>
		  <summary type="html"><![CDATA[国外媒体报道EA模拟类大作《孢子》（SPORE）封面图正式确认，预计本作即将9月7日发售，发行平台：PC、MAC、DS。这里提供<img src="http://www.freearc.net/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.lingaoyi.com/games/spore-creature-creator/" target="_blank">试玩版下载</a>。<br/>《孢子》将包含六个不同阶段的主题：Tidepool阶段、进化发展、部族形成阶段、城市阶段、社会文明阶段、侵略扩张阶段。Tidepool阶段：游戏起初的活动是一种自由模式很类似于《派克人》、NES经典游戏《46亿年物语（E.V.O.）》以及DC上的《动物番长（Cubivore）》，在自然法则之下，依靠杀掉敌人并吃掉敌人来成长自己。<br/><div align="center"><img src="http://www.freearc.net/attachments/month_0807/d200872317251.jpg" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/></div><br/>配置要求：<br/><strong>WINDOWS XP系统要求: </strong>2.0 GHz P4 处理器或更高, 512 MB内存, 128 MB显卡, 带有支持Pixel Shader 2.0, 至少6 GB硬盘空间<br/><strong>WINDOWS VISTA系统要求: </strong>2.0 GHz P4 处理器或更高, 768 MB内存, 128 MB显卡, 带有支持Pixel Shader 2.0, 至少6 GB硬盘空间<br/><br/>支持显卡列表：<br/><br/><strong>ATI Radeon: </strong><br/>● 9500, 9600, 9800 and variants <br/>● X300, X600, X700, X800, X850 <br/>● X1300, X1600, X1800, X1900, X1950 and discrete variants <br/>● 2400, 2600, 2900 and variants <br/>● 3650, 3850 and variants <br/><strong>NVIDIA GeForce: </strong><br/>● FX 5900, FX 5950 (FX 只支持 Windows XP系统) <br/>● 6200, 6500, 6600, 6800 and variants <br/>● 7200, 7300, 7600, 7800, 7900, 7950 and variants <br/>● 8400, 8500, 8600, 8800 and variants <br/><strong>Intel Extreme Graphics: </strong><br/>● GMA 950, GMA X3000, GMA X3100]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=306" /> 
	  <id>http://www.freearc.net/default.asp?id=306</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[5个有趣的浏览器地址栏JavaScript代码]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=8" label="程序源码" /> 
	  <updated>2008-07-18T23:10:35+08:00</updated>
	  <published>2008-07-18T23:10:35+08:00</published>
		  <summary type="html"><![CDATA[这篇分享几个在地址栏实现的Javascript有趣效果和应用。能在浏览器地址栏实现的效果太多了，字体放大、显示所有图片、显示Cookie等等。但这篇文章重点放在“有趣”上面，当你无聊的时候，不妨玩玩。<br/><div align="center"><img src="http://www.freearc.net/attachments/month_0807/p200871823735.gif" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/></div><br/><br/><strong>1、编辑网页</strong><br/><br/>在地址栏输入下面的代码按enter，网页上所有元素都能变成可编辑状态，你可以移动、调整元素大小。如果你只是讨厌某个网站想发泄一下，我建议你使用NetDisater。<br/><br/>代码如下：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>javascript:document.body.contentEditable=&#39;true&#39;; document.designMode=&#39;on&#39;; void 0<br/></div></div><br/>这是经我重新编辑的google.cn：<br/><div align="center"><img src="http://www.freearc.net/attachments/month_0807/5200871823814.JPG" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/></div><br/><strong>2、无敌风火轮</strong><br/><br/>在地址栏运行下面的代码可使页面上所有图片元素一个接一个地转圈。<br/>这种效果最好的实现地方就是图片搜索了：<br/><div align="center"><img src="http://www.freearc.net/attachments/month_0807/n200871823849.JPG" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/></div><br/>改变代码里的“img”成任何网页上有的字符，可以使这些字符做无敌风火轮运动。<br/><br/>代码如下：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>javascript:R=0; x1=.1; y1=.05; x2=.25; y2=.24; x3=1.6; y3=.24; x4=300; y4=200; x5=300; y5=200; DI=document.getElementsByTagName(&#34;img&#34;); DIL=DI.length; function A(){for(i=0; i-DIL; i++){DIS=DI[ i ].style; DIS.position=&#39;absolute&#39;; DIS.left=(Math.sin(R*x1+i*x2+x3)*x4+x5)+&#34;px&#34;; DIS.top=(Math.cos(R*y1+i*y2+y3)*y4+y5)+&#34;px&#34;}R++}setInterval(&#39;A()&#39;,5); void(0);<br/></div></div><br/><strong>3、晃来晃去</strong><br/><br/>不但是你，浏览器也不是那么喜欢这个javascript。在地址栏运行这个代码后，浏览器会迅速地晃来晃去。代码如下：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>javascript:function flood(n) {if (self.moveBy) {for (i = 200; i &amp;gt; 0;i--){for (j = n; j &amp;gt; 0; j--) {self.moveBy(1,i); self.moveBy(i,0);self.moveBy(0,-i); self.moveBy(-i,0); } } }}flood(6);{ var inp = &#34;D-X !msagro na dah tsuj resworb rouY&#34;; var outp = &#34;&#34;; for (i = 0; i &amp;lt;= inp.length; i++) {outp =inp.charAt (i) + outp ; } alert(outp) ;}; reverse<br/></div></div><br/>如果这个代码无效，请将&#34;&amp;gt;&#34;改成&#34;&gt;&#34;，&#34;&amp;It;&#39;改成&#34;&lt;&#34;。<br/><strong>4、计算器</strong><br/><br/>在地址栏输入下面的代码，可以实现简单的四则运算：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/> javascript: alert(34343+3434-222);<br/></div></div><br/>事实上这个代码可以继续简化，比如简化成这样：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>javascript: 34343+3434-222<br/></div></div><br/><strong>5、防钓鱼验证</strong><br/><br/>某些钓鱼网站提供的URL和网页本身的URL是不一致的，你可以用下面的代码进行验证，当两个URL相差太大的时候，你就要稍加小心了：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>javascript:alert(&#34;The actual URL is:tt&#34; + location.protocol + &#34;//&#34; + location.hostname + &#34;/&#34; + &#34;nThe address URL is:tt&#34; + location.href + &#34;n&#34; + &#34;nIf the server names do not match, this may be a spoof.&#34;);<br/></div></div><br/>很有趣，不是吗？]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=305" /> 
	  <id>http://www.freearc.net/default.asp?id=305</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Windows Server 2003 如何搭建和使用VPN ]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=16" label="技术教程" /> 
	  <updated>2008-07-15T16:36:16+08:00</updated>
	  <published>2008-07-15T16:36:16+08:00</published>
		  <summary type="html"><![CDATA[　　组建VPN有多种方法，而我们的讨论则是基于Windows Server 2003提供的“路由和远程访问”服务。利用该服务，我们可以在企业内部搭建VPN服务器，然后通过企业外部客户端的VPN拨号连接对企业内部网进行访问。 <br/><br/>　　我们的试验基于以Windows Server 2003为操作平台、ADSL接入Internet的服务器端环境和以Windows XP为操作平台、ADSL接入Internet的客户端环境。连接方式为客户端通过Internet与服务器端建立VPN连接。<br/> <br/>　　<strong>配置VPN服务器</strong><br/><br/>　　Windows Server 2003的默认配置已经安装 “路由和远程访问”服务，但需要对该服务进行必要的配置才能使其内置的VPN服务生效。配置过程简述如下： <br/><br/>　　步骤一 依次单击[开始]→[管理工具]→[路由和远程访问]，打开“路由和远程访问”服务窗口。 <br/><br/>　　步骤二 右击左侧控制台树里的本地计算机名称，执行[配置并启用路由和远程访问]命令，进入安装向导。单击[下一步]，在“配置”对话框中点选[自定义配置]选项并单击[下一步]。然后在“自定义配置”对话框中勾选[VPN访问]选项并单击[下一步]→[完成]→[是]。等待几秒钟之后，VPN服务器即可启动。 <br/><br/>　　步骤三 启动之后的VPN服务器还要经过必需的设置才能符合我们的实验环境。右击控制台树里的服务器名（本例为CHHUIAN），执行[属性]命令。在“CHHUIAN（本地）属性”对话框中切换至IP标签下。在[IP地址指派]选项中点选[静态地址池]，然后单击[添加]按钮，分别键入起始IP地址和结束IP地址并单击[确定]→[确定]<br/><br/><strong>小提示：</strong>使用静态IP地址池为客户端分配IP地址可以减少IP地址解析时间，提高连接速度。起始IP地址和结束IP地址可以从所在地区的IP地址范围中截取一段（例如笔者截取的一段是61．55．230．10至61．55．230．20），具体范围可以咨询当地的ISP。另外也可以自定义一段IP地址（例如192．168．0．10至192．168．0．100）。当然，如果这台主机已经配置了DHCP服务，也可以选择“动态主机配置协议（DHCP）”选项，不过这会延长连接时间。 <br/><br/>　　步骤四 申请动态域名解析服务。如果服务器端有固定的IP地址，则客户端随时可以与服务器建立VPN连接。而我们的服务器端采用的是ADSL虚拟拨号接入Internet，因此需要在VPN服务器上使用动态域名解析服务才能支持客户端用同一个域名随时拨入。当然，如果在每次建立VPN连接前先打电话询问服务器端的IP地址也可以。关于申请动态域名解析的方法本报前面有详细介绍，这里不再赘述。 <br/><br/>　　<strong>小提示：</strong>能提供动态域名解析服务的网站及相关软件有很多种，如花生壳、DynamicHost等。大家可参阅相关介绍申请使用该项服务。 <br/><br/>　　经过这样简单的几步设置，这台主机已经可以提供VPN服务了。 <br/><br/>　　　　赋予用户远程连接的权限 <br/><br/>　　出于安全考虑，VPN服务器配置完成以后所有用户均被拒绝拨入到服务上，需要为相关用户赋予拨入的权限。其过程简述如下： <br/><br/>　　步骤一 右击[我的电脑]，执行[管理]命令。在“计算机管理”对话框左侧的控制台树中展开[本地用户和组]选项，并单击[用户]文件夹。右击对话框右侧用户列表中的某一用户名称（如Administrator），执行[属性]命令。 <br/><br/>　　步骤二 在打开的“Administrator属性”对话框中切换至[拨入]标签下，点选[远程访问权限]选项中的[允许访问]并单击[确定]按钮即可}<br/>小提示：为便于大家理解，笔者这里选择了 允许访问 选项。其实这是安全性最差的拨入方式，建议选择 通过远程访问策略控制访问 选项，不过这需要在服务端定制远程访问策略。 <br/><br/>　　<strong>在客户端创建VPN连接</strong> <br/><br/>　　客户端的配置比较简单，跟建立普通拨号连接一样，只需建立一个VPN的专用连接即可。假设客户端已经建立了一个虚拟拨号接入Internet的“ADSL连接”，我们以Windows XP为操作平台简述创建VPN连接的过程： <br/><br/>　　步骤一 依次单击[开始]→[控制面板]，双击[网络连接]选项。 <br/><br/>　　步骤二 在打开的“网络连接”对话框左侧的快捷面板中找到并单击[创建一个新的连接]图标，单击[下一步]。友情提示：如果是第一次建立连接，系统会要求你输入所在地区的电话区号。如果在建立VPN连接前已经建立了其他连接（如ADSL接入Internet的连接）则不会出现该提示。 <br/><br/>　　步骤三 在“网络连接类型”对话框中点选[连接到我的工作场所的网络]选项并单击[下一步]。接着在“网络连接”对话框中点选创建[虚拟专用网络连接]选项并单击[下一步]，键入一个连接名称（如“公司的VPN连接”），单击[下一步}<br/>步骤四 在“公用网络”对话框中点选[自动拨此初始连接]并在其下的下拉菜单中选中一个拨号连接。单击[下一步]。 <br/><br/>　　步骤五 在“VPN服务器选择”对话框中键入VPN服务器端的IP地址或域名。这就用到了我们在配置VPN服务器时所提到的固定IP地址或动态域名。假设我们使用了动态域名解析系统，则应该在这里键入我们申请得到的域名（如chhuian.vicp.net），然后勾选[在桌面上创建此连接的快捷方式]并单击[完成]结束创建过程。这时可能会提示你是否连接到初始连接上，勾选[不再显示此提示]并单击[否]即可]<br/><br/>　<strong>拨入和访问VPN服务器</strong> <br/><br/>　　至此，我们已经具备了在VPN服务器和客户端建立VPN连接的条件了。但是如何从客户端拨入VPN服务器呢？其实很简单，直接双击桌面上的[公司的VPN连接]图标，系统会要求先通过初始连接（键入该连接的用户名和密码）接入Internet。然后再通过VPN连接（键入被赋予拨入权限的用户名和密码）与VPN服务器建立连接。我们可以通过双击桌面右下角的VPN连接图标查看其状态。 <br/><br/>　　那么如何访问VPN服务器上的共享资源呢，有两种方法：一是通过[网上邻居]直接访问共享资源，二是在IE浏览器的地址栏中键入“\\服务器名”或“\\服务器地址”（例如“CHHUIAN”或“\\chhuian.vicp.net”），通过浏览器窗口访问共享资源。另外，如果VPN服务器端同时又作为局域网内的一台主机，我们还可以让VPN客户端进一步访问局域网内的其他主机。这需要VPN服务端开启了路由器功能并启用了IP路由，不过在VPN服务器配置完成后这些功能都是默认启用的。 <br/><br/>　　小提示：成功建立连接后，客户端在访问服务器端的共享资源的时候可能会出现长时间的搜索过程。如果迟迟找不到服务器，可以使用“搜索计算机”进行搜索。 <br/><br/>　　<strong>一点说明</strong> <br/><br/>　　在客户端和服务端均为ADSL接入Internet的环境下，我们可以轻松建立VPN连接。如果网络环境比较复杂，例如小区宽带接入Internet的客户端访问ADSL接入Internet的服务端、采用Cable Modem接入Internet的客户端访问ADSL接入Internet的服务端、ADSL接入Internet的客户端访问小区宽带接入Internet的服务端等等，则还需要作进一步的配置才能实现连接。 ]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=304" /> 
	  <id>http://www.freearc.net/default.asp?id=304</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[手工去除QQ2008广告和搜索栏]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=16" label="技术教程" /> 
	  <updated>2008-07-14T13:20:30+08:00</updated>
	  <published>2008-07-14T13:20:30+08:00</published>
		  <summary type="html"><![CDATA[<div align="center"><img src="http://www.freearc.net/attachments/month_0807/j200871413203.jpg" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/></div><br/><strong>一、去除QQ聊天窗口右上角的广告</strong><br/><br/>首先找到QQ的安装目录：比如我的QQ安装在C:\Program Files\Tencent\QQ\NewSkins\QQ2008\IMSkin（根据妳正在使用的版本有关，2007版好像在C:\Program Files\QQ\NewSkins\QQ2007）<br/><br/>找到<span style="color:Red">IMSkin.ini</span>这个文件用记事本打开，用记事本编辑：<br/><br/>ctrl+F 查找键<br/><br/>1、查找功能先找<span style="color:Red">rightSpace</span>字符串，找到后发现把<span style="color:Red">rightSpace=0</span>改为 <span style="color:Red">rightSpace=-242</span>； (注意242前面有个 - )<br/>2、在点击查找<span style="color:Red">menuShowBand</span>字符串把<span style="color:Red">menuShowBand = 1</span>，改为 <span style="color:Red">menuShowBand = 0</span>（记住空格绝对不能去掉）保存，OK<br/><br/>重新启动QQ，和网友聊天，对话框上的广告条是不是没了？<br/><br/><strong>二：关闭QQ2008迷你首页</strong><br/><br/>我们每次登陆QQ时都会稍带着把“腾讯网迷你首页打开”，虽然显示的都是最新的新闻，但却与我们打开的其它各大网站所看到新闻其基本相同，且其首页打开的速度比较慢，上面还覆盖着一个大广告，为此我们有必要把这个多此一举的新闻首页关掉。<br/>第一步：打开QQ安装后的文件夹，单击菜单栏“工具”→文件夹选项，在打开的“文件夹选项”对话框中选择“查看”选项卡，在“高级设置”框中把“隐藏已知文件类型的扩展名”项前边的勾去掉。<br/><br/>第二步：在QQ安装后的文件夹中找到<span style="color:Red">QQexternal.exe</span>文件并右键单击它，在弹出的快捷菜单中左键选择“删除”，也就是把该文件删除，因为QQ的新闻首页就是由QQexternal.exe文件控制的。<br/><br/>第三步：在QQ安装后的文件夹中的空白地方右键单击，左键选择“新建”→文本文档，也就是新建一个空的文本文件。然后右键单击“新建的文本文档”，左键选择“重命名”，把新建的文件文件名改为QQexternal.exe，在提示“如果改变文件扩展名，可会导致文件不可用。确实要更改吗？”时直接点“是”即可。这步我们其实是采取“偷梁换柱”的方法制作了一个假的QQexternal.exe文件占着地方。<br/><br/>第四步：腾讯QQ一般安装在“C:\ProgramFiles\Tencent\QQ”文件目录中，在资源管理器中打开此目录，<br/>首先双击进入“AD”文件夹，按下“Ctrl+A”全选所有文件，再按下“Shift+Del&#101;te”彻底删除所有广告。在空白处右击，选择执行“属性”<br/><br/>第五步：单击“安全”标签，在“组或用户名称”中选择用户并点击下文的“删除”按钮，将所有用户删除。<br/>或者，将所有用户的权限都设置成“拒绝”，并且单击“高级”按钮。 清除勾选 &#34;从父项继承那些可以应用到子对象的权限项目，包括那些在此明确定义的项目&#34;。 随后会出现“安全”对话框，选择“删除”按钮便可，并确定退出。<br/><br/>最后，删除腾讯QQ安装目录C:\ProgramFiles\Tencent\QQ 下的“Dat”文件夹中的两个名为“ad”的文件就可以了。<br/><br/>这样，QQ程序就无法将下载的广告存放到我们的硬盘，而彻底消失了。<br/><br/>提示：如果在你的操作系统文件夹属性中没有找到“安全”标签，执行“控制面板→管理工具→本地安全策略”，打开“本地策略→安全选项”，在右侧窗口中找到“网络访问，本地账户的共享和安全模式”项，双击将其更改为:“经典-本地用户以自己的身份验证”。<br/><br/><span style="color:Blue">tx在qq的头顶上加了个搜索栏，怎么都去不掉。看着碍眼怎么办？下面给出两个方法干掉它： 第一种：在QQ\NewSkins\QQ2008下找一个VBScript.vbs文件，用写字板打开，点CTRL+F寻找ImSearchPlugin.bInside 。共有三处，把其中一处的ImSearchPlugin.bInside = TRUE修改为ImSearchPlugin.bInside = FALSE 第二种：在NewSkins\QQ2008文件夹下找到“IMSearchPlugin”这个文件夹，直接删掉</span><br/><br/>另外的方法<br/>在QQ目录,搜索 IMSearchPlugin ,将这个文件随便修改下名字, 重新登陆,即可!]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=303" /> 
	  <id>http://www.freearc.net/default.asp?id=303</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[再接再厉，PJBlog3 v2.8.4.133 发布[更新]]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=8" label="程序源码" /> 
	  <updated>2008-07-14T10:07:19+08:00</updated>
	  <published>2008-07-14T10:07:19+08:00</published>
		  <summary type="html"><![CDATA[<div align="center"><img src="http://www.freearc.net/attachments/month_0807/0200871410519.gif" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/></div>这个版本更新的功能只有一个 - 在线编辑 皮肤 插件 以及 模板 功能，这样大家调试的时候就不用把文件download下来再修改了。其实这属于一个开发者的功能，以后PJblog3会增加更多开发者和设计者的功能哈。<br/><br/>这次发布没有放出自动安装包，就辛苦各位手动ftp一堆文件了哈，推荐有在线编辑需求的用户升级。升级包只能在 PJBlog3 v2.8.3.127 上升级。<br/><a target="_blank" href="http://code.google.com/p/pjblog/downloads/list"><img src="http://www.freearc.net/attachments/month_0807/2200871410538.png" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/></a><br/><strong>特别说明: 需要复制粘贴代码的朋友，先取消代码高亮</strong><br/><img src="http://www.freearc.net/attachments/month_0807/6200871410623.jpg" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/><br/><strong><span style="color:Red">=== 致7.14 0:33 分前下载过的2.8.4.133的用户=== </span></strong><br/>1.由于个人经验不足导致部分升级了的朋友可能会使数据管理无法使用。 <br/>如果您发现数据管理和代码编辑器无法使用的，请重新下载一下更新包 更新以下文件即可 control/f_control.asp <br/>2. 继续发现一个bug 无法删除模块里的内<br/><img src="http://www.freearc.net/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.pjhome.net/attachments/month_0807/7200871323434.rar" target="_blank">点击下载补丁文件</a>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=302" /> 
	  <id>http://www.freearc.net/default.asp?id=302</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[让IE6支持PNG图片背景透明]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=8" label="程序源码" /> 
	  <updated>2008-07-10T17:19:37+08:00</updated>
	  <published>2008-07-10T17:19:37+08:00</published>
		  <summary type="html"><![CDATA[<div align="center"><img src="http://www.freearc.net/attachments/month_0807/t2008712134352.jpg" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/><br/>PNG图片背景透明效果图</div><br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&lt;!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Transitional//EN&#34; &#34;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" target="_blank">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>&#34;&gt;<br/>&lt;html xmlns=&#34;<a href="http://www.w3.org/1999/xhtml" target="_blank">http://www.w3.org/1999/xhtml</a>&#34;&gt;<br/>&lt;head&gt;<br/>&lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=gb2312&#34; /&gt;<br/>&lt;title&gt;关于QQ&lt;/title&gt;<br/>&lt;script type=&#34;text/javascript&#34; language=&#34;javascript&#34;&gt;<br/>/* * * * * * * * * * * * * * */<br/>/* 实现 IE6 PNG 图片背景透明 */<br/>/* * * * * * * * * * * * * * */<br/>var Png =<br/>{<br/>&nbsp;&nbsp; // 判断是否为IE及版本<br/>&nbsp;&nbsp; isIE : function()<br/>&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var Version = navigator.appVersion;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var intStart = Version.indexOf(&#39;MSIE&#39;) + 4;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var Ver = Version.substring(intStart, intStart + 4);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (navigator.appName == &#39;Microsoft Internet Explorer&#39; &amp;&amp; parseFloat(Ver) == 6)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br/>&nbsp;&nbsp; }<br/>&nbsp;&nbsp; ,<br/>&nbsp;&nbsp; // 修正IE6 PNG 图片背景透明BUG。<br/>&nbsp;&nbsp; Correct : function()<br/>&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(var i = 0; i &lt; document.images.length;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i ++ )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var img = document.images[i];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var LW = img.width;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var LH = img.height;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var imgName = img.src.toUpperCase();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (imgName.substring(imgName.length - 3, imgName.length) == &#39;PNG&#39;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;img.style.filter += &#39;progid:DXImageTransform.Microsoft.AlphaImageLoader(src=&#39; + img.src + &#39;, sizingmethod=scale);&#39;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;img.src = &#39;images/transparent.gif&#39;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;img.width = LW;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;img.height = LH;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp; }<br/>}<br/>;<br/><br/>// 页面加载添加功能<br/>Png.isIE() ? window.attachEvent(&#39;onload&#39;, Png.Correct) : null;<br/>&lt;/script&gt;<br/>&lt;/head&gt;<br/>&lt;body&gt;<br/>&lt;table width=&#34;100%&#34; border=&#34;0&#34; cellspacing=&#34;0&#34; cellpadding=&#34;0&#34;&gt;<br/>&nbsp;&nbsp;&lt;tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td align=&#34;center&#34; valign=&#34;middle&#34; bgcolor=&#34;#FF0000&#34;&gt;&lt;img src=&#34;关于QQ.png&#34; alt=&#34;&#34; /&gt;&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td align=&#34;center&#34; valign=&#34;middle&#34; bgcolor=&#34;#00FF00&#34;&gt;&lt;img src=&#34;关于QQ.png&#34; alt=&#34;&#34; /&gt;&lt;/td&gt;<br/>&nbsp;&nbsp;&lt;/tr&gt;<br/>&nbsp;&nbsp;&lt;tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td align=&#34;center&#34; valign=&#34;middle&#34; bgcolor=&#34;#0000FF&#34;&gt;&lt;img src=&#34;关于QQ.png&#34; alt=&#34;&#34; /&gt;&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td align=&#34;center&#34; valign=&#34;middle&#34; bgcolor=&#34;#FFFF00&#34;&gt;&lt;img src=&#34;关于QQ.png&#34; alt=&#34;&#34; /&gt;&lt;/td&gt;<br/>&nbsp;&nbsp;&lt;/tr&gt;<br/>&nbsp;&nbsp;&lt;tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td align=&#34;center&#34; valign=&#34;middle&#34; bgcolor=&#34;#00FFFF&#34;&gt;&lt;img src=&#34;关于QQ.png&#34; alt=&#34;&#34; /&gt;&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td align=&#34;center&#34; valign=&#34;middle&#34; bgcolor=&#34;#FF00FF&#34;&gt;&lt;img src=&#34;关于QQ.png&#34; alt=&#34;&#34; /&gt;&lt;/td&gt;<br/>&nbsp;&nbsp;&lt;/tr&gt;<br/>&nbsp;&nbsp;&lt;tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td align=&#34;center&#34; valign=&#34;middle&#34; bgcolor=&#34;#000000&#34;&gt;&lt;img src=&#34;关于QQ.png&#34; alt=&#34;&#34; /&gt;&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td align=&#34;center&#34; valign=&#34;middle&#34; bgcolor=&#34;#FFFFFF&#34;&gt;&lt;img src=&#34;关于QQ.png&#34; alt=&#34;&#34; /&gt;&lt;/td&gt;<br/>&nbsp;&nbsp;&lt;/tr&gt;<br/>&lt;/table&gt;<br/>&lt;/body&gt;<br/>&lt;/html&gt;<br/></div></div><br/><img src="http://www.freearc.net/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.fs2you.com/files/8624e25e-4fd6-11dd-abc8-0019d11a795f/" target="_blank">&gt;&gt; 点击进入 Fs2You 下载页面 &lt;&lt;</a><br/><img src="http://www.freearc.net/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.namipan.com/d/f28aec75a4d4d127ad02842deb68f019f7c8b1127a450100" target="_blank">&gt;&gt; 点击进入 纳米盘 下载页面 &lt;&lt;</a>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=301" /> 
	  <id>http://www.freearc.net/default.asp?id=301</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[用OpenDNS,google.com不会再转到google.cn]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=6" label="网络资讯" /> 
	  <updated>2008-07-10T14:35:32+08:00</updated>
	  <published>2008-07-10T14:35:32+08:00</published>
		  <summary type="html"><![CDATA[DNS解析太慢？何不试试OpenDNS--更安全、更快、更智能的DNS ！<br/><br/>OpenDNS 可以让你访问国外网站的时候，域名解析的速度更快。 <br/><br/>OpenDNS 可以帮助你过滤一些网络钓鱼(phishing) 站点。 <br/><br/>如果你把 .com 输错成 .cmo，OpenDNS 会自动帮助你矫正过来。 <br/><br/>这一切都是全免费的。 <br/>还有google.com，也不会再转到google.cn<br/><br/>OpenDNS的服务器地址：208.67.222.222或208.67.220.220]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=300" /> 
	  <id>http://www.freearc.net/default.asp?id=300</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Windows Server 2008 永久激活与备份]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=6" label="网络资讯" /> 
	  <updated>2008-07-10T12:20:52+08:00</updated>
	  <published>2008-07-10T12:20:52+08:00</published>
		  <summary type="html"><![CDATA[今天真的很高兴，终于找到永久激活2008企业版的序列号了。现在，记录一下这个激动人心的时刻。<br/><br/><strong>一、激活成功的几张图片。</strong><br/><div align="center"><img src="http://www.freearc.net/attachments/month_0807/s2008710121432.jpg" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/> <img src="http://www.freearc.net/attachments/month_0807/g2008710121447.jpg" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/><br/><img src="http://www.freearc.net/attachments/month_0807/a200871012159.jpg" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/></div><br/><br/><strong>二、激活的步骤。</strong><br/><br/>1、单击“开始”菜单，选择“运行”。<br/>2、在运行框中输入：SLMGR.VBS -ipk V8Q62-M4QBV-MTR8F-PCJH9-47FXW，运行。<br/>3、在上一次运行结束，并出现成功提示后，再次输入：SLMGR.VBS- ato。<br/>4、运行结束，再次输入：slmgr.vbs -xpr 或 slmgr.vbs -dlv，查看激活状态。<br/><br/><strong>三、备份激活。</strong><br/>1、已经激活的系统，备份这两个文件，记好激活序列号（Appdata是隐藏的文件夹）<br/>%systemroot%\System32\licensing\pkeyconfig\pkeyconfig.xrm-ms<br/>%systemroot%\ServiceProfiles\NetworkService\AppData\Roaming\Microsoft\SoftwareLicensing\tokens.dat<br/><br/>2、正常方法先重装系统，不要输入激活号，也不要联网<br/><br/>3、找到上面的两个文件，右键点属性——安全——高级——所有者，修改为administrator，关闭窗口，再重新选择 高级——权限，修改Amdinistator为完全控制，这样就可以删除了<br/><br/>把Software Licensing服务关掉，用备份的激活文件替换上面的两个文件(如不关掉服务，tokens.dat无法替换滴 ）<br/><br/>4、重启机器，输入激活号，过一会就活了，看一下计算机属性，如激活了，就可以联网了<br/><br/>如果莫名其妙的原因没激活，在第三步之后，可以试试下个方法<br/><br/>3-1.开启Software Licensing服务，在运行中输入 “SLMGR.VBS -ipk V8Q62-M4QBV-MTR8F-PCJH9-47FXW”<br/><br/>3-2.提示激活号已修改成功后，重启机器<br/><br/>5、查看下激活状态，运行 “slmgr.vbs -xpr”或“slmgr.vbs -dlv”]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=299" /> 
	  <id>http://www.freearc.net/default.asp?id=299</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[IIS7 的新功能 - URL重写、应用程序路由和负载均衡以及PowerShell Cmd-lets]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=6" label="网络资讯" /> 
	  <updated>2008-07-10T09:36:52+08:00</updated>
	  <published>2008-07-10T09:36:52+08:00</published>
		  <summary type="html"><![CDATA[在过去几周里，IIS团队发布了3个IIS扩展更新<br/>l&nbsp;&nbsp;URL Rewrite Module CTP1<br/>l&nbsp;&nbsp;Application Request Routing CTP1<br/>l&nbsp;&nbsp;PowerShell Provider CTP2<br/><br/><strong>URL Rewrite Module</strong><br/> <br/>URL Rewrite Module是一个基于规则的URL重写引擎，用于在URL被Web服务器处理之前改变请求的URL。对于动态Web应用程序，它可以为用户和搜索引擎提供友好的URL，URL重写和重定向是基于HTTP头和服务器变量的，并可以对站点内容进行访问控制。<br/><br/>l&nbsp;&nbsp;更多信息请访问：<a target="_blank" href="http://learn.iis.net/page.aspx/460/using-url-rewrite-module/">使用URL Rewrite Module</a><br/>l&nbsp;&nbsp;下载：<br/>n&nbsp;&nbsp;<img src="http://www.freearc.net/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.iis.net/downloads/default.aspx?tabid=34&amp;amp;amp;g=6&amp;amp;amp;i=1691" target="_blank">X86</a><br/>n&nbsp;&nbsp;<img src="http://www.freearc.net/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.iis.net/downloads/default.aspx?tabid=34&amp;amp;amp;g=6&amp;amp;amp;i=1692" target="_blank">X64</a><br/>l&nbsp;&nbsp;支持：<a target="_blank" href="http://forums.iis.net/1152.aspx">URL Rewrite Module论坛</a><br/><br/><strong>Application Request Routing</strong><br/> <br/>Application Request Routing（ARR）是一个基于代理的路由模块，可以根据HTTP头、服务器变量和负载均衡算法将HTTP请求转发到内容服务器上。它可以增强应用程序的效率和可扩展性，更好地利用内容服务器资源，并能够简化应用程序的部署，包括pilot management和A/B测试。ARR还有一种特性叫做<a target="_blank" href="http://learn.iis.net/page.aspx/490/shared-hosting-deployment-using-application-request-routing/">shared hoster</a>，用于修改如何共享目前提供的共享主机，为客户增加额外的服务。<br/><br/>l&nbsp;&nbsp;更多信息请访问：<a target="_blank" href="http://learn.iis.net/page.aspx/489/using-the-application-request-routing-module/">使用Application Request Routing Module</a><br/>l&nbsp;&nbsp;下载：<br/>n&nbsp;&nbsp;<img src="http://www.freearc.net/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.iis.net/downloads/default.aspx?tabid=34&amp;amp;amp;g=6&amp;amp;amp;i=1709" target="_blank">X86</a><br/>n&nbsp;&nbsp;<img src="http://www.freearc.net/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.iis.net/downloads/default.aspx?tabid=34&amp;amp;amp;g=6&amp;amp;amp;i=1712" target="_blank">X64</a><br/>l&nbsp;&nbsp;支持：<a target="_blank" href="http://forums.iis.net/1154.aspx">ARR论坛</a><br/><br/><strong>PowerShell Provider</strong><br/> <br/>PowerShell Provider允许管理员使用PowerShell来管理IIS。在这个第二个CTP发布中，添加了40个新的cmdlet，如创建Web站点和Web应用程序、安装和获取证书。这里可以找到cmdlet的完整列表。<br/> <br/>l&nbsp;&nbsp;更多信息请访问：<a target="_blank" href="http://learn.iis.net/page.aspx/447/managing-iis-with-the-iis-70-powershell-provider/">使用IIS 7.0 PowerShell Provider管理IIS</a><br/>l&nbsp;&nbsp;下载：<br/>n&nbsp;&nbsp;<img src="http://www.freearc.net/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://iis.net/downloads/default.aspx?tabid=34&amp;amp;amp;g=6&amp;amp;amp;i=1664" target="_blank">X86</a><br/>n&nbsp;&nbsp;<img src="http://www.freearc.net/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://iis.net/downloads/default.aspx?tabid=34&amp;amp;amp;g=6&amp;amp;amp;i=1665" target="_blank">X64</a><br/>l&nbsp;&nbsp;支持：<a target="_blank" href="http://forums.iis.net/1151.aspx">PowerShell论坛</a>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=298" /> 
	  <id>http://www.freearc.net/default.asp?id=298</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[ComputerWorld:Vista最烂的五个功能]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=6" label="网络资讯" /> 
	  <updated>2008-07-09T20:58:39+08:00</updated>
	  <published>2008-07-09T20:58:39+08:00</published>
		  <summary type="html"><![CDATA[Windows Vista发布到现在一路坎坷,有掌声也有倒彩,一位自称是Vista粉丝的用户在ComputerWorld上发表了自己的见解.<br/><strong>他认为,Windows Vista最烂的五个功能分别是:</strong><br/><br/><strong>1) 备份功能</strong><br/><br/>一个几乎脑残的功能(原文“Brain dead”,原来国外也用脑残这个词),备份单个文件夹?做不到,在备份中排除某些文件?也做不到,它只能帮你备份某些特殊文件,可用性0%.<br/><div align="center"><img src="http://www.freearc.net/attachments/month_0807/x200879205752.jpg" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/></div><br/><strong>2) 同步中心</strong><br/>这恐怕也是一个使用率最低的程序,不但毫无用处,而且即使你想用,看到这样不友好的界面你也不知道该怎么去用.<br/><div align="center"><img src="http://www.freearc.net/attachments/month_0807/z20087920589.jpg" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/></div><br/><strong>3) 网络投影机</strong><br/>听上去是一个不错的企业功能,但配置起来相当麻烦,你必须准确定位出它的网络位置,还要知道密码,而且投影机必须支持Windows Network Projector标准,这让它的可用度进一步降低.<br/><br/><strong>4) Windows Meeting Space</strong>很难想象一个没有VoIP特性,没有白板,聊天界面也完全不行的一个程序如何让你在网上召开一场会议?<br/><br/><strong>5) User Account Control</strong><br/>这个几乎不用多说,多按几下继续就可以感受到了.]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=297" /> 
	  <id>http://www.freearc.net/default.asp?id=297</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Google推出Protocol Buffers:争夺网络时代数据格式]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=6" label="网络资讯" /> 
	  <updated>2008-07-08T17:43:07+08:00</updated>
	  <published>2008-07-08T17:43:07+08:00</published>
		  <summary type="html"><![CDATA[在Web 2.0 时代，XML格式由于AJAX的风行以及RSS的普及而异军突起。不过随着Python和Ruby On Rails的走红，以及各种API的发布，YAML，JSON也逐渐成名。此次，Google推出了Protocol Buffers，是想让广大编程者方便地使用Google网络传输数据的格式。<br/><br/><strong>什么是Protocol Buffers? </strong><br/><br/>这是Protocol Buffers主页上的一段代码：<br/><br/>message Person {<br/>required string name = 1;<br/>required int32 id = 2;<br/>optional string email = 3;<br/><br/>enum PhoneType {<br/>MOBILE = 0;<br/>HOME = 1;<br/>WORK = 2;<br/>} message PhoneNumber {<br/>required string number = 1;<br/>optional PhoneType type = 2 [default = HOME];<br/>}<br/><br/>repeated PhoneNumber phone = 4;<br/>} <br/><br/>而Protocol Buffers的作用，就是将以上格式的数据类型，自动生成Java, Python, and C++的代码，然后以下一系列代码就可以直接调用了：（C++中）<br/><br/>Person person;<br/>person.set_name(&#34;John Doe&#34;);<br/>person.set_id(1234);<br/>person.set_email(&#34;jdoe@example.com&#34;);<br/>fstream output(&#34;myfile&#34;, ios::out | ios::binary);<br/>person.SerializeToOstream(&amp;output); fstream input(&#34;myfile&#34;, ios::in | ios::binary);<br/>Person person;<br/>person.ParseFromIstream(&amp;input);<br/>cout &lt;&lt; &#34;Name: &#34; &lt;&lt; person.name() &lt;&lt; endl;<br/>cout &lt;&lt; &#34;E-mail: &#34; &lt;&lt; person.email() &lt;&lt; endl; <br/><br/>相信所有C++编程者都为定义set,get之类的函数感到烦人过吧，而Google做的就是帮助你省去这些麻烦，构造更利于网络传输的数据结构。<br/><br/><strong>与XML的比较 优势</strong> <br/><br/>· 更简单 <br/>· 比XML小3到10倍体积 <br/>· 比XML快20到100倍 <br/>· 更不容易引起歧义 <br/>· 自动生成可编程的类代码 <br/><br/>比较：<br/>cout &lt;&lt; &#34;Name: &#34; &lt;&lt; person.name() &lt;&lt; endl; <br/><br/>cout &lt;&lt; &#34;E-mail: &#34; &lt;&lt; person.email() &lt;&lt; endl; <br/>cout &lt;&lt; &#34;Name: &#34; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt; person.getElementsByTagName(&#34;name&#34;)-&gt;item(0)-&gt;innerText() <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt; endl;<br/>cout &lt;&lt; &#34;E-mail: &#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt; person.getElementsByTagName(&#34;email&#34;)-&gt;item(0)-&gt;innerText()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt; endl; 劣势<br/><br/>· 没有层次，所以无法和HTML标记语言打交道 <br/>· 如果没有message的定义，根本无法知道message的意思，而XML是自解释型的。 <br/><a target="_blank" href="http://code.google.com/apis/protocolbuffers/docs/overview.html">Protocol Buffer主页</a> <a target="_blank" href="http://code.google.com/p/protobuf/downloads/">Protocol Buffer下载</a>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=296" /> 
	  <id>http://www.freearc.net/default.asp?id=296</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Foobar2000 v0.9.5.4 Beta 3 汉化版 + 绿色版]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=12" label="精品软件" /> 
	  <updated>2008-07-05T16:18:54+08:00</updated>
	  <published>2008-07-05T16:18:54+08:00</published>
		  <summary type="html"><![CDATA[Foobar2000是一个非常非常值得推荐的多媒体播放器，程序体积非常小巧，资源消费很小，界面朴素，没有Skin和其他多余的东西，简单就是一种美。Windows 平台下的高级音频播放器.包含了一些播放增益支持、低内存占用等基本特色以及内置支持一些流行的音频格式.<br/><br/><strong>0.9.5.3 b1更新日志: </strong><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 新增: 启动时若检测到已知不能正常工作的插件则显示通知.<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 新增: “媒体库已选项浏览器” 列表，与专辑列表和媒体库搜索兼容.<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 新增: 标题格式化函数: $stripprefix(), $swapprefix(), $year(), $month(), $day_of_month(), $date(), $time().<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 新增: 用于媒体库查询的新语法.<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 播放列表: 使用内建搜索栏时有更快的反应速度.<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 播放增益扫描器: 对有不兼容与MPEG同步帧的ID3v2标签MP3数据应用播放增益不再卡死.<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 播放增益扫描器: 新增services允许第三方插件执行播放增益分析.<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 不在与使用 metadb_display_hook API 的插件兼容<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 改变插件DLL加载逻辑 - 现只扫描“components” 及其子目录中的插件.<br/><br/>0.9.5.4 B3 安装版：<br/><img src="http://www.freearc.net/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="ftp://fbup:fbup@www.foobar2000.com.cn/foobar2000/chinese/0954B3/HA_FB_0.9.5.4_B3_Asion.exe&lt;br/&gt;" target="_blank">ftp://fbup:fbup@www.foobar2000.com.cn/foobar2000/chinese/0954B3/HA_FB_0.9.5.4_B3_Asion.exe<br/></a><br/>0.9.5.4 B3 绿色版：<br/><img src="http://www.freearc.net/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="ftp://fbup:fbup@www.foobar2000.com.cn/foobar2000/chinese/0954B3/HA_FB_0.9.5.4_B3_Asion_Green.rar" target="_blank">ftp://fbup:fbup@www.foobar2000.com.cn/foobar2000/chinese/0954B3/HA_FB_0.9.5.4_B3_Asion_Green.rar</a>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=294" /> 
	  <id>http://www.freearc.net/default.asp?id=294</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[6. 区别值类型和引用类型。]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=8" label="程序源码" /> 
	  <updated>2008-07-03T09:19:01+08:00</updated>
	  <published>2008-07-03T09:19:01+08:00</published>
		  <summary type="html"><![CDATA[<strong><span style="font-size:12pt">值类型和引用类型的区别</span></strong><br/><br/><strong>一、总的区别</strong><br/><div align="center"><img src="http://www.freearc.net/attachments/month_0807/g20087391038.jpg" border="0" alt="" style="border:1px solid #ddd;margin:5px 0;padding:1px;"/></div><br/><strong>二、赋值区别</strong><br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static void Main(string arg[])<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int x = 10;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int y = x;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(x.ToString() + &#34;,&#34; + y.ToString());//输出的结果是:10,10<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y = 20;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(x.ToString() + &#34;,&#34; + y.ToString());//输出的结果是:10,20<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int[] arry = new int[1];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int[] arry1 = arry;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arry[0] = 10;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(arry[0].ToString() + &#34;,&#34; + arry1[0].ToString());//输出的结果是:10,10<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arry1[0] = 20;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(arry[0].ToString() + &#34;,&#34; + arry1[0].ToString());//输出的结果是:10,20<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string str1 = &#34;liao&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string str2 = str1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(str1 + &#34;,&#34; + str2);//输出的结果是:liao,liao<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str1 = &#34;xiao&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(str1 + &#34;,&#34; + str2);//输出的结果是:xiao,liao<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/></div></div><br/>1、因int 是值类型，int x&nbsp;&nbsp;int y 内存中就有两个地方存储x,y;所以当改变x或y的值时，都不会改变另一个变量的值。<br/>2、因int [] arry，int []arry1 是数组，数组是引用类型，所以这两个变量引用了同一个对象（数组）<br/>所以当 改变某一个引用指向的对象的属性同时也会影响到所有其他指向这个对象的引用,所以当arry1[0]的值改成20时，arry[0]的值也随着改变成20;最后的arry[0]和arry[1]的值都为20;不过虽然字符类型string也是引用类型，但它的工作方式更像值类型,既当str1的值改成&#34;xiao&#34;时，新创建了一个string对象，str1引用这个新的string对象；str2仍然引用原来string对象。产生这种行为的原因是string对象是恒定的，也就是说，一旦一个string对象被创建，它的值就不能再修改，所以当改变一个字符串变量的值的时候，仅仅是新创建了一个包含修改内容的新的string对象。<br/><strong>三、作为函数参数或者返回值</strong><br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class Program<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static void add(int k)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k = k + 39;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static void add(ref int i)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = i + 39;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static void add(int[] j)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j[0] = j[0] + 39;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static void astr(ref string sy)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sy = &#34;ddd&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static void Main(string[] args)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int[] ary = new int[1];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int[] ary1 = ary;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ary[0] = 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add(ary[0]);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(ary[0].ToString()); //输出的结果是:1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add(ref ary[0]);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(ary[0].ToString()); //输出的结果是:40<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add(ary);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(ary[0].ToString()); //输出的结果是:79<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string str4 = &#34;liaoxiaol&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;astr(ref str4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出的结果是:ddd //str4的值已改变<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(str4);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/></div></div><br/><span style="color:Red">说明：</span><br/>1、对于值类型的变量：要想在函数中对传进去的参数做真正的修改，需要借助于ref这个关键字，所以当执行add(ary[0])后，arry[0]的值时并没有改变；而当执行add(ref ary[0])后，ary[0]的值，就变成了1+39=40；<br/>2、对于引用类型的变量，则和值变量相反;而在实际应用中我们并不想引用类型变量作为函数参数传入后，其值有所心改变，要做到这一点需要为“引用类型”提供一个额外的clone函数，所以当执行add(arry)后，arry[0]的值就变成了40+39=79；<br/>3、虽然string类型也是引用类型但前面也说过string 类型的工作更像值类型。<br/><br/><span style="color:Red">附加：</span><br/>对于引用类型来说，提供一个clone函数不是一件容易的事情，尤其出现引用类型嵌套的时候，在C#中，尤其自己定义类型的时候，常常由于是用struct来定义还是用class来定义，即是定义一个值类型还是一个引用类型呢。在这本书上给了几个判定条件，如果如下几点都满足的话，建议用struct来定义为值类型，否则用class定义为引用类型。<br/><br/>1、这个类型是否主要为了数据存储；<br/>2、是否只通过属性来访问对象的数据成员；<br/>3、这个类型是否不会有子类型；<br/>4、在程序处理的时候不会把这个类型对象通过多态来处理。<br/>总而言之，在C#中，就是把底层面的数据用值类型来处理，而包含复杂操作，需要进行扩展的数据用引用类型来处理。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=293" /> 
	  <id>http://www.freearc.net/default.asp?id=293</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[5. 总是为自定义类重载 ToString 方法。]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=8" label="程序源码" /> 
	  <updated>2008-07-02T09:52:11+08:00</updated>
	  <published>2008-07-02T09:52:11+08:00</published>
		  <summary type="html"><![CDATA[<strong><span style="font-size:12pt">总是提供ToString()方法</span></strong><br/><br/>System.Object.ToString()恐怕是.NET中最常用的方法了。应该为我们的类的所有客户代码提供一个合理的版本，否则这些代码就只能使用我们的类的一些属性来自己定制可读的表示了。类型的字符串表示非常有用，可以在很多地方向用户显示对象的有关信息，例如在Windows Forms上、Web Forms上、控制台输出窗口中，以及调试环境中。为此，我们创建的每一个类型都应该重写Object类的ToString()方法。如果创建的是更复杂的类型，则应该实现Iformattable.ToString()方法。如果我们没有重写该方法，或者写得不够好，那么使用它们的客户代码就要自己想办法修补了。<br/><br/>System.Object默认提供的ToString()方法会返回类型的名称。这样的信息一般没有什么用处，像&#34;Rect&#34;、&#34;Point&#34;、&#34;Size&#34;这样的字符串大多都不是我们希望显示给用户的。但如果我们不重写Object的ToString()方法，用户看到的就将是这些。我们只需要写一次，但是客户将享用无数次。一点点付出，就可以让很多人（包括我们自己）受益。<br/><br/>让我们来看看重写System.Object.ToString()这个最简单的需求。该方法主要的功能就是为类型提供一个最常用的文本表示。例如，考虑下面这个具有三个字段的Customer类：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&nbsp;&nbsp;&nbsp;&nbsp;public class Customer<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private string _name;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private decimal _revenue;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private string _contactPhone;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/></div></div><br/>如果不提供重写的版本，Customer将继承Object类的ToString()方法，也就是返回一个&#34;Customer&#34;字符串。这个字符串实在没有什么用处。即使ToString()方法只应用于调试的目的，它也应该输出一个更有意义的字符串。我们重写的时候应该尽量考虑客户所希望的表示。就Customer类来说，返回_name是一个不错的选择：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&nbsp;&nbsp;&nbsp;&nbsp;public override string ToString()<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return _name;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/></div></div><br/>即使大家不遵循本条款中的其他建议，也要遵循这里所展示的实践。它可以节省很多人的时间。在我们为Customer类重写了ToString()方法之后，该类的对象将可以更容易地添加到Windows Forms控件、Web Forms控件或者控制台上。.NET FCL在将对象显示到各个控件（如Combo Box、List Box、Text Box等）上时，使用的就是Object.ToString()的重写版本。如果我们在Windows Forms或者Web Forms上创建了一个Customer对象的列表，其文本显示将为Customer的名称（_name）。System.Console.WriteLine()方法、System.String.Format()方法等内部也都调用到了ToString()方法。只要当.NET FCL需要获取Customer的字符串表示时，我们的Customer类型都将以其名称（_name）来响应。仅仅提供一个具有三行代码的方法，就可以处理所有这些基本的需求。<br/><br/>虽然简单的ToString()方法很多时候已经可以满足我们的需求，但有时候，我们还需要功能更强的方法。上述Customer类型有三个字段：_name、_revenue和_contactPhone，而我们仅使用了_name一个字段。我们可以通过实现IFormattable接口来解决这个问题。IFormattable接口包含了一个重载的ToString()方法，它允许我们为类型指定某种格式信息。当我们需要为类型创建不同形式的字符串输出时，这个接口非常有用。Customer类型就是一个例子。比如，有些用户可能希望创建一个报表，在其中以表格的形式包含客户的名称和上一年的收入。IFormattable.ToString()方法允许用户为我们的类型指定某种格式的字符串输出。其签名如下：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>string System.IFormattable.ToString(string format, IFormatProvider formatProvider);<br/></div></div><br/>我们可以使用格式字符串来为我们的类型指定自己的格式。比如，使用特定的字符来表示某种格式信息。在Customer类型的例子中，我们可以使用n来表示name，使用r来表示revenue，使用p来表示phone。另外，还可以指定这些字符的组合形式。下面的代码展示了一种可能的做法：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&nbsp;&nbsp;&nbsp;&nbsp;#region IFormattable Members<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 所支持的格式：<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 用n 表示name。<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 用r 表示revenue。<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 用p 表示contact phone。<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 同时支持组合格式: nr、np、npr等。<br/>&nbsp;&nbsp;&nbsp;&nbsp;// &#34;G&#34; 表示通用格式。<br/>&nbsp;&nbsp;&nbsp;&nbsp;string System.IFormattable.ToString(string format, IFormatProvider formatProvider)<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (formatProvider != null)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ICustomFormatter fmt = formatProvider.GetFormat(this.GetType()) as ICustomFormatter;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (fmt != null)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return fmt.Format(format, this, formatProvider);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch (format)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#34;r&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return _revenue.ToString();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#34;p&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return _contactPhone;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#34;nr&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string.Format(&#34;{0,20}, {1,10:C}&#34;, _name, _revenue);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#34;np&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string.Format(&#34;{0,20}, {1,15}&#34;, _name, _contactPhone);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#34;pr&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string.Format(&#34;{0,15}, {1,10:C}&#34;, _contactPhone, _revenue);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#34;pn&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string.Format(&#34;{0,15}, {1,20}&#34;, _contactPhone, _name);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#34;rn&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string.Format(&#34;{0,10:C}, {1,20}&#34;, _revenue, _name);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#34;rp&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string.Format(&#34;{0,10:C}, {1,20}&#34;, _revenue, _contactPhone);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#34;nrp&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string.Format(&#34;{0,20}, {1,10:C}, {2,15}&#34;, _name, _revenue, _contactPhone);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#34;npr&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string.Format(&#34;{0,20}, {1,15}, {2,10:C}&#34;, _name, _contactPhone, _revenue);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#34;pnr&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string.Format(&#34;{0,15}, {1,20}, {2,10:C}&#34;, _contactPhone, _name, _revenue);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#34;prn&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string.Format(&#34;{0,15}, {1,10:C}, {2,15}&#34;, _contactPhone, _revenue, _name);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#34;rpn&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string.Format(&#34;{0,10:C}, {1,15}, {2,20}&#34;, _revenue, _contactPhone, _name);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#34;rnp&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string.Format(&#34;{0,10:C}, {1,20}, {2,15}&#34;, _revenue, _name, _contactPhone);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#34;n&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#34;G&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return _name;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;#endregion<br/></div></div><br/>添加该函数使得Customer类型的客户可以定制Customer类型的表示：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>IFormattable c1 = new Customer();<br/>Console.WriteLine(&#34;Customer record: {0}&#34;, c1.ToString(&#34;nrp&#34;, null));<br/></div></div><br/>IFormattable.ToString()的实现一般来说是依类型而异的，但有些工作是每一个类型中我们都需要处理的。首先，我们必须支持表示“通用格式”的&#34;G&#34;。其次，我们必须支持两种形式的“空格式”，即&#34;&#34;和null。这三种格式返回的字符串必须与Object.ToString()的重写版本返回的字符串相同。.NET FCL对每一个实现了IFormattable接口的类型，会调用IFormattable.ToString()，而非Object.ToString()。.NET FCL通常会用一个null的格式字符串来调用IFormattable.ToString()，只是在一小部分场合会使用&#34;G&#34;来表示通用格式。如果我们的类型支持IFormattable接口，但又不支持这些标准格式，那么我们就打破了FCL中的自动字符串转换规则。<br/><br/>IFormattable.ToString()方法的第二个参数为一个实现了IFormatProvider接口的对象。该对象允许客户程序提供一些我们不能预料的格式化选项。如果看前面IFormattable.ToString()的实现，总会有一些我们期望、但实际上却没有提供的格式化选项。如果我们希望提供的输出容易为人所读懂，这种情况便不可避免。不管我们支持多少种格式化选项，用户总有一天会期望某种我们无法预料的格式。这就是上面的代码示例中最开始的几行所做的工作：寻找实现了IFormatProvider接口的对象，然后将格式化任务交给其中的ICustomFormatter来完成。<br/><br/>下面，将我们的视角从类的作者转到类的使用者上来。假设我们期望的某种格式没有获得支持，例如某些customer的name字符数要大于20，这时候我们希望提供字符数为50的name。这就是IFormatProvider接口的用武之地了。我们需要创建两个类：一个实现IFormatProvider接口，另一个实现ICustomFormatter接口——该类用于创建自定义的输出格式。IFormatProvider接口中定义有一个方法：GetFormat()，该方法会返回一个实现了ICustomFormatter接口的对象。ICustomFormatter接口中包含了实际执行格式化的方法。下面的代码实现了提供字符数为50的name输出：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&nbsp;&nbsp;&nbsp;&nbsp;// IFormatProvider示例：<br/>&nbsp;&nbsp;&nbsp;&nbsp;public class CustomFormatter : IFormatProvider<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#region IFormatProvider Members<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// IFormatProvider 仅包含一个方法。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 该方法返回一个使用指定接口格式的对象。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 一般情况下，只有ICustomFormatter被实现。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public object GetFormat(Type formatType)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (formatType == typeof(ICustomFormatter))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new CustomerFormatProvider();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endregion<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 一个嵌套类，为Customer类提供定制格式。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private class CustomerFormatProvider : ICustomFormatter<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#region ICustomFormatter Members<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public string Format(string format, object arg, IFormatProvider formatProvider)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Customer c = arg as Customer;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (c == null)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return arg.ToString();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string.Format(&#34;{0,50}, {1,15}, {2,10:C}&#34;,c.Name, c.ContactPhone, c.Revenue);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endregion<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/></div></div><br/>上面的GetFormat()方法创建了一个实现了ICustomFormatter接口的对象。ICustomFormatter.Format()方法则按指定的方式执行实际的格式化输出工作，将对象转换为一个字符串格式。我们可以为ICustomFormatter.Format()方法定义format参数，以便指定多种格式化选项。参数formatProvider则是用于调用GetFormat()方法的一个IFormatProvider对象。<br/><br/>要指定我们自己定制的格式，需要显式调用string.Format()方法，并传递一个IFormatProvider对象：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>Console.WriteLine(string.Format(new CustomFormatter(), &#34;&#34;, c1 ));<br/></div></div><br/>不管一个类是否实现了IFormattable接口，我们都可以为其创建IformatProvider和ICustomFormatter的实现类。因此即使一个类的原作者没有提供合理的ToString()行为，我们仍然可以为其提供格式化支持。当然，作为一个类的外部访问者，我们只能通过访问其中的公有属性和数据成员来构造字符串。虽然编写两个类（分别实现IFormatProvider和ICustomFormatter）需要很多工作，且其目的仅仅是为了得到一个字符串。但是，一旦使用了这种方式来实现我们自己定义的字符串输出，它们将在.NET框架的各个地方得到支持。<br/><br/>现在，再让我们回到类作者这一角色上来。重写Object.ToString()是为类提供字符串表示的最简单方式。每当我们创建一个类型时，都要提供该方法。它应该是我们的类型最明显、最常用的一种表示。只有在一些比较少的情况下，当我们期望为类型提供更复杂的输出格式时，才应该实现IFormattable接口。它为“类型的用户定制类型的字符串输出”提供了一种标准的方式。如果我们没有做这些工作，用户就要自己来实现自定义格式化器。那样的做法需要更多的代码，因为用户处于类外，无法访问对象的内部状态。<br/><br/>人们总有获取类型信息的需求，而字符串对于人来说是最容易理解的。我们应该积极地去做这件事，而重写所有类型中的ToString()方法可能是所有做法中用最简单的。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=292" /> 
	  <id>http://www.freearc.net/default.asp?id=292</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[4. 使用条件属性 (Conditional Attributes) 来代替条件编译语句 #if。]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=8" label="程序源码" /> 
	  <updated>2008-07-01T16:38:19+08:00</updated>
	  <published>2008-07-01T16:38:19+08:00</published>
		  <summary type="html"><![CDATA[<strong><span style="font-size:12pt">用条件属性而不是#if预编译块</span></strong><br/><br/>使用#if/#endif 块可以在同样源码上生成不同的编译(结果)，大多数debug和release两个版本。但它们决不是我们喜欢用的工具。由于#if/#endif很容易被滥用，使得编写的代码难于理解且更难于调试。程序语言设计者有责任提供更好的工具，用于生成在不同运行环境下的机器代码。C#就提供了条件属性(Conditional attribute)来识别哪些方法可以根据环境设置来判断是否应该被调用。<br/><br/>(译注：属性在C#里有两个单词，一个是property另一个是attribute，它们有不是的意思，但译为中文时一般都是译为了属性。property是指一个对象的性质，也就是Item1里说的属性。而这里的attribute指的是.net为特殊的类，方法或者property附加的属性。可以在MSDN里查找attribute取得更多的帮助，总之要注意：attribute与property的意思是完全不一样的。)<br/><br/>这个方法比条件编译#if/#endif更加清晰明白。编译器可以识别Conditional属性，所以当条件属性被应用时，编译器可以很出色的完成工作。条件属性是在方法上使用的，所以这就使用你必须把不同条件下使用的代码要写到不同的方法里去。当你要为不同的条件生成不同的代码时，请使用条件属性而不是#if/#endif块。<br/><br/>很多编程老手都在他们的项目里用条件编译来检测先决条件(per-conditions)和后续条件(post-conditions)。<br/><br/>(译注：per-conditions，先决条件，是指必须满足的条件，才能完成某项工作，而post-conditions，后续条件，是指完成某项工作后一定会达到的条件。例如某个函数，把某个对象进行转化，它要求该对象不能为空，转化后，该对象一定为整形，那么：per-conditions就是该对象不能为空，而post-conditions就是该对象为整形。例子不好，但可以理解这两个概念。)<br/><br/>你可能会写一个私有方法来检测所有的类及持久对象。这个方法可能会是一个条件编译块，这样可以使它只在debug时有效。<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>private void CheckState( )<br/>{<br/>// The Old way:<br/>#if DEBUG<br/>&nbsp;&nbsp;Trace.WriteLine( &#34;Entering CheckState for Person&#34; );<br/><br/>&nbsp;&nbsp;// Grab the name of the calling routine:<br/>&nbsp;&nbsp;string methodName =<br/>&nbsp;&nbsp;&nbsp;&nbsp;new StackTrace( ).GetFrame( 1 ).GetMethod( ).Name;<br/><br/>&nbsp;&nbsp;Debug.Assert( _lastName != null,<br/>&nbsp;&nbsp;&nbsp;&nbsp;methodName,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#34;Last Name cannot be null&#34; );<br/><br/>&nbsp;&nbsp;Debug.Assert( _lastName.Length &gt; 0,<br/>&nbsp;&nbsp;&nbsp;&nbsp;methodName,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#34;Last Name cannot be blank&#34; );<br/><br/>&nbsp;&nbsp;Debug.Assert( _firstName != null,<br/>&nbsp;&nbsp;&nbsp;&nbsp;methodName,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#34;First Name cannot be null&#34; );<br/><br/>&nbsp;&nbsp;Debug.Assert( _firstName.Length &gt; 0,<br/>&nbsp;&nbsp;&nbsp;&nbsp;methodName,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#34;First Name cannot be blank&#34; );<br/><br/>&nbsp;&nbsp;Trace.WriteLine( &#34;Exiting CheckState for Person&#34; );<br/>#endif<br/>}<br/></div></div><br/>使用#if和#endif编译选项(pragmas)，你已经为你的发布版(release)编译出了一个空方法。这个CheckState()方法会在所有的版本(debug和release)中调用。而在release中它什么也不做，但它要被调用。因此你还是得为例行公事的调用它而付出小部份代价。<br/><br/>不管怎样，上面的实践是可以正确工作的，但会导致一个只会出现在release中的细小BUG。下面的就是一个常见的错误，它会告诉你用条件编译时会发生什么：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>public void Func( )<br/>{<br/>&nbsp;&nbsp;string msg = null;<br/><br/>#if DEBUG<br/>&nbsp;&nbsp;msg = GetDiagnostics( );<br/>#endif<br/>&nbsp;&nbsp;Console.WriteLine( msg );<br/>}<br/></div></div><br/>这一切在Debug模式下工作的很正常，但在release下却输出的为空行。release模式很乐意给你输出一个空行，然而这并不是你所期望的。傻眼了吧，但编译器帮不了你什么。你的条件编译块里的基础代码确实是这样逻辑。一些零散的#if/#endif块使你的代码在不同的编译条件下很难得诊断(diagnose)。<br/><br/>C#有更好的选择：这就是条件属性。用条件属性，你可以在指定的编译环境下废弃一个类的部份函数， 而这个环境可是某个变量是否被定义，或者是某个变量具有明确的值。这一功能最常见的用法就是使你的代码具有调试时可用的声明。.Net框架库已经为你提供了了基本泛型功能。这个例子告诉你如何使用.net框架库里的兼容性的调试功能，也告诉你条件属性是如何工作的以及你在何时应该添加它：<br/>当你建立了一个Person的对象时，你添加了一个方法来验证对象的不变数据(invariants)：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>private void CheckState( )<br/>{<br/>&nbsp;&nbsp;// Grab the name of the calling routine:<br/>&nbsp;&nbsp;string methodName =<br/>&nbsp;&nbsp;&nbsp;&nbsp;new StackTrace( ).GetFrame( 1 ).GetMethod( ).Name;<br/><br/>&nbsp;&nbsp;Trace.WriteLine( &#34;Entering CheckState for Person:&#34; );<br/>&nbsp;&nbsp;Trace.Write( &#34;\tcalled by &#34; );<br/>&nbsp;&nbsp;Trace.WriteLine( methodName );<br/><br/>&nbsp;&nbsp;Debug.Assert( _lastName != null,<br/>&nbsp;&nbsp;&nbsp;&nbsp;methodName,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#34;Last Name cannot be null&#34; );<br/><br/>&nbsp;&nbsp;Debug.Assert( _lastName.Length &gt; 0,<br/>&nbsp;&nbsp;&nbsp;&nbsp;methodName,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#34;Last Name cannot be blank&#34; );<br/><br/>&nbsp;&nbsp;Debug.Assert( _firstName != null,<br/>&nbsp;&nbsp;&nbsp;&nbsp;methodName,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#34;First Name cannot be null&#34; );<br/><br/>&nbsp;&nbsp;Debug.Assert( _firstName.Length &gt; 0,<br/>&nbsp;&nbsp;&nbsp;&nbsp;methodName,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#34;First Name cannot be blank&#34; );<br/><br/>&nbsp;&nbsp;Trace.WriteLine( &#34;Exiting CheckState for Person&#34; );<br/>}<br/></div></div><br/>这这个方法上，你可能不必用到太多的库函数，让我简化一下。这个StackTrace 类通过反射取得了调用方法的的名字。这样的代价是昂贵的，但它确实很好的简化了工作，例如生成程序流程的信息。这里，断定了CheckState所调用的方法的名字。被判定(determining)的方法是System.Diagnostics.Debug类的一部份，或者是System.Diagnostics.Trace类的一部份。Degbug.Assert方法用来测试条件是否满足，并在条件为false时会终止应用程序。剩下的参数定义了在断言失败后要打印的消息。Trace.WriteLine输出诊断消息到调试控制台。因此，这个方法会在Person对象不合法时输出消息到调试控制台，并终止应用程序。你可以把它做为一个先决条件或者后继条件，在所有的公共方法或者属性上调用这个方法。<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>public string LastName<br/>{<br/>&nbsp;&nbsp;get<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;CheckState( );<br/>&nbsp;&nbsp;&nbsp;&nbsp;return _lastName;<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;set<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;CheckState( );<br/>&nbsp;&nbsp;&nbsp;&nbsp;_lastName = value;<br/>&nbsp;&nbsp;&nbsp;&nbsp;CheckState( );<br/>&nbsp;&nbsp;}<br/>}<br/></div></div><br/>在某人试图给LastName赋空值或者null时，CheckState会在第一时间引发一个断言。然后你就可以修正你的属性设置器，来为LastName的参数做验证。这就是你想要的。<br/><br/>但这样的额外检测存在于每次的例行任务里。你希望只在调试版中才做额外的验证。这时候条件属性就应运而生了：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>[ Conditional( &#34;DEBUG&#34; ) ]<br/>private void CheckState( )<br/>{<br/>&nbsp;&nbsp;// same code as above<br/>}<br/></div></div><br/>Conditional属性会告诉C#编译器，这个方法只在编译环境变量DEBUG有定义时才被调用。同时，Conditional属性不会影响CheckState()函数生成的代码，只是修改对函数的调用。如果DEBGU标记被定义，你可以得到这：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>public string LastName<br/>{<br/>&nbsp;&nbsp;get<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;CheckState( );<br/>&nbsp;&nbsp;&nbsp;&nbsp;return _lastName;<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;set<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;CheckState( );<br/>&nbsp;&nbsp;&nbsp;&nbsp;_lastName = value;<br/>&nbsp;&nbsp;&nbsp;&nbsp;CheckState( );<br/>&nbsp;&nbsp;}<br/>}<br/></div></div><br/>如果不是，你得到的就是这：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>public string LastName<br/>{<br/>&nbsp;&nbsp;get<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;return _lastName;<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;set<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;_lastName = value;<br/>&nbsp;&nbsp;}<br/>}<br/></div></div><br/>不管环境变量的状态如何，CheckState()的函数体是一样的。这只是一个例子，它告诉你为什么要弄明白.Net里编译和JIT之间的区别。不管DEBUG环境变量是否被定义，CheckState()方法总会被编译且存在于程序集中。这或许看上去是低效的，但这只是占用一点硬盘空间，CheckState()函数不会被载入到内存，更不会被JITed(译注：这里的JITed是指真正的编译为机器代码)，除非它被调用。它存在于程序集文件里并不是本质问题。这样的策略是增强(程序的)可伸缩性的，并且这样只是一点微不足道的性能开销。你可以通过查看.Net框架库中Debug类而得到更深入的理解。在任何一台安装了.Net框架库的机器上，System.dll程序集包含了Debug类的所有方法的代码。由环境变量在编译时来决定是否让由调用者来调用它们。<br/><br/>你同样可以写一个方法，让它依懒于不只一个环境变量。当你应用多个环境变量来控制条件属性时，他们时以or的形式并列的。例如，下面这个版本的CheckState会在DEBUG或者TRACE为真时被调用：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>[ Conditional( &#34;DEBUG&#34; ),<br/>&nbsp;&nbsp;Conditional( &#34;TRACE&#34; ) ]<br/>private void CheckState( )<br/></div></div><br/>如果要产生一个and的并列条件属性，你就要自己事先直接在代码里使用预处理命令定义一个标记：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>#if ( VAR1 &amp;&amp; VAR2 )<br/>#define BOTH<br/>#endif<br/></div></div><br/>是的，为了创建一个依懒于前面多个环境变量的条件例程(conditional routine)，你不得不退到开始时使用的#if实践中了。#if为我们产生一个新的标记，但避免在编译选项内添加任何可运行的代码。<br/><br/>Conditional属性只能用在方法的实体上，另外，必须是一个返回类型为void的方法。你不能在方法内的某个代码块上使用Conditional，也不能在一个有返回值的方法上使用Conditional属性。取而代之的是，你要细心构建一个条件方法，并在那些方法上废弃条件属性行为。你仍然要回顾一下那些具有条件属性的方法，看它是否对对象的状态具有副作用。但Conditional属性在安置这些问题上比#if/#endif要好得多。在使用#if/#endif块时，你很可能错误的移除了一个重要的方法调用或者一些配置。<br/><br/>前面的例子合用预先定义的DEBUG或者TRACE标记，但你可以用这个技巧，扩展到任何你想要的符号上。Conditional属性可以由定义标记来灵活的控制。你可以在编译命令行上定义，也可以在系统环境变量里定义，或者从源代码的编译选择里定义。<br/><br/>使用Conditional属性可以比使用#if/#endif生成更高效的IL代码。在专门针对函数时，它更有优势，它会强制你在条件代码上使用更好的结构。编译器使用Conditional属性来帮助你避免因使用#if/#endif而产生的常见的错误。条件属性比起预处理，它为你区分条件代码提供了更好的支持。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.freearc.net/default.asp?id=291" /> 
	  <id>http://www.freearc.net/default.asp?id=291</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[3. 在 as 和 强制类型转换之间，优先使用 as 操作符。]]></title>
	  <author>
		 <name>MONO</name>
		 <uri>http://www.freearc.net/</uri>
		 <email>P4Blog@qq.com</email>
	  </author>
	  <category term="" scheme="http://www.freearc.net/default.asp?cateID=8" label="程序源码" /> 
	  <updated>2008-07-01T16:28:59+08:00</updated>
	  <published>2008-07-01T16:28:59+08:00</published>
		  <summary type="html"><![CDATA[<strong><span style="font-size:12pt">C#类型转换问题 IS as Convert</span></strong><br/><br/>在程序中，进行类型转换是常见的事。那么在C#中支持以前语言的类型转换方法，即用类型名进行强行转换，例如：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>object objTest = new NewType();<br/>NewType newValue = (NewType)objTest;<br/></div></div><br/>但是这样转换，有个严重的问题，就是在把objTest强转换成NewType类型对象的时候，这个过程是不安全的，因此需要用try-catch语句来进行保护。这样一来，比较安全的代码方式应该如下所示。<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&nbsp;&nbsp;&nbsp;&nbsp;object objTest = new NewType();<br/>&nbsp;&nbsp;&nbsp;&nbsp;NewType newValue = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;try<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newValue = (NewType)objTest;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;catch( Exception err )<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox.Show( err.Message );<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/></div></div><br/>但是如上的写法在C#中已经属于过时的写法，而且也属于比较低效的写法。在C#中比较高效而且安全的写法，应该用as操作符，那么完成如上类似功能的正确代码应该如下。<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>object objTest = new NewType();<br/>NewType newValue = objTest as NewType;<br/></div></div><br/>那么很明显，如上的写法首先看起来很简便，至少代码数量和强转方式一样。<strong>至于安全性，对于as操作符来说，它不会做过的转换操作，当需要转换对象的类型属于转换目标类型或者转换目标类型的派生类型的时候，那么此转换操作才能成功，而且并不产生新的对象。</strong>因此用as来进行类型转换使安全的。为什么用as操作符进行类型转换的效率要高于老式的类型转换的，因为用as操作符进行转换就如前面所说的，首先判断当前对象的类型，当类型满足要求后才进行转换。而传统的类型转换方式，是用当前对象直接去转换，而且为了保护转换成功，要加上try-catch，这就决定了它的效率不会高于as操作符的效率。<br/><br/>要注意的时候，不管用传统方式，还是用as操作符进行类型转换之后，在使用之前，需要进行判断转换是否成功，如下：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>if( newValue!= null )<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;//Work with the object named &#34;newValue&#34;<br/>}<br/></div></div><br/>但是，使用as操作符有如下几点限制。<br/>第一个就是，不用在类型之间进行类型转化，即如下编写就会出现编译错误。<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>NewType newValue = new NewType();<br/>NewType1 newValue = newValue as NewType1;<br/></div></div><br/>第二个就是，不能应用在值类型数据，即不能如下写（也会出现编译错误）。<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.freearc.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>object objTest = 11;<br/>int nValue = objTest as int;<br/></div></div><br/>对于第一点所提的，可以用传统的类型转换方式来完成，但是光用如下的方式，是不能正确完成。<br/><div class="UBBPanel"><div class="UBBTi