<?xml version="1.0" encoding="utf-8" ?>
<!-- generator="FEEDCREATOR_VERSION" -->
<rss version="2.0" xmlns:sns="http://blog.sina.com.cn/sns">
    <channel>
        <title>。劍At仩┡塰</title>
        <description></description>
        <link>http://blog.sina.com.cn/yujo</link>
        <lastBuildDate>Fri, 26 Sep 2008 08:19:31 GMT+8</lastBuildDate>
        <generator>FEEDCREATOR_VERSION</generator>
        <language>zh-cn</language>
        <copyright>Copyright 1996 - 2008 SINA Inc. All Rights Reserved.</copyright>
        <pubDate>Fri, 26 Sep 2008 00:19:31 GMT+8</pubDate>
        <item>
            <title>通告:本人博客转移阵地了</title>
            <link>http://blog.sina.com.cn/s/blog_55e1543301000aqu.html</link>
            <description><![CDATA[<DIV>&nbsp;实在受不了这里的访问速度了</DIV>
<DIV>转移阵地搬去百度空间了:</DIV>
<DIV><FONT STYLE="FONT-SIZE: 32px" COLOR="#FF0000"><STRONG><A HREF="http://hi.baidu.com/yujo">http://hi.baidu.com/yujo</A></STRONG></FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG><FONT COLOR="#FF0000" SIZE="6">特此通告,这里从今日起停止更新</FONT></STRONG></DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG><FONT STYLE="FONT-SIZE: 18px" COLOR="#FF0000" SIZE="6">剑在上海 07/08/13 上午10:41</FONT></STRONG></DIV>
]]></description>
            <author>剑在上海</author>
            <category>信笔涂鸦</category>
            <comments>http://blog.sina.com.cn/s/blog_55e1543301000aqu.html#comment</comments>
            <pubDate>Mon, 13 Aug 2007 02:39:11 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_55e1543301000aqu.html</guid>
        </item>
        <item>
            <title>使用AJAX方式下载文件</title>
            <link>http://blog.sina.com.cn/s/blog_55e1543301000aos.html</link>
            <description><![CDATA[<DIV><FONT FACE="宋体">网上关于XMLHTTP使用数据流(responseStream)的文章很少，我随便写了个<br/>

<U>作用是通过AJAX方式下载文件</U><br/>
&lt;script langue=javascript&gt;<br/>
function window.onload()<br/>
{<br/>
&nbsp;var xmlhttp = new
ActiveXObject(Msxml2.XMLHTTP);<br/>
&nbsp;xmlhttp.open("POST","文件地址"，true);<br/>
&nbsp;xmlhttp.onReadyStateChange=RC;<br/>
&nbsp;xmlhttp.send("");<br/>
}</FONT>
<P><FONT FACE="宋体"><br/>
function RC()<br/>
{<br/>
&nbsp;if(xmlhttp.readyState==4)<br/>
&nbsp; {<br/>
&nbsp;&nbsp; var adodbstream=new
ActiveXObject("ADODB.Stream");<br/>
&nbsp;&nbsp; adodbstream.Type=1;<br/>
&nbsp;&nbsp; var
file="文件存放路径"；<br/>
&nbsp;&nbsp; var fso=new
ActiveXObject("Scripting.FileSystemObject");<br/>
&nbsp;&nbsp; var
temp=fso.BuildPatch(temp,file);&nbsp;<br/>
&nbsp;&nbsp; adodbstream.Open();<br/>
&nbsp;&nbsp;
adodbstream.Write(xmlhttp.responseBody);//或者是responseStream<br/>

&nbsp;&nbsp;
adodbstream.SaveToFile(file,2);<br/>
&nbsp;&nbsp; adodbstream.Close();<br/>
&nbsp; }<br/>
}<br/>
&lt;/script&gt;</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体">嘿嘿，有些朋友看出问题了吧，如果我把文件换成一个病毒/木马文件，把存放路径设为系统目录（\\..\\Documents
and Setting\\All Users\\[开始]
菜单\\程序\\启动\\那个文件名&nbsp;
XP/2K可用）那这代码就完全成XMLHTTP挂马了，也就是传说中的JS挂马,<STRONG>危害甚大不可乱用!</STRONG></FONT></P>
</DIV>
]]></description>
            <author>剑在上海</author>
            <category>项目文档</category>
            <comments>http://blog.sina.com.cn/s/blog_55e1543301000aos.html#comment</comments>
            <pubDate>Fri, 10 Aug 2007 08:58:38 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_55e1543301000aos.html</guid>
        </item>
        <item>
            <title>设计最高!自定义实体类</title>
            <link>http://blog.sina.com.cn/s/blog_55e1543301000afw.html</link>
            <description><![CDATA[<DIV><FONT FACE="宋体"><U><A HREF="http://www.microsoft.com/china/msdn/library/webservices/asp.net/CustEntCls.mspx?pf=true">
<FONT FACE="宋体">http://www.microsoft.com/china/msdn/library/webservices/asp.net/CustEntCls.mspx?pf=true</FONT></A></U></FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT FACE="宋体"><U>Dataset虽然支持离线访问数据,但是他缺点很多(不抽象,不OO,弱类型,内存占用大,速度慢),</U>于是就有了自定义实体类(<FONT COLOR="#FF0000">datareader+实体类</FONT>
实现),小小实现下:</FONT></DIV>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><STRONG>实体类</STRONG><FONT FACE="宋体" COLOR="#FF0000">(每个实体类的实例都相当于1条记录)</FONT><br/>
public class User<br/>
&nbsp;{<br/>
&nbsp; private int
userId;&nbsp;&nbsp; //3个属性<br/>
&nbsp; private string userName;<br/>
&nbsp; private string password;<br/>
&nbsp; public int UserId<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; get { return
userId; }<br/>
&nbsp;&nbsp;&nbsp; set { userId
= value; }<br/>
&nbsp;&nbsp; }<br/>
&nbsp; public string UserName<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; get { return
userName; }<br/>
&nbsp;&nbsp;&nbsp; set {
userName = value; }<br/>
&nbsp;&nbsp; }<br/>
&nbsp; public string Password<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; get { return
password; }<br/>
&nbsp;&nbsp;&nbsp; set {
password = value; }<br/>
&nbsp;&nbsp; }<br/>
public User() {}<br/>
public User(int id, string name, string password) {<br/>
this.UserId = id;<br/>
this.UserName = name;<br/>
this.Password = password;<br/>
&nbsp;}<br/>
}</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><STRONG>实体类集合</STRONG><FONT COLOR="#FF0000"><FONT FACE="宋体">(实体类集合的实例相当于记录的集合,即表)</FONT><br/></FONT>public
class UserCollection:CollectionBase<br/>
//继承CollectionBase类,工作原理是将所有类型的对象都存储在专有Arraylist中<br/>

&nbsp;{<br/>
&nbsp; public User this[int index] //引索器<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; get {return
(User)List[index];}<br/>
&nbsp;&nbsp;&nbsp; set
{List[index] = value;}<br/>
&nbsp;&nbsp; }<br/>
&nbsp; public int Add(User value)<br/>
&nbsp; <FONT FACE="宋体">//将对象添加到CollectionBase的结尾处,返回引索值</FONT><br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; return
(List.Add(value));<br/>
&nbsp;&nbsp; }<br/>
&nbsp; public int IndexOf(User value)<br/>
&nbsp; <FONT FACE="宋体">//查找某对象,返回该对象引索值</FONT><br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; return
(List.IndexOf(value));<br/>
&nbsp;&nbsp; }<br/>
&nbsp; public void Insert(int index, User value)<br/>
&nbsp; <FONT FACE="宋体">/将对象插入CollectionBase的指定索引处</FONT><br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp;
List.Insert(index, value);<br/>
&nbsp;&nbsp; }<br/>
&nbsp; public void Remove(User value)<br/>
&nbsp; <FONT FACE="宋体">//从CollectionBase中移除某对象</FONT><br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp;
List.Remove(value);<br/>
&nbsp;&nbsp; }<br/>
&nbsp;public bool Contains(User value)<br/>
&nbsp;<FONT FACE="宋体">//CollectionBase中是否包含某对象,返回true/false</FONT><br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; return
(List.Contains(value));<br/>
&nbsp;&nbsp; }<br/>
&nbsp;}</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><STRONG>将datareader数据转成user对象</STRONG><br/>
public User PopulateUser(IDataRecord dr)&nbsp;<br/>
//IDataRecord是所有(Sql/OleDb)DataReader实现的接口<br/>
&nbsp;{<br/>
&nbsp; User user = new User();<br/>
&nbsp; user.UserId =
Convert.ToInt32(dr["UserId"]);<br/>
&nbsp; if(dr["UserName"] != DBNull.Value)
//检查null<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp;
user.UserName =
Convert.ToString(dr["UserName"]);&nbsp;&nbsp;<br/>

&nbsp;&nbsp; }<br/>
&nbsp; user.Password =
Convert.ToString(dr["Password"]);<br/>
&nbsp; return user;<br/>
&nbsp;}</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><STRONG>单个实体映射<br/></STRONG>public User
GetUser(int userId)<br/>
&nbsp;{<br/>
&nbsp; User user = null;<br/>
&nbsp; string strSql = "Select * From [User] Where
UserID=@UserID";<br/>
&nbsp; SqlParameter[] parms = new
SqlParameter[1];<br/>
&nbsp; parms[0] = new SqlParameter("@UserID",
SqlDbType.Int);<br/>
&nbsp; parms[0].Value =
userid;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>

&nbsp; SqlConnection conn = new
SqlConnection(XXXXX数据库连接);<br/>
&nbsp; SqlCommand command = new
SqlCommand(strSql,conn);<br/>
&nbsp; SqlDataReader dr = null;<br/>
&nbsp; conn.Open();<br/>
&nbsp; dr = command.ExecuteReader();<br/>
&nbsp; if(dr.Read())<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; user =
PopuplateUser(dr);&nbsp;&nbsp;
//把datareader数据转成user对象<br/>
&nbsp;&nbsp; }<br/>
&nbsp; conn.Close();<br/>
&nbsp; return user;<br/>
&nbsp;}</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><STRONG>实体集合映射</STRONG><br/>
public UserCollection GetAllUser()<br/>
&nbsp;{<br/>
&nbsp; UserCollection users = new
UserCollection();<br/>
&nbsp; string strSql = "Select * From [User]";<br/>
&nbsp; SqlConnection conn = new
SqlConnection(XXXXX数据库连接);<br/>
&nbsp; SqlCommand command = new
SqlCommand(strSql,conn);<br/>
&nbsp; SqlDataReader dr = null;<br/>
&nbsp; conn.Open();<br/>
&nbsp; dr = command.ExecuteReader();<br/>
&nbsp; while (dr.Read())<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp;
users.Add(PopuplateUser(dr));<br/>
&nbsp;&nbsp;&nbsp;
//把datareader数据转成单个user对象,再用Add方法添进集合<br/>
&nbsp;&nbsp; }<br/>
&nbsp; dr.Close();<br/>
&nbsp; conn.Close();<br/>
&nbsp; return users;<br/>
&nbsp;}</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><FONT COLOR="#FF0000">实体类的大致实现就是这样</FONT>,同时我们也可以<STRONG>在实体类中添加一些常用方法</STRONG>,如:<br/>

public User FindUserById(int userId)<br/>
&nbsp;{<br/>
&nbsp; foreach (User user in List)<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; if
(user.UserId == userId)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
{<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return user;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp; }<br/>
&nbsp; return null;<br/>
&nbsp;}</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体">同时实体类集合,可以轻松<STRONG>实现数据绑定</STRONG>(因为CollectionBase类实现了用于绑定的Ilist接口)<br/>

UserCollection users = DAL.GetAllUsers();<br/>
repeater.DataSource = users;<br/>
repeater.DataBind();<br/>
&lt;asp:Repeater onItemDataBound="r_IDB" ID="repeater"
Runat="server"&gt;<br/>
&nbsp;&lt;ItemTemplate&gt;<br/>
&nbsp; &lt;asp:Label ID="userName"
Runat="server"&gt;<br/>
&nbsp;&nbsp; &lt;%#
DataBinder.Eval(Container.DataItem, "UserName") %&gt;<br/>
&nbsp; &lt;/asp:Label&gt;<br/>
&nbsp;&lt;/ItemTemplate&gt;<br/>
&lt;/asp:Repeater&gt;</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><STRONG>管理关系</STRONG>(<FONT COLOR="#FF0000">Role类或RoleCollection类也是自定义实体/集合</FONT>)<FONT COLOR="#FF0000"><FONT FACE="宋体">实体之间也存在关系,使用对象时,关系只是对另一个对象的引用</FONT><br/>
</FONT>public class User<br/>
&nbsp;{……………………<br/>
&nbsp; private Role role;&nbsp;
//添加一个Role属性,表示<U>单个Role实体</U><br/>
&nbsp; public Role Role<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; get {return
role;}<br/>
&nbsp;&nbsp;&nbsp; set {role =
value;}<br/>
&nbsp;&nbsp; }<br/>
&nbsp;}<br/>
或者：<br/>
public class User<br/>
&nbsp;{……………………<br/>
&nbsp; private RoleCollection roles;
//添加一个RoleCollection属性,<U>表示Role的集合<br/></U>&nbsp;
public RoleCollection Roles<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; get<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
{<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if(roles == null)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{roles = new RoleCollection();}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return roles;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp; }<br/>
&nbsp;}<br/>
映射的例子<br/>
public User GetUserRoleId()<br/>
&nbsp;{<br/>
&nbsp; User user = new
User();//若有PopulateUser方法,则User user=null;<br/>
&nbsp; user.Role = new
Role();//若用RoleCollection属性,则这句不写<br/>
&nbsp; string strsql = "select User.UserId,Role.RoleId
from User,Role where User.UserId=Role.RoleId";<br/>
&nbsp; SqlConnection conn = new
SqlConnection(XXXX数据库连接);<br/>
&nbsp; SqlCommand command = new SqlCommand(strsql,
conn);<br/>
&nbsp; SqlDataReader dr = null;<br/>
&nbsp; conn.Open();<br/>
&nbsp; dr = command.ExecuteReader();<br/>
&nbsp; while(dr.Read())<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp;
user.UserId=Convert.ToInt32(dr["UserId"]);//或user =
Populate<U>User</U>(dr);<br/>
&nbsp;&nbsp;&nbsp;
user.Role.RoleId=Convert.ToInt32(dr["RoleId"]);<br/>
&nbsp;&nbsp;&nbsp;
//或user.Roles.Add(Populate<U>Role</U>(dr));<br/>
&nbsp;&nbsp;
}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>

&nbsp; dr.Close();<br/>
&nbsp; conn.Close();<br/>
&nbsp; return user;<br/>
&nbsp;}</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体" COLOR="#FF0000">会了以上内容就可轻松使用三层,MVC等等架构,同时这也是ORM的基础</FONT></P>
]]></description>
            <author>剑在上海</author>
            <category>技术资料</category>
            <comments>http://blog.sina.com.cn/s/blog_55e1543301000afw.html#comment</comments>
            <pubDate>Mon, 30 Jul 2007 10:37:52 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_55e1543301000afw.html</guid>
        </item>
        <item>
            <title>陕西话教程</title>
            <link>http://blog.sina.com.cn/s/blog_55e1543301000a0l.html</link>
            <description><![CDATA[<DIV><FONT FACE="宋体">普通话一声--陕西话三声<br/>
二声不变<br/>
普通话三声--陕西话四声<br/>
普通话四声--陕西话一声<br/>
一些翘舌音变平舌音<br/>
部分韵母iao--ue<br/>
"我"例外--nge</FONT>
<P><FONT FACE="宋体"><br/>
第1节：语音 语调（学玩本节 你就可以达到佟掌柜等级了：）</FONT></P>
<P>
“陕西话”的发音大多数跟普通话一致，特别是在年轻人当中，更是越来越接近普通话。这里以关中方言为基础，以《武林外传》中佟掌柜的发音为标准语音。陕西话的音调有四声，和普通话的四声有一定的对应关系。</P>
<P>普通话发阴平（一声调）的，陕西话都念轻声&nbsp;<br/>
普通话发阳平（二声调）的，陕西话仍读阳平&nbsp;<br/>
普通话发上声（三声调）的，陕西话发去声&nbsp;<br/>
普通话发去声（四声调）的，陕西话发阴平&nbsp;<br/>
这只是一般规律，根据人们日常生活中的讲话习惯，还会有一些特例。</P>
<P>举例：&nbsp; 妈 麻 马 骂<br/>
普通话：ma1 ma2 ma3 ma4<br/>
陕西话：ma0 ma2 ma4 ma1<br/>
正是因为陕西话中没有上声，发音不需要拐弯，所以讲起来酣畅淋漓，十分痛快</P>
<P>
李大嘴&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>

普通话声调：3－4－3&nbsp;<br/>
陕西话声调：4－1－4&nbsp;&nbsp;</P>
<P>
祝无双&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>

普通话声调：4－2－1<br/>
陕西话声调：1－2－0</P>
<P>语音方面特点，在没有声母的音节（零声母）前加后鼻音 ng
，类似英文[η]音<br/>
安红，我想你<br/>
普通话：an1 hong2, wo3 xiang3 ni3&nbsp;<br/>
陕西话：ηan0 hong2, ηe4 xiang4 ni4
(数字表示声调，0表示轻声，下同)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
我 爱 你<br/>
普通话：wo3 ai4 ni3&nbsp;<br/>
陕西话：ηe4 ηai1 ni4</P>
<P>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
我的神啊<br/>
普通话：wo3 de1 shen2 a<br/>
陕西话：ηe4 di0 shen2 a</P>
<P>个别字有变音&nbsp;<br/>
如 “就是” jiu4 shi4 读做 zou1 si1。&nbsp;</P>
<P>第2节 （本节为地道等级，佟掌柜等级不作要求）<br/>
语法<br/>
基本同普通话，<br/>
1，比较喜欢用“把”字句。我今天累坏了。陕作，今天把额累坏咧。<br/>
2，副词后置：今天很（太）热。陕作：今天热得很/今天热得很很/今天热得太太/今天热太太</P>
<P>第3节 （本节为地道等级，佟掌柜等级不作要求）<br/>
常用词汇<br/>
知达（zhī da）：这里&nbsp;<br/>
物达（wo da）：那里&nbsp;<br/>
啊达（à da）：哪里？一般回答用：物儿（wèir
??&nbsp;<br/>
啊是（à si）：哪？哪个是？一般回答用：物? （wò
si）&nbsp;<br/>
下面的（个）不读四声读三声&nbsp;<br/>
夜个-昨天&nbsp;<br/>
前个-前天&nbsp;<br/>
后个-后天&nbsp;<br/>
明个-明天&nbsp;<br/>
年司-去年&nbsp;<br/>
蹭-厉害&nbsp;<br/>
咥-吃饭、打人&nbsp;<br/>
试火-试一试&nbsp;<br/>
难常-困难，不容易办的&nbsp;<br/>
谝-聊天，说话&nbsp;<br/>
扎势-摆架子，打肿脸充胖子&nbsp;<br/>
花搅-开玩笑、恶作剧、取笑&nbsp;<br/>
产活-好，舒服&nbsp;<br/>
骚清-热情过分，讨好献媚之嫌&nbsp;<br/>
牟乱-不舒服、不适，思绪烦乱&nbsp;<br/>
马卡-差劲&nbsp;<br/>
晴忙(qing 2声 mang)--赶快&nbsp;<br/>
细香、细法-细致、仔细&nbsp;<br/>
嘹扎咧-很好，很美&nbsp;<br/>
扑西来海-邋遢、不整洁、不干净&nbsp;<br/>
打圆-周围、附近&nbsp;<br/>
麻达-麻烦、问题&nbsp;<br/>
麻米儿-不讲理、不明事理&nbsp;<br/>
瓷马二楞-不机灵，迟钝&nbsp;<br/>
克里马擦、克马-快点，英文：come on&nbsp;<br/>
毕咧-完蛋了，指事态无可挽回&nbsp;<br/>
噶达马西一和滩-乱七八糟一大堆&nbsp;<br/>
列远（lie yuàn）：一边去，站远&nbsp;<br/>
都成棇咧（）：都成什么样了啊？&nbsp;<br/>
成马咧（chéng mà lie）：程度形容词，例如快成马列，?
?亮成马列&nbsp;<br/>
我贼（ηè
zei）：-不太文明的用语，表示很惊讶&nbsp;<br/>
角（jué）：脚&nbsp;<br/>
达（dá）：爸爸或伯父&nbsp;<br/>
糊砌（hú qi）：土坯&nbsp;<br/>
就(jiu)：蹲</P>
<P>第4节 （本节为地道等级，佟掌柜等级不作要求）<br/>
方言趣话 古雅得陕西话<br/>
1，指善意的取笑，嘲讽(有激将的意思)，为：“穰”，记得《信陵君窃符救赵》吗？里面有，信陵君让侯赢曰；&nbsp;<br/>

2，
can，指刀具锋利(打不出字来)；ha，【黑吉】，指人心术不正，人坏或者水果等物变质了；“站”为“立”，“找”为“寻(xin)”。<br/>

3，反意疑问，用“得是”，“得是得”，据说日语的类似语句用deisiga。据说是日本人学习唐音的结果<br/>

4，你给我“滚”： 你给我“避”（pi4）。在陕西人听来是很粗的一句话
原来是这么个文邹邹的字。回避 的 避。</P>
<P>第5节<br/>
典型台词<br/>
《武林外传》台词 ：&nbsp;
额&nbsp;&nbsp;
错&nbsp;&nbsp;
咧，额&nbsp;&nbsp; 一&nbsp;
开&nbsp;&nbsp;
始&nbsp;&nbsp;
奏&nbsp;&nbsp;
错&nbsp;&nbsp; 咧，<br/>
&nbsp;
普通话拼音&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
wo3&nbsp; cuo4 le, wo3&nbsp; yi4 kai1 shi3
jiu4 cuo4 le,<br/>
&nbsp;
陕西话注音&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
nge4 cuo0 lie,nge4 yi2 kai0 si4&nbsp; zou1 cuo1
lie,</P>
<P>如&nbsp; 果&nbsp;&nbsp;
额&nbsp;&nbsp;
不&nbsp;&nbsp;
嫁&nbsp;&nbsp;
过&nbsp;&nbsp; 来，&nbsp;
额&nbsp;&nbsp;
的&nbsp;&nbsp;
夫&nbsp;&nbsp;
君&nbsp;&nbsp;
也&nbsp;&nbsp;
不&nbsp;&nbsp;
会&nbsp;&nbsp;
死，&nbsp;&nbsp;<br/>
ru2 guo3 wo3&nbsp; bu4&nbsp; jia4 guo4
lai2, wo3&nbsp; de1&nbsp;
fu1&nbsp; jun1 ye3&nbsp;
bu2&nbsp; hui4 si3,&nbsp;<br/>
ru2 guo4 nge4 bu0&nbsp; jia1 guo1 lai2, nge4
di0&nbsp; fu2&nbsp; jun0
ye4&nbsp; bu2&nbsp; hui1 si4,</P>
<P>如&nbsp; 果&nbsp;&nbsp;
我&nbsp;&nbsp;
的&nbsp;&nbsp;
夫&nbsp;&nbsp;
君&nbsp;&nbsp;
不&nbsp;&nbsp; 死，&nbsp;
额&nbsp;&nbsp;
也&nbsp;&nbsp;
不&nbsp;&nbsp;
会&nbsp;&nbsp;
沦&nbsp;&nbsp;
落&nbsp;&nbsp;
到&nbsp;&nbsp;&nbsp;<br/>
ru2 guo3 wo3&nbsp; de1&nbsp;
fu1&nbsp; jun1 bu4&nbsp;
si3&nbsp;&nbsp; wo3&nbsp;
ye3&nbsp; bu2&nbsp; hui4 lun2 luo4
dao4<br/>
ru2 guo4 nge4 di0&nbsp; fu2&nbsp; jun0
bu0&nbsp; si4,&nbsp; nge4
ye4&nbsp; bu0&nbsp; hui1 lun2 luo0 dao1</P>
<P>这&nbsp;&nbsp;
样&nbsp;&nbsp;
一&nbsp;&nbsp;
个&nbsp;&nbsp;
伤&nbsp;&nbsp;&nbsp;&nbsp;
心&nbsp;&nbsp; 的&nbsp;
地&nbsp; 方。<br/>
zhe4 yang4 yi2 ge4&nbsp; shang1 xin1
de&nbsp; di4 fang1<br/>
zhe1 yang1 y0 ge0&nbsp; shang2 xin0 di0 di1
fang0<br/></P>
</DIV>
]]></description>
            <author>剑在上海</author>
            <category>我的网摘</category>
            <comments>http://blog.sina.com.cn/s/blog_55e1543301000a0l.html#comment</comments>
            <pubDate>Wed, 11 Jul 2007 12:44:34 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_55e1543301000a0l.html</guid>
        </item>
        <item>
            <title>河南话教程</title>
            <link>http://blog.sina.com.cn/s/blog_55e1543301000a0k.html</link>
            <description><![CDATA[<DIV><FONT FACE="宋体">和普通话的比较，河南话除了加个别俚语，文字上没多大区别，主要是发音。&nbsp;</FONT>
<P><FONT FACE="宋体">普通话一声
--〉河南话二声&nbsp;<br/>
今天 --〉 jin2 tian2&nbsp;</FONT></P>
<P><FONT FACE="宋体">普通话二声
--〉河南话四声&nbsp;<br/>
明天 --〉 ming4 tian2&nbsp;</FONT></P>
<P><FONT FACE="宋体">普通话三声
--〉河南话一声&nbsp;<br/>
你我他 --〉ni1 wo1 ta2&nbsp;</FONT></P>
<P><FONT FACE="宋体">普通话四声
--〉河南话四声转二声&nbsp;<br/>
吃饭 --〉 chi2 fan4-an2&nbsp;</FONT></P>
<P><FONT FACE="宋体">你今天吃饭没有 --〉 ni1 jin2 tian2 chi2
fan4-an2 mei4 you1&nbsp;<br/>
&nbsp;<br/>
时间类：年是个－－去年；小进－－农历二十九天的月份；夜儿黑－－昨晚；江价儿、江才－－刚才；年下－－春节；见天－－每天；黑摸眼儿－－黑夜；一崩子－－时间稍长一些儿；真丈儿、丈完儿－－现在。&nbsp;&nbsp;</FONT></P>
<P><FONT FACE="宋体">南阳（社旗）话：漫路里——路上；道道——小胡同；擦子——橡皮；杂了？——怎么了？整啥里——干什么；中——行；人彩——漂亮；胰子——香皂；怪得劲——舒服；&nbsp;&nbsp;&nbsp;</FONT></P>
<P><FONT FACE="宋体">白说了——不要讲了；木扭——没有；中里呀——够了；&nbsp;&nbsp;&nbsp;</FONT></P>
<P><FONT FACE="宋体">前帮儿——上午&nbsp;&nbsp;&nbsp;<br/>

后帮儿——下午&nbsp;&nbsp;&nbsp;<br/>

不粘:不行.&nbsp;&nbsp;&nbsp;</FONT></P>
<P><FONT FACE="宋体">生活用语：&nbsp;&nbsp;&nbsp;</FONT></P>
<P><FONT FACE="宋体">五更：黎明；寥天地：露天；夜个：昨天；见天：每天；后傍：下午；前傍：上午；前音儿：前天；眼气：眼馋、羡慕；瓷实：结实、殷实；细发：仔细；人尖子儿：长得漂亮、俊俏；风发：感冒；埋迹：肮脏；不美气：有病、不合适；打平伙：几个人凑钱吃一顿；腿粗：喻有坚实的靠山；腰粗：喻家庭财产丰厚；旮旯：不容易被发现的地方；卖野眼：东张西望；样门儿：正好；晃晃：逛；麻达：麻烦；黑不溜鳅：黑得难看；怯火：畏惧、害怕、胆小；紧紧巴巴：勉强；老：常常；皮实：泼辣；临了：最后；叫唤：喊叫、吵闹。&nbsp;<br/>

&nbsp;&nbsp;&nbsp;<br/>
2、交往用语&nbsp;&nbsp;&nbsp;</FONT></P>
<P><FONT FACE="宋体">脸青：不讲情面；胡必枣：不讲道理；肉拧头：办事不利索；冒撂：说大话；没有足足：不知足；领娃：女人生孩子；暮囊：没本事；害娃子：妇女怀孕；急里麻察：慌乱；贵贱：无论如何；伤脸：使人丢面子；瞎话：谎言；嚷：批评；磨牙：纠缠、唠叨；串门子：在近邻户闲坐；戳祸：惹祸；压根：从来；样美：正好；啪啪：说说。&nbsp;&nbsp;&nbsp;</FONT></P>
<P><FONT FACE="宋体">3、指代用语&nbsp;&nbsp;&nbsp;</FONT></P>
<P><FONT FACE="宋体">在南阳民间的指代用语一般分人称指代用语、家禽指代用语、家畜指代用语、植物指代用语和其他物品的指代用语等。&nbsp;&nbsp;&nbsp;</FONT></P>
<P><FONT FACE="宋体">4、人称指代用语&nbsp;&nbsp;&nbsp;</FONT></P>
<P><FONT FACE="宋体">　懒货：懒惰的人；尖：不吃亏的人；二毬：傻子；熊包：软弱者；老实腾儿：憨厚老实之人；嘴倌：光说不做者，能说会道者；背锅子：驼背之人；猴屁股：坐不住的人；毛孩：小男孩；毛女：小女孩；屋里人：妻子；外头人：丈夫；二杆子：愚蠢；冒失：粗野、鲁莽之人；贼：小偷；娃儿：男孩；妞：女孩；掌柜的：丈夫；媱妈：后妈；先生：教师、医生；溜光锤：不务实者；半吊子：直率、倔强、爱使性的人；菜：笨、笨拙；教师儿：武功高强之人；糠包菜：无能之人；稀屎：小胆子。&nbsp;&nbsp;&nbsp;</FONT></P>
<P><FONT FACE="宋体">5、家禽、家畜类指代用语&nbsp;&nbsp;&nbsp;</FONT></P>
<P><FONT FACE="宋体">　
虼蚤：跳蚤；猪唠唠：猪；狼巴子：狼；叫驴：公驴；草驴：母驴；二马子：小公马；老犍子：阉过的公牛；伢猪：公猪；草猪：母猪；长虫：蛇；老鸹：乌鸦；哈蟆：青蛙；癞肚：癞哈蟆；蚂蚱：蝗虫；抱鸡娃：孵小鸡；大油：猪油；刀螂：螳螂；改劁子：阉过的母猪或公猪；屎壳螂：蜣螂；小虫：麻雀；夜猫儿：猫头鹰。&nbsp;&nbsp;&nbsp;</FONT></P>
<P><FONT FACE="宋体">6、植物类指代用语&nbsp;&nbsp;&nbsp;</FONT></P>
<P><FONT FACE="宋体">　　济里狗：蒺藜；包谷：玉米；包谷瓤：玉米心儿；水萝卜：红萝卜；红薯母儿：发过芽、育过苗的红薯；花籽：棉籽；灰子：梅子；落生儿：落花生；倭瓜：南瓜；北瓜：南瓜；大麻籽：蓖麻。&nbsp;&nbsp;&nbsp;</FONT></P>
<P><FONT FACE="宋体">7、其他物品指代用语&nbsp;&nbsp;&nbsp;</FONT></P>
<P><FONT FACE="宋体">　
贼星：流星；冷子：冰雹；屎布：尿布；呈子：状子；洋油:煤油；坑：池塘；门面：商店铺子；胰子：香皂；大氅：棉大衣；后园：厕所；布袋：容量为50千克以上的长袋子；碓古舀儿：石臼；电把：手电筒；袼败：用细麻和面糊制成的做鞋底的原料；粿子：糕点的统称；黄香：松香；马扎儿：小凳子；末子：碎土，碎屑；灶火：厨房；瘴子：雾；蒸馍：馒头。</FONT></P>
</DIV>
]]></description>
            <author>剑在上海</author>
            <category>我的网摘</category>
            <comments>http://blog.sina.com.cn/s/blog_55e1543301000a0k.html#comment</comments>
            <pubDate>Wed, 11 Jul 2007 12:43:30 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_55e1543301000a0k.html</guid>
        </item>
        <item>
            <title>JS模拟页面前进,后退,标签功能</title>
            <link>http://blog.sina.com.cn/s/blog_55e15433010009yo.html</link>
            <description><![CDATA[<DIV><FONT FACE="宋体"><FONT FACE="宋体" COLOR="#FF0000">通过JS操作HASH锚点，到达模拟页面前进、后退、标签的功能(不能恢复IE上按钮)</FONT><br/>

<br/>
Ajax程序许多不成熟的地方，其中比较典型的就是页面的前进、后退与标签问题，因为Ajax整个程序是</FONT><FONT FACE="宋体">采用无刷新与服务器进行交互，所以导致了大部分浏览器的前进后退的功能按钮失效，当然标签功能也</FONT><FONT FACE="宋体">失去了意义，如果用Ajax开发一个论坛的话，在堆积如山的帖子中必然有经典，但是我们在关闭浏览器</FONT><FONT FACE="宋体">后，就得重新从头开始寻找，这样实在是太痛苦了，所以为了弥补这个缺点，大家各出奇招，现在我向</FONT><FONT FACE="宋体">大家描述一下，在我的程序中，怎样实现这些功能。(转自博客园高达小强</FONT><FONT FACE="宋体"><A HREF="http://www.cnblogs.com/aiqingayu/archive/2006/10/24/538653.html">http://www.cnblogs.com/aiqingayu/archive/2006/10/24/538653.html</A>)</FONT>
<P><FONT FACE="宋体">我把实现功能的主要程序代码写在imitateHistory.js这个文件中</FONT></P>
<P><FONT FACE="宋体"><STRONG><br/>
●imitateHistory.js<br/></STRONG>//定义一个全局数组<br/>
var hashList = new Array();<br/>
//定义一个全局变量，用来作为hash的编号(等于数组的索引减1)<br/>
var hashNO = 0;<br/>
//初始化数组，将初次装载的页面的hash添加进数组<br/>
hashList[0] = window.location.hash.replace('#','');</FONT></P>
<P><FONT FACE="宋体">//将Hash填加到数组<br/>
function addHash(newHash)<br/>
&nbsp;{&nbsp;&nbsp;&nbsp;<br/>

&nbsp;
//这个判断是检测是否在点击后退按钮后，再点击了新的链接&nbsp;<br/>

&nbsp; if(hashNO!=(hashList.length - 1))<br/>
&nbsp;&nbsp; {&nbsp;<br/>
&nbsp;&nbsp;&nbsp;
//删除此页标识编号以后的数组项<br/>
&nbsp;&nbsp;&nbsp;
hashList.splice(hashNO+1,(hashList.length-(hashNO+1)));<br/>
&nbsp;&nbsp; }<br/>
&nbsp; hashList[hashList.length] = newHash;<br/>
&nbsp; //指向本页hash的编号<br/>
&nbsp; hashNO = hashList.length - 1;<br/>
&nbsp; //将Hash赋值给浏览器<br/>
&nbsp; makeHistory(newHash);<br/>
&nbsp; //根据浏览器的hash，加载数据<br/>
&nbsp; urlCode();<br/>
&nbsp; checkLinkButton();<br/>
&nbsp;}</FONT></P>
<P><FONT FACE="宋体">//将Hash赋值给浏览器<br/>
function makeHistory(newHash)<br/>
&nbsp;{<br/>
&nbsp; window.location.hash = newHash;<br/>
&nbsp;}<br/>
&nbsp;<br/>
//检测导航按钮状态（按钮是否可用）<br/>
function checkLinkButton()<br/>
&nbsp;{<br/>
&nbsp; if(hashList.length&gt;1)<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp;
if(hashNO&gt;0)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
{document.getElementById('Back').disabled='';}<br/>
&nbsp;&nbsp;&nbsp; else<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
{document.getElementById('Back').disabled='disabled';}<br/>
&nbsp;&nbsp;&nbsp;
if(hashNO&lt;(hashList.length-1))<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
{document.getElementById('Next').disabled='';}<br/>
&nbsp;&nbsp;&nbsp; else<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
{document.getElementById('Next').disabled='disabled';}&nbsp;&nbsp;<br/>

&nbsp;&nbsp; }<br/>
&nbsp;}</FONT></P>
<P><FONT FACE="宋体">//后退按钮onclick事件<br/>
function linkBack()<br/>
&nbsp;{<br/>
&nbsp; hashNO = hashNO - 1;<br/>
&nbsp; makeHistory(hashList[hashNO]);<br/>
&nbsp; //根据浏览器的hash，加载数据<br/>
&nbsp; urlCode();<br/>
&nbsp; checkLinkButton();<br/>
&nbsp;}</FONT></P>
<P><FONT FACE="宋体">//前进按钮onclick事件<br/>
function linkNext()<br/>
&nbsp;{<br/>
&nbsp; hashNO = hashNO + 1;<br/>
&nbsp; makeHistory(hashList[hashNO]);<br/>
&nbsp; //根据浏览器的hash，加载数据<br/>
&nbsp; urlCode();<br/>
&nbsp; checkLinkButton();<br/>
&nbsp;}</FONT></P>
<P><FONT FACE="宋体">//根据浏览器的hash，加载数据<br/>
function urlCode()<br/>
&nbsp;{<br/>
&nbsp; var TempHash = window.location.hash;<br/>
&nbsp;
//下面的"home"、"msgList"只是做个标识，可以自己定义<br/>
&nbsp; //根据浏览器的hash，加载数据(调用Ajax的回调方法
imitateAjax(mode))<br/>
&nbsp; switch(TempHash)<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp;
case"":<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
imitateAjax('home');<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp;
case"#home":<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
imitateAjax('home');<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp;
case"#news":<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
imitateAjax('news');<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp;
case"#photo":<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
imitateAjax('photo');<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp;
case"#music":<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
imitateAjax('music');<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp; }<br/>
&nbsp; //如果是留言本的页码标签<br/>
&nbsp; if (TempHash.substr(1,7)=="msgList")<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; var
page;<br/>
&nbsp;&nbsp;&nbsp;
//取得当前页码<br/>
&nbsp;&nbsp;&nbsp; page =
window.location.hash.substr(8,window.location.hash.length);<br/>
&nbsp;&nbsp;&nbsp;
imitateAjax('msgList'+page);<br/>
&nbsp;&nbsp; }<br/>
&nbsp;
//当然如果是论坛的帖子标签，我想也只是对TempHash这个字符串多玩几个花样而已，具体我就不介</FONT><FONT FACE="宋体">绍了。<br/>

&nbsp;}</FONT></P>
<P><FONT FACE="宋体">以上主要是用到JS数组的存储功能，用window.location.hash这个方法来操作浏览器的碎片标识。<br/>

下面是一个测试用的HTML文件，向大家描述一下具体的使用方法。</FONT></P>
<P><FONT FACE="宋体"><STRONG><br/>
●test.html</STRONG><br/>
&lt;html&gt;&lt;head&gt;&lt;title&gt;测试&lt;/title&gt;<br/>
&lt;script language="javascript" src="imitateHistory.js"
type="text/javascript"&gt;&lt;/script&gt;<br/>
&lt;script language="javascript" type="text/javascript"&gt;<br/>
//页面装载完后,通过浏览器的Hash初始化你的Ajax程序。<br/>
function window.onload()<br/>
&nbsp;{urlCode();}</FONT></P>
<P><FONT FACE="宋体">//我用下面这个方法来模拟AJAX回调不同的模块。<br/>
function imitateAjax(mode)<br/>
&nbsp;{<br/>
&nbsp; switch(mode)<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; case
"home":<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
document.getElementById('divAjax').innerHTML="你现在调用的是首页模块";<br/>

&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp; case
"news":<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
document.getElementById('divAjax').innerHTML="你现在调用的是新闻模块";<br/>

&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp; case
"photo":<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
document.getElementById('divAjax').innerHTML="你现在调用的是图片模块";<br/>

&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp; case
"music":<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
document.getElementById('divAjax').innerHTML="你现在调用的音乐是模块";<br/>

&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp; case
"msgList1":<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
document.getElementById('divAjax').innerHTML="你现在调用的是留言列表的第
1 页&lt;br/&gt;&lt;br</FONT><FONT FACE="宋体">/&gt;&lt;span&gt;上一页&lt;/span&gt;&lt;span
style='cursor:hand;'
onclick=addHash('msgList2')&gt;下一页</FONT><FONT FACE="宋体">&lt;/span&gt;";<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp; case
"msgList2":<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
document.getElementById('divAjax').innerHTML="你现在调用的是留言列表的第
2 页</FONT><FONT FACE="宋体">&lt;br/&gt;&lt;br/&gt;&lt;span
style='cursor:hand;'
onclick=addHash('msgList1')&gt;上一页&lt;/span&gt;&lt;span</FONT>
<FONT FACE="宋体">style='cursor:hand;'
onclick=addHash('msgList3')&gt;下一页&lt;/span&gt;";<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp; case
"msgList3":<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
document.getElementById('divAjax').innerHTML="你现在调用的是留言列表的第
3 页&lt;br/&gt;&lt;br</FONT><FONT FACE="宋体">/&gt;&lt;span
style='cursor:hand;'
onclick=addHash('msgList2')&gt;上一页&lt;/span&gt;&lt;span&gt;下一页</FONT><FONT FACE="宋体">&lt;/span&gt;";<br/>

&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp; }<br/>
&nbsp;}<br/>
&lt;/script&gt;<br/>
&lt;/head&gt;<br/>
&lt;body&gt;<br/>
&nbsp;&lt;input id="Back" onclick="linkBack();"
type="button" disabled="disabled" value="←" /&gt;<br/>
&nbsp;&lt;input id="Next" onclick="linkNext();"
type="button" disabled="disabled" value="→" /&gt;<br/>
&nbsp;<br/>
&nbsp;&lt;input onclick="addHash('home');"
type="button" value="首页" /&gt;<br/>
&nbsp;&lt;input onclick="addHash('news');"
type="button" value="新闻" /&gt;<br/>
&nbsp;&lt;input onclick="addHash('photo');"
type="button" value="图片" /&gt;<br/>
&nbsp;&lt;input onclick="addHash('music');"
type="button" value="音乐" /&gt;<br/>
&nbsp;&lt;input onclick="addHash('msgList1');"
type="button" value="留言" /&gt;</FONT></P>
<P><FONT FACE="宋体">&nbsp;&lt;div id='divAjax'
style="background-color:#CCCCCC;
height:100px;"&gt;&lt;/div&gt;</FONT></P>
<P><FONT FACE="宋体">&lt;/body&gt;&lt;/html&gt;<br/>
<br/>
<FONT FACE="宋体"><STRONG>P.S.</STRONG>以上只是<FONT FACE="宋体">通过JS操作HASH锚点，到达模拟页面前进、后退、标签的功能。</FONT><U>不能恢复IE上的按钮。</U><br/>

若要实现，可考虑使用RSH框架的DhtmlHistory.js。<br/>
但说实话，这本身也是AJAX的问题，RSH所实现的方法是通过Iframe，这很不爽，我情愿放弃那几个按钮<br/>

<br/>
<FONT FACE="宋体"><U>如果用RSH框架的DhtmlHistory.js可以恢复IE上“前进”“后退”“刷新”等按钮在AJAX中的作用<br/>
</U>DHTML历史记录应用程序也必须在与AJAX
Web页面相同的目录下包含blank.html文件；这个文件与RSH框架打包在一起，且对于Internet
Explorer来说是必需的。顺便提一下，RSH使用一个隐藏Iframe来跟踪和添加Internet
Explorer的历史记录变化；这个Iframe需要我们指定一个实际的文件位置才能正常工作，这就是blank.html。<br/>

RSH框架由两个JS文件组成：DhtmlHistory和HistoryStorage。<br/>
DhtmlHistory.js为AJAX应用程序提供历史记录抽象。<br/>
HistoryStorage.js允许开发人员保存任意数量的已存历史记录数据。<br/>
http://www.cnblogs.com/zengqs/archive/2006/08/30/489995.html</FONT></FONT></FONT></P>
</DIV>
]]></description>
            <author>剑在上海</author>
            <category>技术资料</category>
            <comments>http://blog.sina.com.cn/s/blog_55e15433010009yo.html#comment</comments>
            <pubDate>Mon, 09 Jul 2007 06:35:37 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_55e15433010009yo.html</guid>
        </item>
        <item>
            <title>void main()从来不存在于C/C++！潭浩强害人不浅</title>
            <link>http://blog.sina.com.cn/s/blog_55e15433010009sk.html</link>
            <description><![CDATA[<DIV>
<P><FONT FACE="宋体">我一直以为C/C++的main(C#是Main)和C#一样可以void/int<br/>
但C/C++中void main()是错误的<br/>
<U>C中可以用main()，因为C把这个当成int main()</U> <FONT FACE="宋体">//C把int当作默认类型，而()表示接受任何参数。<U>C的标准写法是int
main(void)</U>,<FONT FACE="宋体">这个void显式地说明函数不接受任何参数</FONT></FONT><br/>
<U>C++只好是写int main()了</U>
//C++中int不是默认类型,()表示不接受任何参数<br/>
很多书中都写出了void
main()，真是害人不浅(尤其是出现于广大校园中的老潭的书)</FONT></P>
<P><FONT FACE="宋体"><U>c：</U><br/>
main()，int main()，main(void)//C89可用<br/>
int main(void) //标准<br/>
{.........<br/>
return 0; //部分编译器自动加上<br/>
}</FONT></P>
<P><FONT FACE="宋体"><U>c++：</U><br/>
int main() //标准<br/>
{.........<br/>
return 0; //部分编译器自动加上<br/>
}</FONT></P>
<P><FONT FACE="宋体"><STRONG><br/>
关于C语言中return的一些总结</STRONG><br/>
return是C++预定义的语句，它提供了种植函数执行的一种放大。当return语句提供了一个值时，这个值就成为函数的返回值.<br/>

<FONT FACE="宋体">也有这样的，return;不返回值，直接退出函数<br/>
&nbsp;void xx()<br/>
{…………<br/>
return;<br/>
}</FONT><br/>
说到return,有必要提及主函数的定义,下面是从网络上找到的资料,好好消化吧,对了解主函数中返回值的理解有很大的帮助.</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><FONT COLOR="#FF0000">很多人甚至市面上的一些书籍，都使用了void main( )
，其实这是错误的。C/C++ 中从来没有定义过void main( ) 。</FONT>C++
之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着 The
definition void main( ) { /* ... */ } is not and never has been
C++, nor has it even been C. （ void main( ) 从来就不存在于 C++
或者 C ）。<br/>
下面我分别说一下 C 和 C++ 标准中对 main 函数的定义。</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><FONT FACE="宋体">★“The C programming
Language（《C 程序设计语言》）用的就是 main( )。”---
这是因为第一版的C语言只有一种类型，那就是int，没有char，没有long，没有float，…………既然只有一种类型，那么就可以不写，后来的改进版为了兼容以前的代码于是规定：<U>不明确标明返回值的，默认返回值为int，也就是说
main()等同于int main()，而不是等同于void
main()。</U>在C99中，标准要求编译器至少给 main()
这种用法来个警告。</FONT></FONT></P>
<P><FONT FACE="宋体"><br/>
★一般来讲在C里可以写"main()"，这是因为<U>C把int当作默认类型</U>，凡是没给类型的都当作int。如果你在C里声明一个变量，比如“i”，然后没给类型说明符，那么编译器会把它当int类型。</FONT></P>
<P><FONT FACE="宋体"><br/>
★C++就不这么干了，尤其是<U>标准的C++，就不把int当作默认类型</U>，所以写main函数的时候，你<U>要写明是int类型</U>。</FONT></P>
<P><FONT FACE="宋体"><br/>
★另外一点值得一提的是main后面的这个括号“()”，他<U>在C++里面表示不接受任何参数，而在C里面则表示接受任何参数</U>。<U>在C里，不接受任何参数，一般指明void。</U>所以，在C里，main函数的声明，可以是“int
main(void)”。<br/></FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><STRONG>1. C</STRONG><br/>
在 C89 中，main( ) 是可以接受的。Brian W. Kernighan 和 Dennis M.
Ritchie 的经典巨著 The C programming Language 2e（《C
程序设计语言第二版》）用的就是 main( )。不过在最新的 C99
标准中，只有以下两种定义方式是正确的：<br/>
<FONT COLOR="#FF0000">int main( void )<br/>
int main( int argc, char *argv[] )</FONT><br/>
（参考资料：ISO/IEC 9899:1999 (E) Programming languages — C
5.1.2.2.1 Program startup）<br/>
当然，我们也可以做一点小小的改动。例如：char *argv[] 可以写成 char
**argv；argv 和 argc 可以改成别的变量名（如 intval 和
charval），不过一定要符合变量的命名规则。<br/>
如果不需要从命令行中获取参数，请用int main(void) ；否则请用int
main( int argc, char *argv[] ) 。<br/>
main 函数的返回值类型必须是 int
，这样返回值才能传递给程序的激活者（如操作系统）。<br/>
如果 main 函数的最后没有写 return 语句的话，C99
规定编译器要自动在生成的目标文件中（如 exe 文件）加入return 0;
，表示程序正常退出。不过，我还是建议你最好在main函数的最后加上return
语句，虽然没有这个必要，但这是一个好的习惯。注意，vc6不会在目标文件中加入
return 0; ，大概是因为 vc6 是 98
年的产品，所以才不支持这个特性。现在明白我为什么建议你最好加上
return 语句了吧！不 过，gcc3.2（Linux 下的 C
编译器）会在生成的目标文件中加入 return 0; 。</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><STRONG>2. C++</STRONG><br/>
C++98 中定义了如下两种 main 函数的定义方式：<br/>
<FONT COLOR="#FF0000">int main( )<br/>
int main( int argc, char *argv[] )<br/></FONT>（参考资料：ISO/IEC
14882(1998-9-01)Programming languages — C++ 3.6 Start and
termination）<br/>
int main( ) 等同于 C99 中的 int main( void ) ；int main( int argc,
char *argv[] ) 的用法也和 C99 中定义的一样。同样， main
函数的返回值类型也必须是int。如果main函数的末尾没写return语句，C++98
规定编译器要自动在生成的目标文件中加入 return 0; 。同样，vc6
也不支持这个特性，但是 g++3.2（Linux 下的 C++
编译器）支持。</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><STRONG>3. 关于 void main</STRONG><br/>
<U>在 C 和 C++ 中，不接收任何参数也不返回任何信息的函数原型为“void
foo(void);”。可能正是因为这个，所以很多人都误认为如果不需要程序返回值时可以把main函数定义成void
main(void) 。</U><FONT COLOR="#FF0000">然而这是错误的！main
函数的返回值应该定义为 int 类型，C 和 C++
标准中都是这样规定的。</FONT>虽然在一些编译器中，void main
可以通过编译（如 vc6），但并非所有编译器都支持 void main
，因为标准中从来没有定义过 void main 。g++3.2 中如果 main
函数的返回值不是 int 类型，就根本通 不过编译。而 gcc3.2
则会发出警告。所以，如果你想你的程序拥有很好的可移植性，请一定要用
int main 。</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><STRONG>4. 返回值的作用<br/></STRONG>main
函数的返回值用于说明程序的退出状态。如果返回
0，则代表程序正常退出，否则代表程序异常退出。下面我们在 winxp
环境下做一个小实验。首先编译下面的程序：<br/>
int main( void )<br/>
{<br/>
return 0;<br/>
}<br/>
然后打开附件里的“命令提示符”，在命令行里运行刚才编译好的可执行文件，然后输入“echo
%ERRORLEVEL%”，回车，就可以看到程序的返回 值为 0
。假设刚才编译好的文件是 a.exe ，如果输入“a &amp;&amp;
dir”，则会列出当前目录下的文件夹和文件。但是如果改成 “return
-1”，或者别的非 0 值，重新编译后输入“a &amp;&amp; dir”，则 dir
不会执行。因为 &amp;&amp; 的含义是：如果 &amp;&amp;
前面的程序正常退出，则继续执行 &amp;&amp;
后面的程序，否则不执行。也就是说，利用程序的返回值，我们可以控制要不要执行下一个程序。这就是
int main 的好处。如果你有兴趣，也可以把 main 函数的返回值类型改成非
int 类型（如 float），重新编译后执行“a &amp;&amp;
dir”，看看会出现什么情况，想想为什么会出现那样的情况。顺便提一下，如果输入
a || dir 的话，则表示如果 a 异常退出，则执行 dir 。</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><STRONG>5. 那么 int
main(intargc,char*argv[],char*envp[])呢？</STRONG><br/>
这当然也不是标准 C 里面定义的东西！char*envp[]
是某些编译器提供的扩展功能，用于获取系统的环境变量。因为不是标准，所以并非所有编译器都支持，故而移植性差，不推荐使用。<br/>

到了这里,你应该了解为什么主函数定义为
int返回类型,而且函数体里面有return 0;这个语句了吧.<br/>
下面具体说说我对return的应用的理解。<br/>
只要一个函数的返回值是数字型的,那么就可以返回0(即return
0),其实你返回多少都没问题。一般情况下，C++做出来的函数都要求返回一个值，当函数执行正常，且达到了一般情况下的目的，那么就返回0表示正确的调用了该函数，这个0就是返回给主调函数以通知没有出错的；如果函数调用中出错，或者没有按照一般情况执行，那么就返回1，以告知主调函数采取响应策略；如果你在某个函数所在类的定义所在的头文件中定义了一组状态值（一般都是负整数），那么函数就可以返回不同的值以告之主调函数具体发生了什么异常或错误，这种情况一般用于函数功能独立性较差的的情况。所以一般不鼓励把函数返回类型定义为void，至少返回应该是int，而在函数的最后加上return
0.语句：<br/>
int func(参数列表)<br/>
{<br/>
……<br/>
……<br/>
……<br/>
Return 0;<br/>
}<br/>
在函数中，如果碰到return
语句，那么程序就会返回调用该函数的下一条语句执行，也就是说跳出函数的执行，回到原来的地方继续执行下去。但是如果是在主函数中碰到return语句，那么整个程序就会停止，退出程序的执行。<br/>

如果你定义一个函数有返回类型，可以想下面那样调用：<br/>
int func()<br/>
{<br/>
int value;<br/>
……<br/>
……<br/>
……<br/>
return value;<br/>
}<br/>
int main()<br/>
{<br/>
int intvalue;<br/>
intvalue=func();<br/>
……<br/>
……<br/>
return 0;<br/>
}</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体">return语句后面具体是什么内容，这就要具体情况具体分析了：<br/>

（1） 在返回类型是char的函数中，return后应该是char类型的值；<br/>
（2）在返回类型是int的函数中，如果是要停止函数的调用，最好应该为0；其他的按照你的目的而定，只要是int
类型就行了<br/>
（3）在返回类型是结构类型的函数中，return后应该是结构的一个实例对象。<br/>

总之，函数定义为什么样的返回类型，该函数中return后就应该是相应类型的值。</FONT></P>
</DIV>
]]></description>
            <author>剑在上海</author>
            <category>技术资料</category>
            <comments>http://blog.sina.com.cn/s/blog_55e15433010009sk.html#comment</comments>
            <pubDate>Tue, 03 Jul 2007 00:49:31 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_55e15433010009sk.html</guid>
        </item>
        <item>
            <title>值类型new的背后</title>
            <link>http://blog.sina.com.cn/s/blog_55e15433010009bz.html</link>
            <description><![CDATA[<DIV><FONT FACE="宋体">大家会经常用对值类型进行new操作,如<br/>
给int类型赋默认值 int i=new int();<br/>
或者建立struct对象并调用默认构造函数 mystruct ms=new
mystruct();<br/></FONT>
<P>&nbsp;</P>
<P><FONT FACE="宋体">那问题来了，<FONT COLOR="#FF0000">值类型的new
与 引用类型的new背后</FONT>有什么区别呢？<br/>
引用类型：myClass mc=new myClass(); <FONT COLOR="#FF0000">//引用类型new的指令实际是newobj instance。<FONT FACE="宋体"><U>功能是分配内存空间,将新实例中的所有字段初始化为0或空引用,再调用构造函数，最后返回空间地址</U></FONT>
(<FONT FACE="宋体">newobj用于分配和初始化对象</FONT>)<br/></FONT>值类型： int
i=new int();&nbsp; <FONT COLOR="#FF0000">//值类型是执行initobj指令。<U>功能是将位于指定地址的对象的所有字段初始化为空引用或适当的基元类型的0
。</U><FONT FACE="宋体"><FONT FACE="宋体">与Newobj不同,<FONT FACE="宋体">构造函数不是由initobj调用</FONT>，而是系统自动调用</FONT></FONT>
(<FONT FACE="宋体">Initobj用于初始化值类型</FONT>)</FONT></FONT></P>
<P><FONT FACE="宋体"><br/>
<FONT COLOR="#FF0000"><U>所以引用类型的new操作和值类型的new操作是不一样的。</U></FONT></FONT></P>
<P><FONT FACE="宋体">例：<br/>
public struct TestStruct<br/>
{<br/>
&nbsp;public int n;<br/>
&nbsp;public string s;<br/>
&nbsp;public StringBuilder sb;<br/>
}<br/>
当他<br/>
TestStruct t = new TestStruct();<br/>
new时的结果是什么？其结果就是调用系统默认构造函数把int类型被初始化为0,对象全部被置为null。</FONT></P>
<P><FONT FACE="宋体"><br/>
<STRONG>结论</STRONG><br/>
<FONT COLOR="#FF0000">值类型的new操作是不执行分配内存操作的，其new操作只执行初始化数据操作,调用构造函数(非initobj调用,是系统自动调用)。</FONT>所以微软关于new关键字的用途的说法是不全面的。因为new还有一种只初始化数据,调用构造函数而不在托管堆分配内存的功能。</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><STRONG>注1<br/></STRONG>MSDN对new关键字用途的说法：<br/>
(1)new运算符<br/>
用于创建对象和调用构造函数。<br/>
(2)new修饰符<br/>
用于向基类成员隐藏继承成员。<br/>
(3)new约束<br/>
用于在泛型声明中约束可能用作类型参数的参数的类型。</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><STRONG>注2<br/></STRONG>System.ValueType本来就是比较怪的一个东西。<br/>

.NET的编译器在处理他的时候是<br/>
(1)把值存在计算堆栈上，这个是值类型的标准操作。<br/>
(2)产生一个装箱操作如果初始化的是一个33这样的整数，那就装箱一个int32同理如果是3.3就是float。<br/>

(3)执行一个stloc从计算堆栈的顶部弹出当前值并将其存储到指定索引处的局部变量列表中。</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体">(参考《C#基础知识》<FONT FACE="宋体">http://blog.sina.com.cn/u/55e15433010006jd</FONT>)<br/>
值类型和引用类型<br/>
●值类型的变量本身包含他们的数据，而引用类型的变量包含的是指向包含数据的内存块的引用或叫句柄。<br/>

●值类型变量存储在堆栈。每个程序在执行时都有自己的堆栈，其他程序不能访问。<br/>

●引用类型存储在堆。引用类型存贮实际数据的引用值的地址。<br/>
●C#中的引用类型有4种（类、代表、数组、接口）<br/>
●所有的值类型均隐式派生自 System.ValueType。<br/>
●从值类型不可能派生出新的类型，值类型之间没有继承关系。不能继承，也不能被别的类型继承。但结构可以实现接口<br/>

●null是引用类型变量的默认值，只能用于引用类型，所以对值类型赋null是错误的。<br/>

●每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。<br/>

举例：int
i;初始化有两种办法：因为int是一种结构，系统提供了一个默认的构造函数i
= new Int();也可以i = 0;<br/>
●每种值类型都有一个默认的初值，可以查看msdn帮助，默认值表。引用类型默认初值是null。</FONT></P>
</DIV>
]]></description>
            <author>剑在上海</author>
            <category>技术资料</category>
            <comments>http://blog.sina.com.cn/s/blog_55e15433010009bz.html#comment</comments>
            <pubDate>Fri, 08 Jun 2007 23:37:44 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_55e15433010009bz.html</guid>
        </item>
        <item>
            <title>人，为神摸要《刺青》</title>
            <link>http://blog.sina.com.cn/s/blog_55e154330100096n.html</link>
            <description><![CDATA[<DIV><FONT FACE="宋体">&nbsp;
看到老姐一篇讲《刺青》的文字（<A HREF="http://blog.sina.com.cn/u/4c5f164b01000ail">http://blog.sina.com.cn/u/4c5f164b01000ail</A>），我忍不住也回一篇。</FONT>
<P><FONT FACE="宋体">&nbsp;
讲实话，看这部片的时候，我在看我的《SMART》，满眼寇语，一屏幕暧昧，什么都么看进去。丞琳开场SOLO的独舞，亦或是我要看此片的最初冲动。<br/>

&nbsp;
丞琳并没有十分妖娆的身段，但在黑夜中狂乱的摇曳，那淡淡的香仿佛从眼前溢出，凝结的空气亦诉说着小绿结不开的情愫。有人会讲丞琳演烂了《刺青》，但我觉得丞琳诠释的小绿很好。我喜欢那在寂静中低低的独吟，更喜欢她那个娃娃，不只是口爱得和小绿穿一样的衣服。“她”总是为每次对白拉开序幕，亦或是推向一个新的高潮。记得小绿给娃娃带上假发，回忆起有关竹子的记忆。亦让我想起，同是LES片的《蝴蝶》中，小叶跟小蝶讲“我希望有一个家，有一个可以跟我在一起的女孩”，而后是那句“一切都是命运，就好象阴谋”，小绿跟竹子的结局正如那句“阴谋”，终究没有走到一起。而看过《蝴蝶》在看《刺青》，总会觉得那些离我们远远的LES，我是说“远远的”，那些有着辞青，有着故事的LES总有刺激到暴的回忆，却没有一个记在象牙塔中回首的结局。而我所识那些依然如NANA般存在的T或者是P，却能很好的甜蜜在一起，是不是一种讽刺呢？算~不想这些^^
倒是丞琳那句“不爽”，让我玩味好久，一个小P也要考虑如何面队她眼前的那些“臭男人”的，哈哈<br/>

&nbsp;
片中小绿的房间很有意思，一半的华丽，一半的朴素。或许是WEBGIRL的需要，但这也从侧面反映了现实的残酷，对于小绿的梦想永远也照不进现实。我依然记得小绿坐在床边哭泣的样子，犹如一半的华丽，一半的妖娆；一半的朴素，一半的幼稚。<br/>

&nbsp;
对于竹子我不想多讲。竹子是个不错的T，梁洛施演的超拽，哈~但不喜欢那样的，不喜欢眼镜。<br/>

&nbsp;
其实人为什么要刺青？还是自己看片去吧~~~~我讲老姐跟我超像的，哈哈，上图</FONT></P>
<P>&nbsp;</P>
<P><A HREF="http://album.sina.com.cn/pic/55e1543302000vpy" TARGET="_blank"><IMG SRC="http://album.sina.com.cn/pic_3/55e1543302000vpy" BORDER="0"></A><A HREF="http://album.sina.com.cn/pic/55e1543302000vpx" TARGET="_blank"></A></P>
</DIV>
]]></description>
            <author>剑在上海</author>
            <category>信笔涂鸦</category>
            <comments>http://blog.sina.com.cn/s/blog_55e154330100096n.html#comment</comments>
            <pubDate>Fri, 01 Jun 2007 06:05:35 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_55e154330100096n.html</guid>
        </item>
        <item>
            <title>比较C#的静态常量(const)和动态常量(static和readonly)</title>
            <link>http://blog.sina.com.cn/s/blog_55e15433010008qy.html</link>
            <description><![CDATA[<DIV><FONT FACE="宋体">C#拥有两种不同的常量：<U>静态常量(compile-time
constants)</U>和动<U>态常量(runtime
constants)</U>。它们有不同的特性，错误的使用不仅会损失效率，还可能造成错误。相比之下，静态常量在速度上会稍稍快一些，但是灵活性却比动态常量差很多。</FONT>
<P><FONT FACE="宋体">//静态常量(<FONT COLOR="#FF0000">隐式是静态的</FONT>)<br/>
public const int compiletimeConstant = 1;<br/>
//动态常量<br/>
public static readonly runtimeConstant = 1;</FONT></P>
<P><FONT FACE="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<U>静态常量在编译时会将其替换为所对应的值，</U>也就是说下面这2句话通过编译器编译后产生的IL是一样的。</FONT></P>
<P><FONT FACE="宋体">//通过编译后二者会被翻译成相同的中间语言<br/>
int myNum = compiletimeConstant;<br/>
int myNum = 1;</FONT></P>
<P><FONT FACE="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<U>动态常量的值是在运行时获得的。</U>IL中将其标为只读常量，而不是用常量的值代替。</FONT></P>
<P><FONT FACE="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<FONT COLOR="#FF0000">静态常量只能被声明为简单的数据类型(内建的int和浮点型)、枚举或字符串。</FONT>下面的程序段是通不过编译的。你不能用new关键字初始化一个静态常量，即便是对一个值类型来说。</FONT></P>
<P><FONT FACE="宋体">//这样是错误的<br/>
public const DateTime myDateTime = new
DateTime(2006,9,1,0,0,0);<br/>
//这样是可以的<br/>
public static readonly DateTime myDateTime = new
DateTime(2006,9,1,0,0,0);</FONT></P>
<P><FONT FACE="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
只读数据也是常量的一种，它们不能在构造器初始化之后被修改。但是它同静态常量不同，它的值是在运行时才被指派的，因此就会获得更大的灵活性。动态常量可以是任意的数据类型。</FONT></P>
<P><FONT FACE="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
二者最大的差别在于：静态常量在编译时会将其换为对应的值，这就意味着对于不同的程序集来说，当你改变静态常量的时候需要将其重新编译，否则常量的值不会发生变化，可能引发潜在的问题，而动态常量就不会有这种情况。</FONT></P>
<P><FONT FACE="宋体">&nbsp;&nbsp;&nbsp;&nbsp;<FONT COLOR="#FF0000">&nbsp;<FONT FACE="宋体">用const定义的常量(隐式是静态的)，需要像访问静态成员那样去访问const定义的常量，而用对象的成员方式去访问会出编译错误。</FONT>&nbsp;<FONT FACE="宋体">声明的同时要设置常量值。</FONT><br/>
</FONT>&nbsp;&nbsp;&nbsp;&nbsp;
从另一方面来说，如果你的确要声明一些从不改变且处处唯一的常量，例如钩子函数SetWindowsHookEx的idHook参数或序列化时的版本等，就应该使用静态常量。但是用到这样的常量的机会不多。一般来说我们应该使用灵活性更高的动态常量。</FONT></P>
<P><FONT FACE="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<U>静态常量</U>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<U>动态常量</U><br/>
&nbsp;<br/>
<STRONG>内存消耗</STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
无&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
因为要保存常量 有消耗<br/>
&nbsp;<br/>
<STRONG>初始化</STRONG>&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;
不能new，必须在<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
声明同时赋值<br/>
&nbsp;<br/>
<STRONG>何时发挥作用</STRONG>&nbsp;&nbsp;编译时进行替换&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;相当于类中的数据成员<br/>

&nbsp;<br/></FONT></P>
</DIV>
]]></description>
            <author>剑在上海</author>
            <category>技术资料</category>
            <comments>http://blog.sina.com.cn/s/blog_55e15433010008qy.html#comment</comments>
            <pubDate>Wed, 09 May 2007 11:39:41 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_55e15433010008qy.html</guid>
        </item>
        <item>
            <title>有关C#内存结构</title>
            <link>http://blog.sina.com.cn/s/blog_55e15433010008p0.html</link>
            <description><![CDATA[<DIV><STRONG>内存结构:</STRONG></DIV>
<DIV>变量名 [数据区] 地址</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV><U>●值类型</U></DIV>
<DIV>变量名&nbsp;[数据] 地址</DIV>
<DIV><br/>
<U>●引用类型(与指针类似)</U></DIV>
<DIV>变量名&nbsp;[所指向的地址] 地址(本身的地址)</DIV>
<DIV><br/>
=====================<FONT COLOR="#FF0000">我是无敌剑剑分割线</FONT>======================</DIV>
<DIV><STRONG>1.</STRONG>平时的赋值等操作都是在数据区上<br/>
如:<br/>
值类型 int i=0; int s=i; //i把数据(数据区)拷贝给了s</DIV>
<DIV>引用类型 A a1=new A(); A
a2=a1;//a1把所指向的地址(数据区)拷贝给了a2</DIV>
<DIV><br/>
<STRONG>2.</STRONG>函数 值传递时,
值类型,引用类型传的都是数据区的内容(引用类型传的是所指向的地址).</DIV>
<DIV>而 引用传递(ref/out)时,
值类型,引用类型传的都是地址(引用类型传的是本身的地址).</DIV>
]]></description>
            <author>剑在上海</author>
            <category>技术资料</category>
            <comments>http://blog.sina.com.cn/s/blog_55e15433010008p0.html#comment</comments>
            <pubDate>Mon, 07 May 2007 11:06:32 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_55e15433010008p0.html</guid>
        </item>
        <item>
            <title>同一个变量 多次new</title>
            <link>http://blog.sina.com.cn/s/blog_55e15433010008np.html</link>
            <description><![CDATA[<DIV>
<P><FONT FACE="宋体"><FONT FACE="宋体">class a<br/>
&nbsp;{&nbsp;&nbsp;<br/>
&nbsp; int m;<br/>
&nbsp; public a(int i)<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; m=i;<br/>
&nbsp;&nbsp; }<br/>
&nbsp;}<br/>
class test<br/>
&nbsp;{<br/>
&nbsp; static void main()<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; a a1;<br/>
&nbsp;&nbsp;&nbsp; a1=new a(1);
<FONT COLOR="#FF0000">//a1得到a(1)的内存空间地址,a1指向a(1)</FONT><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<br/>

&nbsp;&nbsp;&nbsp; a1=new a(2);
<FONT COLOR="#FF0000">//a1得到a(2)的内存空间地址,a1指向a(2),但原来的a(1)仍然在内存中存在<br/>
</FONT>&nbsp; }</FONT></FONT></P>
<P><FONT FACE="宋体">====================<FONT COLOR="#FF0000">我是无敌剑剑分割线</FONT>==============<br/>
这其实与 a a1=new a(1); a a2=new a(2);的内存消耗并无太大差别<br/>
因为这时在堆中其实存在着两个a类对象，尽管我们只引用了它们中的一个，但是a(1)仍然在内存中驻留。</FONT></P>
<P><FONT FACE="宋体">而a(1)什么时候被销毁，就要看C#的垃圾回收(GC)了<br/>
====================================================</FONT></P>
</DIV>
]]></description>
            <author>剑在上海</author>
            <category>技术资料</category>
            <comments>http://blog.sina.com.cn/s/blog_55e15433010008np.html#comment</comments>
            <pubDate>Sat, 05 May 2007 09:25:04 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_55e15433010008np.html</guid>
        </item>
        <item>
            <title>深入.Net中的String</title>
            <link>http://blog.sina.com.cn/s/blog_55e15433010008n3.html</link>
            <description><![CDATA[<DIV><FONT FACE="宋体"><SPAN LANG="EN-US" XML:LANG="EN-US">String</SPAN><SPAN STYLE="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在任何语言中，都有它的特殊性，在</SPAN><SPAN LANG="EN-US" XML:LANG="EN-US">.NET</SPAN><SPAN STYLE="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中也是如此。<FONT COLOR="#FF0000">它属于基本数据类型，也是基本数据类型中唯一的引用类型。字符串可以声明为常量，但是它却放在了堆中。</FONT>希望通过本文能够使大家对</SPAN><SPAN LANG="EN-US" XML:LANG="EN-US">.NET</SPAN><SPAN STYLE="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</SPAN><SPAN LANG="EN-US" XML:LANG="EN-US">String</SPAN><SPAN STYLE="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有一个深入的了解。</SPAN></FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT FACE="宋体"><STRONG>String是不可改变对象</STRONG><br/>
在.NET中String是不可改变对象，一旦创建了一个String对象并为它赋值，它就不可能再改变，也就是你不可能改变一个字符串的值。看下面这段代码：<br/>

public class Test<br/>
&nbsp;{<br/>
&nbsp; public static void Main(string[] args)<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; string a =
"XX";<br/>
&nbsp;&nbsp;&nbsp;&nbsp;string
b=a; <FONT COLOR="#FF0000">//b引用了a所指向的内存地址</FONT><br/>
&nbsp;&nbsp;&nbsp; string
a="YY"; <FONT COLOR="#FF0000">//a指向了一个新的内存"YY",但原先的"XX"依然在内存中存在,其实就是指向了新的内存空间</FONT><br/>

&nbsp;&nbsp;&nbsp;
Console.WriteLine(a,b);<br/>
&nbsp;&nbsp; }<br/>
&nbsp;}</FONT></DIV>
<P><FONT FACE="宋体">运行的结果：<br/>
YY</FONT></P>
<P><FONT FACE="宋体">XX</FONT></P>
<P><FONT FACE="宋体"><br/>
虽然String是引用类型,但a改变了,b却不会跟着改变<br/>
<FONT COLOR="#FF0000">MSDN说：字符串对象是“不可变的”，即它们一旦创建就无法更改。对字符串进行操作的方法实际上返回的是新的字符串对象。(其实就是指向了新的内存空间)<br/>
</FONT><FONT FACE="宋体">string a=b;语句将会使a
,b指向同一内存位置.如果改变a(即a="YY"),原来的"XX"并不会改变,只是会创建新的字符串对象"YY",a对其引用.<br/>
</FONT><FONT COLOR="#FF0000">这时在堆中其实存在着两个字符串对象，尽管我们只引用了它们中的一个，但是字符串“XX”仍然在内存中驻留。<br/>
</FONT></FONT></P>
<P><FONT FACE="宋体">==================<FONT COLOR="#FF0000">我是剑剑无敌分割线</FONT>======================<br/>
<U>※有关+=,Substring()等操作※</U><br/>
public class TestB<br/>
&nbsp;{<br/>
&nbsp; public static void Main(string[] args)<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; string a =
"AB";<br/>
&nbsp;&nbsp;&nbsp;
Console.WriteLine(a);<br/>
&nbsp;&nbsp;&nbsp; a += "CD";
//a指向了新内存"ABCD",但原来的"AB"依然存在<br/>
&nbsp;&nbsp;&nbsp;
Console.WriteLine(a);<br/>
&nbsp;&nbsp; }<br/>
&nbsp;}</FONT></P>
<P><FONT FACE="宋体">运行的结果：<br/>
AB</FONT></P>
<P><FONT FACE="宋体">CD</FONT></P>
<P><FONT FACE="宋体">创建了一个String对象它的值是"ab"，a指向了它在内存中的地址；<br/>

又创建了一个新的String对象它的值是"ABCD"，a指向了新的内存地址。<br/>

这时在堆中其实存在着两个字符串对象，尽管我们只引用了它们中的一个，但是字符串"AB"仍然在内存中驻留。<br/>

==========================================================</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><STRONG>String是引用类型</STRONG><br/>
前面说过String是引用类型，这就是<FONT COLOR="#FF0000">如果我们创建很多个相同值的字符串对象，它在内存中的指向地址应该是一样的。</FONT>也就是说，当我们创建了字符串对象a，它的值是“1234”，当我们再创建一个值为“1234”的字符串对象b时它不会再去分配一块内存空间，而是直接指向了a在内存中的地址。<U>这样可以确保内存的有效利用</U>。看下面的代码：<br/>

public class Test<br/>
&nbsp;{<br/>
&nbsp; public static void Main(string[] args)<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; string a =
"1234";<br/>
&nbsp;&nbsp;&nbsp;
Console.WriteLine(a);<br/>
&nbsp;&nbsp;&nbsp;
Test.Change(a); <FONT COLOR="#FF0000">//传的是所指向的内存地址,可以修改所指向内存空间中的数据,但String是"不可改变"的,就不能改了<br/>
</FONT>&nbsp;&nbsp;&nbsp;
Console.WriteLine(a);<br/>
&nbsp;&nbsp; }<br/>
&nbsp; public static void Change(string s) <FONT COLOR="#FF0000"><FONT FACE="宋体">//传的是所指向的地址(即数据区的)</FONT><br/></FONT>&nbsp;&nbsp;
{<br/>
&nbsp;&nbsp;&nbsp; s =
"5678";<br/>
<FONT COLOR="#FF0000">//s引用了a所指向的内存地址,但当s =
"5678";时,s指向了新内存"5678",而不是(也不能,string是"不可改变")改变空间中的数据&nbsp;&nbsp;&nbsp;<U>相当于string
s=a; s="5678";</U></FONT><br/>
&nbsp;&nbsp;&nbsp;}<br/>
&nbsp;}</FONT></P>
<P><FONT FACE="宋体">运行结果：<br/>
1234</FONT></P>
<P><FONT FACE="宋体">1234</FONT></P>
<P><FONT FACE="宋体">&nbsp;<br/>
※做一个小改动，注意Change(ref string s)<br/>
public class Test<br/>
&nbsp;{<br/>
&nbsp; public static void Main(string[] args)<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; string a =
"1234";<br/>
&nbsp;&nbsp;&nbsp;
Console.WriteLine(a);<br/>
&nbsp;&nbsp;&nbsp;
Test.Change(ref a);<FONT COLOR="#FF0000">//用了ref<FONT FACE="宋体">(传的是本身的地址)</FONT>,使a换了个内存空间,即指向了新的内存"5678"<br/>
</FONT>&nbsp;&nbsp;&nbsp;
Console.WriteLine(a);<br/>
&nbsp;&nbsp; }<br/>
&nbsp; public static void Change(ref string s)
<FONT COLOR="#FF0000"><FONT FACE="宋体">//传的是本身的地址</FONT><br/></FONT>&nbsp;&nbsp;
{<br/>
&nbsp;&nbsp;&nbsp; s = "5678";
<FONT COLOR="#FF0000">//s引用了a所指向的内存地址,因为有ref<FONT FACE="宋体">(传的是本身的地址)</FONT>,则使s和a都换了个新内存"5678"</FONT>&nbsp;<br/>

&nbsp;&nbsp; }<br/>
&nbsp;}</FONT></P>
<P><FONT FACE="宋体">运行结果：<br/>
1234</FONT></P>
<P><FONT FACE="宋体">5678</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><STRONG>字符串的比较</STRONG></FONT></P>
<P><FONT FACE="宋体">在.NET中，对字符串的比较操作并不仅仅是简单的比较二者的值，=
=操作首先比较两个字符串的引用，如果引用相同，就直接返回True；如果不同再去比较它们的值。所以如果两个值相同的字符串的比较相对于引用相同的字符串的比较要慢，中间多了一步判断引用是否相同。看下面这段代码：<br/>

public class Test<br/>
&nbsp;{<br/>
&nbsp; public static void Main(string[] args)<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; string a =
"1234";<br/>
&nbsp;&nbsp;&nbsp; string b =
"1234";<br/>
&nbsp;&nbsp;&nbsp; string c =
"123";<br/>
&nbsp;&nbsp;&nbsp; c +=
"4";<br/>
&nbsp;&nbsp;&nbsp; int times =
1000000000;<br/>
&nbsp;&nbsp;&nbsp; int
start,end;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>

&nbsp;&nbsp;&nbsp;
/**////测试引用相同所用的实际时间<br/>
&nbsp;&nbsp;&nbsp; start =
Environment.TickCount;<br/>
&nbsp;&nbsp;&nbsp; for(int
i=0;i&lt;times;i++)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
{<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if(a==b){}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp; end =
Environment.TickCount;<br/>
&nbsp;&nbsp;&nbsp;
Console.WriteLine((end-start));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>

&nbsp;&nbsp;&nbsp;
/**////测试引用不同而值相同所用的实际时间<br/>
&nbsp;&nbsp;&nbsp; start =
Environment.TickCount;<br/>
&nbsp;&nbsp;&nbsp; for(int
i=0;i&lt;times;i++)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
{<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if(a==c){}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp; end =
Environment.TickCount;<br/>
&nbsp;&nbsp;&nbsp;
Console.WriteLine((end-start));<br/>
&nbsp;&nbsp; }<br/>
&nbsp;}</FONT></P>
<P><FONT FACE="宋体">执行的结果（运行的结果可能有些不同）：<br/>
1671</FONT></P>
<P><FONT FACE="宋体">4172</FONT></P>
<P><FONT FACE="宋体"><br/>
由此我们看出值相同时的比较用=
=比引用相同时的比较慢了好多。这里仅仅是一个测试，因为做这样的比较并没有任何实际的意义。<br/>

<U>有一点需要明确的是，.NET中==跟Equals()内部机制完全是一样的，==是它的一个重载。</U></FONT></P>
<P><FONT FACE="宋体">public static bool operator ==(string a,
string b)<br/>
&nbsp;{<br/>
&nbsp; return string.Equals(a, b);<br/>
&nbsp;}</FONT></P>
<P><FONT FACE="宋体"><br/>
public static bool Equals(string a, string b)<br/>
&nbsp;{<br/>
&nbsp; if(a == b)<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; return
true;<br/>
&nbsp;&nbsp; }<br/>
&nbsp; if((a != null)&amp;&amp;(b != null))<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; return
a.Equals(b);<br/>
&nbsp;&nbsp; }<br/>
&nbsp; return false;<br/>
&nbsp;}</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><STRONG>字符串驻留</STRONG></FONT></P>
<P><FONT FACE="宋体">看一下这段代码：<br/>
public class Test<br/>
&nbsp;{<br/>
&nbsp; public static void Main(string[] args)<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; string a =
"1234";<br/>
&nbsp;&nbsp;&nbsp; string s =
"123";<br/>
&nbsp;&nbsp;&nbsp; s +=
"4";<br/>
&nbsp;&nbsp;&nbsp; string b =
s;<br/>
&nbsp;&nbsp;&nbsp; string c =
String.Intern(s);//检索系统对指定String的引用。如果s的值已经留用，则返回系统的引用；否则返回对带有s值的字符串的新引用。<br/>

&nbsp;&nbsp;&nbsp;
Console.WriteLine((object)a == (object)b);<br/>
&nbsp;&nbsp;&nbsp;
Console.WriteLine((object)a == (object)c);<br/>
&nbsp;&nbsp;&nbsp;
Console.ReadLine();<br/>
&nbsp;&nbsp; }<br/>
&nbsp;}</FONT></P>
<P><FONT FACE="宋体">执行的结果：<br/>
False</FONT></P>
<P><FONT FACE="宋体">True</FONT></P>
<P><FONT FACE="宋体"><br/>
在这段代码中，比较这两个对象发现它的引用并不是一样的。如果要想是它们的引用相同，可以用Intern()函数来进行字符串的驻留（如果有这样的值存在）。</FONT></P>
<P>&nbsp;</P>
<P><FONT FACE="宋体"><STRONG>StringBuilder对象<br/></STRONG>通过上面的分析可以看出，String类型在做字符串的连接操作时，效率是相当低的，并且由于每做一个连接操作，都会在内存中创建一个新的对象，占用了大量的内存空间。这样就引出StringBuilder对象，StringBuilder对象在做字符串连接操作时是在原来的字符串上进行修改，改善了性能。这一点我们平时使用中也许都知道，连接操作频繁的时候，使用StringBuilder对象。但是这两者之间的差别到底有多大呢？来做一个测试：<br/>

public class Test<br/>
&nbsp;{<br/>
&nbsp; public static void Main(string[] args)<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp; string a =
"";<br/>
&nbsp;&nbsp;&nbsp;
StringBuilder s = new StringBuilder();<br/>
&nbsp;&nbsp;&nbsp; int times =
10000;<br/>
&nbsp;&nbsp;&nbsp; int
start,end;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>

&nbsp;&nbsp;&nbsp;
/**////测试String所用的时间<br/>
&nbsp;&nbsp;&nbsp; start =
Environment.TickCount;<br/>
&nbsp;&nbsp;&nbsp; for(int
i=0;i&lt;times;i++)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
{<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
a += i.ToString();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp; end =
Environment.TickCount;<br/>
&nbsp;&nbsp;&nbsp;
Console.WriteLine((end-start));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>

&nbsp;&nbsp;&nbsp;
/**////测试StringBuilder所用的时间<br/>
&nbsp;&nbsp;&nbsp; start =
Environment.TickCount;<br/>
&nbsp;&nbsp;&nbsp; for(int
i=0;i&lt;times;i++)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
{<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
s.Append(i.ToString());<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp; end =
Environment.TickCount;<br/>
&nbsp;&nbsp;&nbsp;
Console.WriteLine((end-start));<br/>
&nbsp;&nbsp; }<br/>
&nbsp;}</FONT></P>
<P><FONT FACE="宋体">运行结果：<br/>
884</FONT></P>
<P><FONT FACE="宋体">0</FONT></P>
<P><FONT FACE="宋体"><br/>
通过上面的分析，可以看出用String来做字符串的连接时效率非常低，但并不是所任何情况下都要用StringBuilder，<U>当我们连接很少的字符串时可以用String，但当做大量的或频繁的字符串连接操作时，就一定要用StringBuilder。</U></FONT></P>
]]></description>
            <author>剑在上海</author>
            <category>技术资料</category>
            <comments>http://blog.sina.com.cn/s/blog_55e15433010008n3.html#comment</comments>
            <pubDate>Fri, 04 May 2007 04:03:28 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_55e15433010008n3.html</guid>
        </item>
        <item>
            <title>xmldom规范(英文)</title>
            <link>http://blog.sina.com.cn/s/blog_55e1543301000844.html</link>
            <description><![CDATA[<DIV>
<P>XMLDOM是用来访问和操作XML文档的编程接口规范。</P>
<P>1、简介<br/>
XMLDOM被设计为可用于任何语言和任何操作系统。借助DOM，程序员可以创建XML文档、遍历其结构，增、改、删其元素。DOM将整个XML文档视作一棵树，文档级的元素是树的根。</P>
<P><FONT FACE="Courier New">2、MS的XML解析，IE5.0以上。<br/>
是一个COM组件，至少包含下列对象：<br/>
<FONT COLOR="#FF0000">(1)Micosoft.XMLDOM<br/></FONT>●url&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="宋体">传回最近一次加载成功文件的URL，若文件仅存在主存储器中（表示该文件并非由外部档案加载)，则传回null。<br/>
</FONT><FONT FACE="宋体">●readyState&nbsp;&nbsp;返回XML加载的当前状况。<br/>

<FONT FACE="宋体">0-UNINITIALIZED：XML
对象被产生，但没有任何文件被加载。<br/>
1-LOADING：加载程序进行中，但文件尚未开始解析。<br/>
2-LOADED：部分的文件已经加载且进行解析，但对象模型尚未生效。<br/>
3-INTERACTIVE：仅对已加载的部分文件有效，在此情况下，对象模型是有效但只读的。<br/>

4-COMPLETED：文件已完全加载，代表加载成功。<br/></FONT></FONT><br/>

<FONT COLOR="#FF0000">(2)Micosoft.XMLDOM.parseError，有如下属性：<br/></FONT></FONT><FONT FACE="Courier New"><STRONG>Property</STRONG>&nbsp;&nbsp;&nbsp;&nbsp;
<STRONG>Description</STRONG><br/>
●errorCode&nbsp;&nbsp;&nbsp;
Returns a long integer error code<br/>
●reason&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns a string explaining the reason for the error<br/>
●line&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns a long integer representing the line number for the
error<br/>
●linePos&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns a long integer representing the line position for the
error<br/>
●srcText&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns a string containing the line that caused the error<br/>
●filePos&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns a long integer file position of the error</FONT></P>
<P><FONT FACE="Courier New"><br/>
<FONT COLOR="#FF0000">(3)Microsoft.XMLHTTP，有如下属性：</FONT><br/>
<STRONG>Property</STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<STRONG>Description</STRONG><br/>
●readyState&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<FONT FACE="宋体">返回XMLHTTP请求的当前状态<br/>
<FONT FACE="宋体">0 (未初始化)
对象已建立，但是尚未初始化（尚未调用open方法）<br/>
1 (初始化) 对象已建立，尚未调用send方法<br/>
2 (发送数据) send方法已调用，但是当前的状态及http头未知<br/>
3 (数据传送中)
已接收部分数据，因为响应及http头不全，这时通过responseBody和responseText获取部分数据会出现错误，&nbsp;<br/>

4 (完成)
数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据</FONT></FONT><br/>

●responseBody&nbsp;&nbsp;&nbsp;
Returns the response as an array of unsigned bytes<br/>
●responseStream&nbsp; Returns the response as an
IStream<br/>
●responseText&nbsp;&nbsp;&nbsp;
Returns the response as a string<br/>
●responseXML&nbsp;&nbsp;&nbsp;&nbsp;
Returns the response as an xml document<br/>
●status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns the status code as a number<br/>
●statusText&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns the status as a string</FONT></P>
<P><FONT COLOR="#FF0000">有如下方法：<br/></FONT><STRONG>Property</STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<STRONG>Description</STRONG><br/>
●abort()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Cancel the current http request<br/>
●getAllResponseHeaders()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns the value of the http headers<br/>
●getResponseHeader(headerName)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns the value of one specified http header<br/>
●open(method, url, async, userid, password)&nbsp;
Opens http request, and specifies the information<br/>
●send()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Send the http request to the server<br/>
●setRequestHeader(headerName,headerValue)&nbsp;&nbsp;&nbsp;
Specifies the name of a http header</P>
<P><br/>
<FONT FACE="Courier New"><FONT COLOR="#FF0000">(4)Node的类型</FONT><br/>
<STRONG>Named
Constant</STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<STRONG>nodeTypeString</STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<STRONG>nodeName</STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<STRONG>nodeValue</STRONG><br/>
●1)ELEMENT_NODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
element&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
tagName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
null<br/>
●2)ATTRIBUTE_NODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
attribute&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
value<br/>
●3)TEXT_NODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
text&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#text&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
content of node<br/>
●4)CDATA_SECTION_NODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
cdatasection&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#cdata-section content of&nbsp; node<br/>
●5)ENTITY_REFERENCE_NODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
entityreference&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
entity reference
name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
null<br/>
●6)ENTITY_NODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
entity&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
entity
name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
null<br/>
●7)PROCESSING_INSTRUCTION_NODE processinginstruction
target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
content of node<br/>
●8)COMMENT_NODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
comment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#comment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
comment text<br/>
●9)DOCUMENT_NODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
document&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#document&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
null<br/>
●10)DOCUMENT_TYPE_NODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
documenttype&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
doctype
name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
null<br/>
●11)DOCUMENT_FRAGMENT_NODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
documentfragment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#document
fragment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
null<br/>
●12)NOTATION_NODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
notation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
notation
name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
null</FONT><br/></P>
<P><FONT COLOR="#FF0000">W3C规定的属性：</FONT><br/>
<STRONG>Property</STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<STRONG>Description</STRONG><br/>
●attributes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns a NamedNodeMap containing all attributes for this
node<br/>
●childNodes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns a NodeList containing all the child nodes for this
node<br/>
●firstChild&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns the first child node for this node<br/>
●lastChild&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns the last child node for this node<br/>
●nextSibling&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns the next sibling node. Two nodes are siblings if they have
the same parent node<br/>
●nodeName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns the nodeName, depending on the type<br/>
●nodeType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns the nodeType as a number<br/>
●nodeValue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns, or sets, the value of this node, depending on the
type<br/>
●ownerDocument&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns the root node of the document<br/>
●parentNode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns the parent node for this node<br/>
●previousSibling&nbsp;&nbsp;&nbsp;&nbsp;
Returns the previous sibling node. Two nodes are siblings if they
have the same parent node</P>
<P>
●xml&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回该节点及其所有子节点<br/>

<FONT COLOR="#FF0000">W3C规定的方法：</FONT><br/>
<STRONG>Method</STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<STRONG>Description</STRONG><br/>
●load("XML文件路径")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
装载XML文件<br/>
●loadXML("XML片段")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;装载XML片段<br/>

●save("保存路径")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;保存XML文件</P>
<P>
●appendChild(newChild)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Appends the node newChild at the end of the child nodes for this
node<br/>
●cloneNode(boolean)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns an exact clone of this node. If the boolean value is set to
true, the cloned node contains all the child nodes as well<br/>
●hasChildNodes()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns true if this node has any child nodes<br/>
●insertBefore(newNode,refNode)&nbsp;&nbsp;
Inserts a new node, newNode, before the existing node,
refNode<br/>
●removeChild(nodeName)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Removes the specified node, nodeName<br/>
●replaceChild(newNode,oldNode)&nbsp;&nbsp;
Replaces the oldNode, with the newNode</P>
<P><FONT FACE="宋体">●setAttribute("属性名","属性值")
设置属性<br/>
●setAttributeNode(属性节点对象)&nbsp; 同上<br/>
●getAttribute("属性名")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
得到该属性的值<br/>
●getAttributeNode("属性名")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
得到属性节点<br/>
●removeAttribute("属性名")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
删除属性<br/>
●removeAttributeNode(属性节点对象)同上<br/>
●createAttribute("属性名")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
创建属性节点,例<FONT FACE="宋体">var
a＝xmldom.createAttribute("id");a.value="111";</FONT><br/>
●createCDATASection("CDATA内容") 创建CDATA节点<br/>
●createComment("注释内容")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
创建注释节点<br/>
●createElement("元素名")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
创建元素节点<br/>
●createNode(类型编号,"节点名","空间命名")&nbsp;
创建节点<br/>
●createProcessingInstruction("指令名","属性1='内容'")
创建指令节点,例<FONT FACE="宋体">xmldom.createProcessingInstruction("xml","version='1.0'
encoding='gb2312'");</FONT><br/>
●createTextNode("文本内容")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
创建文本节点</FONT><br/></P>
<P>&nbsp;</P>
<P><FONT COLOR="#FF0000">(5)NodeList的W3C规定的属性和方法。<br/></FONT><STRONG>Property</STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<STRONG>Description</STRONG><br/>
●length&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns the number of nodes in a nodeList</P>
<P>
<STRONG>Method&nbsp;</STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<STRONG>Description</STRONG><br/>
●item&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Returns a specific node in the nodeList</P>
</DIV>
]]></description>
            <author>剑在上海</author>
            <category>技术资料</category>
            <comments>http://blog.sina.com.cn/s/blog_55e1543301000844.html#comment</comments>
            <pubDate>Fri, 06 Apr 2007 12:48:25 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_55e1543301000844.html</guid>
        </item>
        <item>
            <title>AJAX例子(发送XML实现)原创</title>
            <link>http://blog.sina.com.cn/s/blog_55e1543301000842.html</link>
            <description><![CDATA[<P><FONT FACE="宋体"><STRONG><FONT STYLE="FONT-SIZE: 32px" COLOR="#FF0000">原创例子</FONT></STRONG><br/>
客户端传入参数,发送数据=》服务器端处理，生成XML输出=》客户端获得数据，通过XML生成HTML</FONT></P>
<P><FONT FACE="宋体">输出 大于所输入id值的记录(表格)</FONT></P>
<P><FONT FACE="宋体"><STRONG><br/>
PS.</STRONG>本地测试时,可把URL设置成符合发送格式的XML文件(把传入参数注释掉,xmlhttp.status==0)</FONT></P>
<P><FONT FACE="宋体"><br/>
<STRONG>Html页面<br/></STRONG>&lt;script
langue="javascript"&gt;<br/>
function testcool(obj) <FONT COLOR="#FF0000">//当按下按纽...从这</FONT><br/>
{<br/>
&nbsp;var myurl = "xxxx.aspx"; //设置URL<br/>
&nbsp;var myparval = "id="+obj.value;
//设置输入参数<br/>
&nbsp;var myyibu = true; //设置是否异步<br/>
&nbsp;document.getElementById("out").innerHTML="装载中,你等等会死呀-
-.....";<br/>
&nbsp;AjaxCool("GET",myurl,myyibu,myparval);
//AjaxCool(GET/POST方式,URL路径,是否异步,参数),这里用GET异步小试牛刀<br/>

}</FONT></P>
<P><FONT FACE="宋体"><br/>
function PError(msg) <FONT COLOR="#FF0000">//错误处理</FONT><br/>
{<br/>
&nbsp;document.getElementById("out").innerHTML =
msg;<br/>
}</FONT></P>
<P><FONT FACE="宋体"><br/>
function AjaxCool(way,url,yibu,parval) <FONT COLOR="#FF0000">//XMLHTTP部分,发送数据</FONT><br/>
{<br/>
&nbsp;var xmlhttp;&nbsp;
//创建XMLHTTP对象<br/>
&nbsp;if(window.ActiveXObject) //IE<br/>
&nbsp; {<br/>
&nbsp;&nbsp; try<br/>
&nbsp;&nbsp;&nbsp; {xmlhttp =
new ActiveXObject("Msxml2.XMLHTTP");}<br/>
&nbsp;&nbsp; catch(e)<br/>
&nbsp;&nbsp;&nbsp; {xmlhttp =
new ActiveXObject("Microsoft.XMLHTTP");}<br/>
&nbsp; }<br/>
&nbsp;else if(window.XMLHttpRequest) //非IE<br/>
&nbsp; {xmlhttp = new XMLHttpRequest();}</FONT></P>
<P><FONT FACE="宋体">xmlhttp.onreadystatechange = function()
//状态码改变时调用<br/>
&nbsp;{<br/>
&nbsp; if(xmlhttp.readyState==4) //数据接收完成<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp;
if(xmlhttp.status==200)
//HTTP请求成功(若xmlhttp.status为0,即没有在服务器下,本地测试)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
{MakeHtml(xmlhttp);} //调用MakeHtml函数开始处理XML<br/>
&nbsp;&nbsp;&nbsp; else<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
{PError("出错了"+xmlhttp.status);} //向PError函数发送错误信息<br/>
&nbsp;&nbsp; }<br/>
&nbsp; else<br/>
&nbsp;&nbsp;&nbsp;{PError("正在处理数据.....");}<br/>

&nbsp;}</FONT></P>
<P><FONT FACE="宋体">if(way=="GET")
//选择POST或GET方式,要open,send了<br/>
&nbsp;{<br/>
&nbsp; url = url+"?"+parval;&nbsp;
//GET方式,合成URL后面的参数,即"xxxx.aspx"+"?"+"id=1234"<br/>
&nbsp; xmlhttp.open("GET",url,yibu);<br/>
&nbsp; xmlhttp.send(null);<br/>
&nbsp;}<br/>
else<br/>
&nbsp;{<br/>
&nbsp; xmlhttp.open("POST",url,yibu);<br/>
&nbsp;
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
//POST必须<br/>
&nbsp; xmlhttp.send(parval);
//POST发参数,即send("id=1234")<br/>
&nbsp;}<br/>
}</FONT></P>
<P><FONT FACE="宋体"><br/>
function MakeHtml(xmlhttp) <FONT COLOR="#FF0000">//XMLDOM部分,处理数据</FONT><br/>
{<br/>
&nbsp;var shtml = "&lt;table&gt;";<br/>
&nbsp;var xmldom = new
ActiveXObject("Microsoft.XMLDOM"); //建立XMLDOM对象<br/>
&nbsp;xmldom.async = true; //异步获取数据<br/>
&nbsp;xmldom.loadXML(xmlhttp.responseText);&nbsp;
//装入XML<br/>
&nbsp;if(xmldom.parseError.errorCode==0)<br/>
&nbsp; {<br/>
&nbsp;&nbsp; var node =
xmldom.selectNodes("b/user");
//或xml.documentElement.selectNodes("user")<br/>
&nbsp;&nbsp;
if((node!=null)&amp;&amp;(node.length!=0))<br/>
&nbsp;&nbsp;&nbsp;
{&nbsp;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
for(var i=0;i&lt;node.length;i++)&nbsp;
//生成HTML<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
shtml += "&lt;tr&gt;";<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
shtml +=
"&lt;td&gt;"+node[i].childNodes[0].text+"&lt;/td&gt;&lt;td&gt;"+node[i].childNodes[1].text+"&lt;/td&gt;";&nbsp;
//是childNodes[0].text 和C#(ChildNodes[0].InnerText)不一样<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
shtml += "&lt;/tr&gt;";<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
shtml +="&lt;/table&gt;";<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
document.getElementById("out").innerHTML = shtml;&nbsp;
//输出<br/>
&nbsp;&nbsp;&nbsp; }<br/>
&nbsp; }<br/>
}</FONT></P>
<P><FONT FACE="宋体">&lt;/script&gt;<br/>
&lt;input id="cid" type=text&gt;<br/>
&lt;input id="xx" type=submit onClick=testcool(this)
value="按我"&gt;<br/>
&lt;div id="out"&gt;&lt;/div&gt;</FONT></P>
<P><FONT FACE="宋体"><br/>
<STRONG>Aspx页面</STRONG><br/>
void Page_Load(Object s,EventArgs e)<br/>
{String keyID = Request.QueryString["id"]; //得到GET来的参数<br/>
&nbsp;String sxml = "&lt;?xml
version='1.0'?&gt;&lt;b&gt;&lt;user&gt;";<br/>
&nbsp;SqlConnection conn = new
SqlConnection(.......);<br/>
&nbsp;SqlCommand cmd = new SqlCommand("Select * from
table where id &gt;"+keyID,conn);<br/>
&nbsp;conn.Open();<br/>
&nbsp;SqlDataReader dr = cmd.ExecuteReader();<br/>
&nbsp;while(dr.Read())<br/>
&nbsp;{<br/>
&nbsp; sxml +=
"&lt;name&gt;"+dr["name"]+"&lt;/name&gt;&lt;sex&gt;"+dr["sex"]+"&lt;/sex&gt;";&nbsp;
//生成XML<br/>
&nbsp;}<br/>
&nbsp;sxml += "&lt;/user&gt;&lt;/b&gt;";<br/>
&nbsp;dr.Close();<br/>
&nbsp;conn.Close();<br/>
&nbsp;<FONT COLOR="#FF0000">Response.ContentType =
"text/xml";
//输出格式为XML，发送XML时必须<br/></FONT>&nbsp;Response.Write(sxml);
//输出XML<br/>
}</FONT></P>
<P><FONT FACE="宋体"><br/>
<STRONG>发送的XML结构</STRONG><br/>
&lt;?xml version="1.0"?&gt;<br/>
&lt;b&gt;<br/>
&nbsp;&lt;user&gt;<br/>
&nbsp;&nbsp;
&lt;name&gt;XXX&lt;/name&gt;<br/>
&nbsp;&nbsp;
&lt;sex&gt;xxx&lt;/sex&gt;<br/>
&nbsp;&lt;/user&gt;<br/>
&nbsp;&lt;user&gt;<br/>
&nbsp; &lt;name&gt;YYY&lt;/name&gt;<br/>
&nbsp;&nbsp; ………………<br/>
&nbsp;&nbsp; ………………<br/>
&nbsp;&nbsp; ………………<br/>
&lt;/b&gt;</FONT></P>
<P>&nbsp;</P>
]]></description>
            <author>剑在上海</author>
            <category>技术资料</category>
            <comments>http://blog.sina.com.cn/s/blog_55e1543301000842.html#comment</comments>
            <pubDate>Fri, 06 Apr 2007 10:50:48 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_55e1543301000842.html</guid>
        </item>
        <item>
            <title>.net反射+XML设计</title>
            <link>http://blog.sina.com.cn/s/blog_55e15433010007tz.html</link>
            <description><![CDATA[<P><FONT FACE="Courier New"><FONT FACE="Courier New" COLOR="#FF0000">原文：<A HREF="http://www.cnblogs.com/cj723/archive/2007/03/22/683951.html">http://www.cnblogs.com/cj723/archive/2007/03/22/683951.html</A></FONT></FONT></P>
<P><FONT FACE="Courier New">//原来我们把一个类实例化是这样的<br/>
Animal animal=new Cat();&nbsp;
//声明一个父类，名称叫animal，然后将animal实例化成子类
Cat对象</FONT></P>
<P><FONT FACE="Courier New">//我们现在用反射的办法得到这个实例<br/>
using System.Reflection;//先引用System.Reflection<br/>
//假设当前程序集是AnimalSystem，名称空间也是AnimalSystem<br/>
Animal animal =
(Animal)Assembly.Load("AnimalSystem").CreateInstance("AnimalSystem.Cat");</FONT></P>
<P><FONT FACE="Courier New">其中关键是<br/>
<FONT COLOR="#FF0000">Assembly.Load("程序集名称").CreateInstance("名称空间.类名称")</FONT></FONT></P>
<P>
<U>我们可以在实例化的时候，再给计算机一个类的名称字符串，来让计算机知道应该实例化哪一个类。因为这里是字符串，可以用变量来处理，也就可以根据需要更换。</U></P>
<P><FONT FACE="Courier New"><FONT FACE="Courier New">依赖倒转原则，原话解释是抽象不应该依赖细节，细节应该依赖于抽象<br/>

说白了，就是要针对接口编程，不要对实现编程</FONT><br/>
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br/>
例子：<br/>
通过读XML的配置文件，来生成下拉列表框，然后再根据用户的选择，通过反射实时的实例化出相应的对象，最终利用策略模式计算最终的结果。<br/>

<STRONG>主要代码：</STRONG><br/>
using System.Reflection;<br/>
　</FONT><FONT FACE="Courier New">DataSet
ds;//用于存放配置文件信息<br/>
&nbsp; double total = 0.0d;//用于总计</FONT></P>
<P><FONT FACE="Courier New">&nbsp; private void
Form1_Load(object sender, EventArgs e)<br/>
&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp;
//读配置文件<br/>
&nbsp;&nbsp;&nbsp; ds = new
DataSet();<br/>
&nbsp;&nbsp;&nbsp;
ds.ReadXml(Application.StartupPath + "\\CashAcceptType.xml");<br/>
&nbsp;&nbsp;&nbsp;
//将读取到的记录绑定到下拉列表框中<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>

&nbsp;&nbsp;&nbsp;&nbsp;
foreach (DataRowView dr in ds.Tables[0].DefaultView)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
//DataRowView表示DataRow的自定义视图。&nbsp;<FONT FACE="Courier New">即DataView中的行。</FONT><br/>
&nbsp;&nbsp;&nbsp;&nbsp;
//DataTable.DefaultView获取DataTable的默认视图。
DefaultView属性返回DataTable的DataView。<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
cbxType.Items.Add(dr["name"].ToString());<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
cbxType.SelectedIndex = 0;<br/>
&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT FACE="Courier New">&nbsp;&nbsp;
private void btnOk_Click(object sender, EventArgs e)<br/>
&nbsp;&nbsp;&nbsp; {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
CashContext cc = new CashContext();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
//根据用户的选项，查询用户选择项的相关行<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
DataRow dr = ((DataRow[])ds.Tables[0].Select("name='" +
cbxType.SelectedItem.ToString()+"'"))[0];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
//声明一个参数的对象数组<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
object[] args =null;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
//若有参数，则将其分割成字符串数组，用于实例化时所用的参数<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
if (dr["para"].ToString() != "")<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{args = dr["para"].ToString().Split(',');}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//通过反射实例化出相应的算法对象<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
cc.setBehavior((CashSuper)Assembly.Load("商场管理软件").CreateInstance("商场管理软件."
+ dr["class"].ToString(), false, BindingFlags.Default, null, args,
null, null));&nbsp; <FONT FACE="Courier New">//CashRebate和CashReturn在构造函数中都是有参数的，要用到CreateInstance()方法的重载方法</FONT><br/>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>

&nbsp;&nbsp;&nbsp;&nbsp;
//数据计算<br/>
　　　double totalPrices = 0d;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
totalPrices = cc.GetResult(Convert.ToDouble(txtPrice.Text) *
Convert.ToDouble(txtNum.Text));<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
total = total + totalPrices;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
lbxList.Items.Add("单价：" + txtPrice.Text + " 数量：" +
txtNum.Text + " "+cbxType.SelectedItem+ " 合计：" +
totalPrices.ToString());<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
lblResult.Text = total.ToString();<br/>
&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT FACE="Courier New"><STRONG>配置文件 CashAcceptType.xml
的代码<br/></STRONG>&lt;?xml version="1.0" encoding="utf-8"
?&gt;<br/>
&nbsp;&lt;CashAcceptType&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
&lt;type&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;name&gt;正常收费&lt;/name&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;class&gt;CashNormal&lt;/class&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;para&gt;&lt;/para&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
&lt;/type&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
&lt;type&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;name&gt;满300返100&lt;/name&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;class&gt;CashReturn&lt;/class&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;para&gt;300,100&lt;/para&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
&lt;/type&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
&lt;type&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;name&gt;满200返50&lt;/name&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;class&gt;CashReturn&lt;/class&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;para&gt;200,50&lt;/para&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
&lt;/type&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
&lt;type&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;name&gt;打8折&lt;/name&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;class&gt;CashRebate&lt;/class&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;para&gt;0.8&lt;/para&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
&lt;/type&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
&lt;type&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;name&gt;打7折&lt;/name&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;class&gt;CashRebate&lt;/class&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;para&gt;0.7&lt;/para&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
&lt;/type&gt;<br/>
&nbsp;&lt;/CashAcceptType&gt;</FONT></P>
<P><FONT FACE="Courier New">无论你的需求是什么，我现在连程序都不动，只需要去改改XML文件就全部摆平。比如你如果觉得现在满300送100太多，要改成送80，我只需要去XML文件里改就行，再比如你希望增加新的算法，比如积分返点，那我先写一个返点的算法类继承CashSuper，再去改一下XML文件，对过去的代码依然不动。总之，现在是真的做到了程序易维护，可扩展</FONT></P>
<P><FONT FACE="Courier New">★ORM的底层设计原理也是这样的,&nbsp;
利用反射，配置XML将对象和数据库表映射。</FONT></P>
]]></description>
            <author>剑在上海</author>
            <category>项目文档</category>
            <comments>http://blog.sina.com.cn/s/blog_55e15433010007tz.html#comment</comments>
            <pubDate>Fri, 23 Mar 2007 10:01:11 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_55e15433010007tz.html</guid>
        </item>
        <item>
            <title>SQL语言的GO和USE</title>
            <link>http://blog.sina.com.cn/s/blog_55e15433010007p3.html</link>
            <description><![CDATA[<DIV>
<P><FONT FACE="Courier New"><FONT FACE="Courier New">SQL脚本是一种用SQL语言写的批处理文件(.sql),SQL脚本通常可以由SQL查询分析器来执行。</FONT></FONT></P>
<P><FONT FACE="Courier New">=====================================================</FONT></P>
</DIV>
<DIV><FONT FACE="Courier New"><FONT FACE="Courier New">GO向 SQL
Server 实用工具发出一批 Transact-SQL
语句结束的信号。</FONT><FONT COLOR="#FF0000">go是把t-sql語句分批次執行。（一步成功了才会执行下一步,即一步一个GO）<br/>
</FONT>&nbsp;&nbsp;&nbsp;<br/>
&nbsp; 语法&nbsp;&nbsp;<br/>
&nbsp; GO&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp;<br/>
&nbsp; 注释&nbsp;&nbsp;<br/>
&nbsp; <FONT COLOR="#FF0000">GO&nbsp;&nbsp;
不是Transact-SQL语句；而是可为cmdsql和osql实用工具及SQL
Server查询分析器识别的命令。&nbsp;&nbsp;<br/>
</FONT>&nbsp;&nbsp;&nbsp;<br/>
&nbsp; SQL
Server实用工具将GO解释为应将当前的Transact-SQL批处理语句发送给SQL
Server的信号。<U>当前批处理语句是自上一GO命令后输入的所有语句，若是第一条GO命令，则是从特殊会话或脚本的开始处到这条GO命令之间的所有语句。</U>&nbsp;&nbsp;&nbsp;<br/>

&nbsp; <FONT COLOR="#FF0000">GO命令和Transact-SQL语句不可在同一行上。</FONT>但在GO命令行中可包含注释。&nbsp;&nbsp;<br/>

&nbsp;&nbsp;&nbsp;<br/>
&nbsp; 用户<FONT COLOR="#FF0000">必须遵照使用批处理(.sql)的规则</FONT>。<br/>
例如，在批处理(.sql)中的第一条语句后执行任何存储过程必须包含EXECUTE关键字。<br/>

再有，<FONT COLOR="#FF0000">局部（用户定义）变量的作用域限制在一个批处理中，不可在GO命令后引用。</FONT>&nbsp;&nbsp;<br/>

&nbsp;&nbsp;&nbsp;<br/>
&nbsp; USE
pubs&nbsp;&nbsp;<br/>
&nbsp; GO&nbsp;&nbsp;<br/>
&nbsp; DECLARE @MyMsg
VARCHAR(50)&nbsp;&nbsp;<br/>
&nbsp; SELECT&nbsp; @MyMsg =
'Hello,World.'&nbsp;&nbsp;<br/>
&nbsp; GO&nbsp;&nbsp; --@MyMsg
is not valid after this GO ends the
batch.&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp;<br/>
&nbsp; --Yields an error because @MyMsg not declared in
this batch.&nbsp;&nbsp;<br/>
&nbsp; PRINT
@MyMsg&nbsp;&nbsp;<br/>
&nbsp; GO&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp;<br/>
&nbsp; SELECT
@@VERSION;&nbsp;&nbsp;<br/>
&nbsp; --Yields an error: Must be EXEC sp_who if not
first statement
in&nbsp;&nbsp;&nbsp;&nbsp;<br/>

&nbsp;
--batch.&nbsp;&nbsp;<br/>
&nbsp; sp_who&nbsp;&nbsp;<br/>
&nbsp; GO&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp;<br/>
&nbsp; SQL
Server应用程序可将多条Transact-SQL语句作为一个批处理发给SQL
Server去执行。在此批处理中的语句编译成一个执行计划。程序员在SQL
Server实用工具中执行特定语句，或生成Transact-SQL语句脚本在SQL
Server实用工具中运行，用GO来标识批处理的结束。&nbsp;&nbsp;<br/>

&nbsp;&nbsp;&nbsp;<br/>
&nbsp; 如果基于DB-Library、ODBC或OLE DB
APIs的应用程序试图执行GO命令时会收到语法错误。SQL
Server实用工具永远不会向服务器发送GO命令。&nbsp;&nbsp;<br/>

&nbsp;&nbsp;&nbsp;<br/>
&nbsp; 权限&nbsp;&nbsp;<br/>
&nbsp; GO&nbsp;&nbsp;
是一个不需权限的实用工具命令。可以由任何用户执行。&nbsp;&nbsp;<br/>

&nbsp;&nbsp;&nbsp;<br/>
&nbsp; 示例&nbsp;&nbsp;<br/>
&nbsp;
下面的示例创建两个批处理。第一个批处理只包含一条USE
pubs语句，用于设置数据库上下文。剩下的语句使用了一个局部变量，因此所有的局部变量声明必须在一个批处理中。这一点可通过在最后一条引用此变量的语句之后才使用GO命令来做到。&nbsp;&nbsp;<br/>

&nbsp;&nbsp;&nbsp;<br/>
&nbsp; USE
pubs&nbsp;&nbsp;<br/>
&nbsp; GO&nbsp;&nbsp;<br/>
&nbsp; DECLARE @NmbrAuthors
int&nbsp;&nbsp;<br/>
&nbsp; SELECT @NmbrAuthors =
COUNT(*)&nbsp;&nbsp;<br/>
&nbsp; FROM
authors&nbsp;&nbsp;<br/>
&nbsp; PRINT 'The number of authors as of'
+&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
CAST(GETDATE()&nbsp;&nbsp;
AS&nbsp;&nbsp; char(20)) + 'is'
+&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
CAST(@NmbrAuthors&nbsp;&nbsp;
AS&nbsp;&nbsp;
char&nbsp;&nbsp;
(10))&nbsp;&nbsp;<br/>
&nbsp;
GO&nbsp;&nbsp;<br/></FONT></DIV>
<DIV>
<P><FONT FACE="Courier New"><FONT FACE="Courier New">=================================================<br/>

USE //改变当前操作数据库</FONT></FONT></P>
<P><FONT FACE="Courier New">用法：<br/>
USE 数据库名</FONT></P>
<P><FONT FACE="Courier New">例：<br/>
CREATE DATABASE XX1 --创建XX1数据库<br/>
………………<br/>
GO<br/>
CREATE DATABASE XX2 --创建XX2数据库<br/>
………………<br/>
GO<br/>
USE XX1 --转到XX1数据库<br/>
GO<br/>
………… --对XX1数据库的操作<br/>
GO<br/>
USE XX2 --转到XX2数据库<br/>
GO<br/>
………… --对XX2数据库的操作<br/>
GO</FONT></P>
<P><FONT FACE="Courier New"><br/>
<FONT COLOR="#FF0000">USE在存储过程中不能直接使用</FONT><br/>
但可以这样用:&nbsp;&nbsp;<br/>
&nbsp; create proc
test&nbsp;&nbsp;<br/>
&nbsp; as&nbsp;&nbsp;<br/>
&nbsp; exec('use pubs select * from
jobs')&nbsp; --或者exec(use pubs) exec sp_adduser
'xxxx'<br/>
&nbsp; go&nbsp;&nbsp;<br/>
<FONT FACE="Courier New"><br/>
--使用Exec(ute)语句配合USE来改变当前数据库，但数据库环境的更改只在Execute语句结束前有效，所</FONT><FONT FACE="Courier New">以必须把后面的语句和Execute放到一起</FONT></FONT></P>
<P>exec test<br/></P>
</DIV>
]]></description>
            <author>剑在上海</author>
            <category>技术资料</category>
            <comments>http://blog.sina.com.cn/s/blog_55e15433010007p3.html#comment</comments>
            <pubDate>Sat, 17 Mar 2007 03:27:26 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_55e15433010007p3.html</guid>
        </item>
        <item>
            <title>JS方法属性参考</title>
            <link>http://blog.sina.com.cn/s/blog_55e15433010007om.html</link>
            <description><![CDATA[<DIV>
<P><FONT FACE="Courier New">document.body.scrollTop&nbsp;
返回和设置当前竖向滚动条的坐标值，须与函数配合,<br/>
document.body.scrollLeft&nbsp;
返回和设置当前横向滚动务的坐标值，须与函数配合，<br/>
window.status=defaultStatus&nbsp;
将状态栏设置默认显示<br/>
Obejct.innerHTML 对象Object标签中的html源代码<br/>
Obejct.outerHTML 对象Object的html源代码（包含标签本身）<br/>
&nbsp;<br/>
Math.MAX_VALUE&nbsp;
JavaScript中数的最大可能值；最大为1.7976931348623157e+308<br/>
Math.MIN_VALUE&nbsp;
JavaScript中比0大的数字的最小可能值；最小为：5e-324<br/>
Math.NaN&nbsp; 非数字的任意值<br/>
Math.NEGATIVE_INFINITY&nbsp;
JavaScript中小于最大负数的任意数字；也就是说，小于-1.7976931348623157e+308的任意数字<br/>

Math.POSITIVE_INFINITY&nbsp;
JavaScript中大于最大正数的任意数字；也就是说，小于1.7976931348623157e+308的任意数字<br/>

Math.E&nbsp;
欧拉常数（E），近似值：2.718281828459045<br/>
Math.PI&nbsp; 常数π，近似值：3.141592653589793<br/>
Math.abs(Number)&nbsp; Number的绝对值<br/>
Math.acos(Number)&nbsp;
Number（必须介于-1和+1之间）的反余弦，返回值的范围在0和π弧度之间<br/>

Math.asin(Number)&nbsp;
Number（必须介于-1和+1之间）的反正弦，返回值的范围在-π/2和π/2弧度之间<br/>

Math.atan(Number)&nbsp;
Number的反正切，返回值的范围在-π/2和π/2弧度之间<br/>
Math.atan2(y, x)&nbsp;
y/x（这里的（x，y）是迪卡尔坐标值）的反正切，返回值的范围在-π/2和π/2弧度之间<br/>

Math.ceil(Number)&nbsp;
大于或等于Number的最小整数<br/>
Math.cos(Number)&nbsp;
Number的余弦，返回值的范围在-1和1之间<br/>
Math.exp(Number)&nbsp; E的Number次幂<br/>
Math.floor(number)&nbsp;
小于或等于Number的最大整数，舍取所有小数<br/>
Math.log(Number)&nbsp;
Number的自然对数（以E为底）<br/>
Math.max(Number1, Number2)&nbsp;
返回Number1,Number2的较大者<br/>
Math.min(Number1, Number2)&nbsp;
返回Number1,Number2的较小者<br/>
Math.pow(Number1, Number2)&nbsp;
返回Number1的Number2次方幂<br/>
Math.random()&nbsp;
随机函数,只能是0到1之间的数,如果要得到其它数,可以为*10,再取整<br/>
Math.round(Number)&nbsp;
最靠近Number的整数（对小数部分四舍五入）<br/>
Math.sin(Number)&nbsp;
Number的正弦，返回值的范围在-1和1之间<br/>
Math.sqrt(Number)&nbsp;
Number（必须大于或等于0）的平方根<br/>
Math.tan(Number)&nbsp; Number（以弧度表示）的正切<br/>
Math.toString(Number)&nbsp;
与Number等价的字符串</FONT></P>
<P><FONT FACE="Courier New">parseInt(String,
Base)&nbsp;
将字符串转换为数字，如果字符串以数字打头，后跟一些文本，则函数只返回字符串开头的整数部分。String：待转换的字符串，Base：可选，String中数字的进制，默认为10进制<br/>

parseFloat(String)&nbsp;
将字符串转换为数字，如果字符串以数字打头，后跟一些文本，则函数只返回字符串开头的数字部分<br/>

&nbsp;<br/>
&nbsp;<br/>
String.anchor(Name)&nbsp; 将String转换为一个&lt;a
name&gt;锚标记，这里的name属性值由Name参数给出，此方法等价于以下语句：&lt;a
name="Name"&gt;String&lt;/a&gt;<br/>
String.big()&nbsp;
和HTML的&lt;big&gt;标记一样，以相同的方式格式化String，此方法等价于以下语句：&lt;big&gt;String&lt;/big&gt;<br/>

String.blink()&nbsp;
和HTML的&lt;blink&gt;标记一样，等价于以下语句：&lt;blink&gt;String&lt;/blink&gt;<br/>

String.bold()&nbsp;
和HTML的&lt;b&gt;标记一样，等价于一下语句：&lt;b&gt;String&lt;/b&gt;<br/>

String.fixed()&nbsp;
和HTML的&lt;tt&gt;标记一样，等价于一下语句：&lt;tt&gt;String&lt;/tt&gt;<br/>

String.fontcolor(Color)&nbsp; 和HTML的&lt;font
color&gt;标记一样，等价于一下语句：&lt;font
color="Color"&gt;String&lt;/font&gt;<br/>
String.fontsize(Size)&nbsp; 和HTML的&lt;font
size&gt;标记一样，等价于一下语句：&lt;font
size="Size"&gt;String&lt;/font&gt;<br/>
String.italics()&nbsp;
和HTML的&lt;i&gt;标记一样，等价于一下语句：&lt;i&gt;String&lt;/i&gt;<br/>

String.link(URL)&nbsp; 将String转换成一个&lt;a
href&gt;链接标记，等价于一下语句：&lt;a
href="URL"&gt;String&lt;/a&gt;<br/>
String.small()&nbsp;
和HTML的&lt;small&gt;标记一样，等价于一下语句：&lt;small&gt;String&lt;/small&gt;<br/>

String.strike()&nbsp;
和HTML的&lt;strike&gt;标记一样，等价于一下语句：&lt;strike&gt;String&lt;/strike&gt;<br/>

String.sub()&nbsp;
和HTML的&lt;sub&gt;标记一样，等价于一下语句：&lt;sub&gt;String&lt;/sub&gt;<br/>

String.sup()&nbsp;
和HTML的&lt;sup&gt;标记一样，等价于一下语句：&lt;sup&gt;String&lt;/sup&gt;<br/>

String.charAt(Index)&nbsp;
返回String中索引位置为Index的字符<br/>
String.charCodeAt(Index)&nbsp;
返回String中索引位置为Index的字符代码<br/>
String.indexOf(Substring, start)&nbsp;
Substring在String中的第一个位置，没有返回-1<br/>
String.lastIndexOf(Substring, start)&nbsp;
Substring在String中的最后一个位置，没有返回-1<br/>
String.slice(Start, End)&nbsp;
返回String中起始索引位置为Start，结束索引位置为End之前的子字符串<br/>

String.split(Separator, Limit)&nbsp;
返回一个数组，这个数组的每一项都是String的子字符串，并且这些子字符串被Separator分离<br/>

String.substr(Start, Len)&nbsp;
返回String中起始索引位置为Start，长度为Len的子字符串<br/>
String.substring(Start, End)&nbsp;
返回String中起始索引位置为Start，结束索引位置为End的子字符串<br/>
String.concat(String2)&nbsp;
将String2连接到String的尾部。换句话说，此方法等价于：String +
String2<br/>
String.fromCharCode(Code1, Code2, etc)&nbsp;
建立一个字符串，该字符串由与代码Code1、Code2等相应得字符组成<br/>
String.match(Regular_Expression)&nbsp;
从String中搜索出匹配Regular_Expression的子字符串，返回一个包含所有匹配值的数组<br/>

String.replace(Regular_Expression, Replace_String)
从String中搜索出所有匹配Regular_Expression的子字符串，并使用Replace_String取代这些子字符串<br/>

String.search(Regular_Expression)&nbsp;
从String中搜索出所有匹配Regular_Expression的子字符串，但只返回第一个子字符串实例的索引<br/>

String.toLowerCase()&nbsp; 将String全部转换为小写<br/>
String.toUpperCase()&nbsp; 将String全部转换为大写<br/>
&nbsp;<br/>
event.clientX 返回最后一次点击鼠标X坐标值；<br/>
event.clientY 返回最后一次点击鼠标Y坐标值；<br/>
event.offsetX 返回当前鼠标悬停X坐标值<br/>
event.offsetY 返回当前鼠标悬停Y坐标值<br/>
event.button==1/2/3 鼠标键左键等于1右键等于2两个键一起按为3<br/>
&nbsp;<br/>
opener&nbsp; 控制原打开窗体对象<br/>
parent 控制框架父级页面<br/>
WindowObject.closed&nbsp;
对象窗口WindowObject是否已关闭true/false<br/>
eval(String) 将字符串转换成JavaScript代码<br/>
confirm(String) 弹出确认框，确定返回true取消返回false<br/>
prompt("提示信息","预定值")&nbsp; 输入语句<br/>
alert(String) 弹出提示框，提示框显示内容为String<br/>
form.reset()&nbsp; 使form表单内的数据重置<br/>
form.submit() 使form对象提交数据<br/>
clearTimeout(Object) 清除已设置的setTimeout对象<br/>
clearInterval(Object) 清除已设置的setInterval对象<br/>
setTimeout("function", time) 设置一个超时对象<br/>
setInterval("function", time) 设置一个超时对象<br/>
&nbsp;<br/>
typeof(Object)&nbsp;
检查Obejct的类型，值有：String,Boolean,Object,Function,Underfined<br/>

Object.prototype.OwnerAttribute = Object&nbsp;
为对象Object增加自定义的属性或方法<br/>
&nbsp;<br/>
screen.availWidth&nbsp;
用户显示器可用的最大高度，以像素为单位<br/>
screen.availHeight&nbsp;
用户显示器可用的最大宽度，以像素为单位<br/>
screen.colorDepth 用户显示器上每像素可用的位数<br/>
screen.height 用户显示器的实际高度，以像素为单位<br/>
screen.pixelDepth （仅用于Netscape
4+）每像素最大的位数，由用户的显示设置给出<br/>
screen.width&nbsp;
用户显示器的实际宽度，以像素为单位<br/>
&nbsp;<br/>
window.resizeTo(x, y)&nbsp;
将窗口设置宽高（绝对坐标）<br/>
window.resizeBy(x, y)&nbsp;
将窗口设置宽高（相对坐标）<br/>
window.moveTo(x, y) 将窗口移到某位置（绝对坐标）<br/>
window.moveBy(x, y) 将窗口移到某位置（相对坐标）<br/>
window.scroll(x, y)&nbsp;
窗口滚动条坐标，y控制上下移动，须与函数配合（绝对坐标）<br/>
window.scrollBy(x, y)&nbsp;
窗口滚动条坐标，y控制上下移动，须与函数配合（相对坐标）<br/>
window.focus() 使当前窗口获得焦点<br/>
window.open() window.open("地址","名称","属性")<br/>
属 性:toolbar(工具栏), location(地址栏), directions,
status(状态栏), menubar(菜单栏), scrollbar(滚动条),
resizable(改变大小), width(宽), height(高), fullscreen(全屏),
scrollbars(全屏时无滚动条), channelmode(宽屏), left(打开窗口x坐标),
top(打开窗口y坐标)<br/>
window.location = 'view-source:' +
window.location.href&nbsp;
应用事件查看网页源代码;<br/>
&nbsp;<br/>
location.protocol 用于浏览器和服务器彼此通信的协议，如http:<br/>
location.hostname&nbsp;
作为主机发布文档的服务器名，如www.abiaos.com<br/>
location.port 用于浏览器和服务器彼此通信的端口，如80<br/>
location.host 在地址中指定的主机名和端口，此属性等于：hostname +
":" + port<br/>
location.pathname 文档的路径和文件名。如/about/index.html<br/>
location.hash 在地址中指定的锚名，其紧跟在符号#之后<br/>
location.search
从问号（？）到末尾的地址部分，包含？在内，但不包含锚名<br/>
location.href 整个地址，等价于location<br/>
location.reload(source)
重新载入页面。Source（可选）是一个布尔值。决定浏览器从那里重载页面：使用false（默认值）来从保存页面的缓冲中载入页面；使用true来迫使浏览器从服务器载入页面。<br/>

location.replace(URL)
用历史列表取代页面，调用history.go(-1)时将跳过调用函数的页面<br/>
&nbsp;<br/>
history.back() 模拟Back按钮<br/>
history.forward() 模拟Forward按钮<br/>
history.go(How_Far)
返回历史列表中的任何页面。How_Far为一个整数值，负数往后退，正数往前进，零刷新当前页面。运行history.go(0)与运行location.reload()不一样。history.go(0)方法只刷新页面，这意味着用户已经输入的表单数据将不会改变。<br/>

&nbsp;<br/>
document.activeElement
当文档有焦点时，返回有焦点的对象（IE4+）<br/>
document.alinkColor
返回或设置文档中链接的颜色，相当于&lt;body&gt;标记中的alink属性<br/>

document.anchors 返回文档中所有锚组成的数组<br/>
document.applets
返回文档中由所有Java小程序（&lt;applet&gt;标记）组成的数组<br/>
document.bgColor
返回或设置文档的背景颜色，相当于&lt;body&gt;标记中的bgcolor属性<br/>

document.cookie 返回或设置cookie<br/>
document.defaultCharset 文档中使用的默认字符集（IE4+）<br/>
document.domain 返回或设置文档的默认域名<br/>
document.embeds
返回文档中所有嵌入对象（&lt;embed&gt;标记）组成的数组<br/>
document.fgColor
返回或设置文档的前景（文本）颜色；相当于&lt;body&gt;中的text属性<br/>

document.fileCreatedDate 返回文档创建时的日期（IE4+）<br/>
document.fileModifiedDate 返回文档最后一次修改的日期（IE4+）<br/>
document.fileSize 返回文档的字节大小（IE4+）<br/>
document.forms
返回文档中所有表单（&lt;form&gt;标记）组成的数组<br/>
document.images 返回文档中所有图像组成的数组<br/>
document.forms.length 返回当前页form表单数<br/>
document.anchors.length&nbsp; 返回当前页锚的数量<br/>
document.links.length&nbsp; 返回当前页联接的数量<br/>
document.lastModified 返回文档最后一次修改的日期<br/>
document.layers
返回文档中所有层（&lt;layer&gt;标记）组成的数组（仅Netscape4）<br/>

document.linkColor&nbsp;
返回或设置文档中未访问链接的颜色；相当于&lt;body&gt;中的link属性<br/>

document.links 返回文档中所有链接组成的数组<br/>
document.location 返回或设置文档的地址<br/>
document.nameProp 返回文档的文件名（IE4+）<br/>
document.readyState
返回文档的当前状态（文档正在装载则返回loading；文档装载完毕则返回complete）（IE4+）<br/>

document.referrer
返回用户用于冲浪至当前文档的地址。如果当前文档是首页或是通过键入URL到达的页面，那么这个属性返回空字符串<br/>

document.scripts
返回文档中所有脚本（&lt;script&gt;标记）组成的数组。（IE4+）<br/>
document.title 返回或设置由&lt;title&gt;标记给出的文档标题<br/>
document.URL 返回或设置文档的地址<br/>
document.vlinkColor
返回或设置文档中已访问链接的颜色；相当于&lt;body&gt;中的vlink属性<br/>

document.captureEvents()
截取一个事件，以便它被Document对象处理，而不是被激活事件的对象处理。（Netscape4+）<br/>

document.clear() 清除文档的所有文本和标记<br/>
document.close() 关闭用于向文档写入文本的输出流<br/>
document.open() 打开一个输入流，向文档写入文本<br/>
document.releaseEvents()&nbsp;
释放被Document对象截取的事件（Netscape4+）<br/>
document.routeEvent()
截取一个事件，以便它被Document对象处理，然后把这个事件传递给激活给事件的对象。（Netscape4+）<br/>

document.write() 向文档写入数据<br/>
document.writeln() 向文档写入一行数据，后跟一个回车<br/>
&nbsp;<br/>
Link.target 由target属性指定的值<br/>
Link.innerHTML 在&lt;a
href&gt;和&lt;/a&gt;标记之间的文本（IE4+和Netscape6）<br/>
Link.text 在&lt;a
href&gt;和&lt;/a&gt;标记之间的文本（Netscape4+）<br/>
注：每一个Link对象也是一个Location对象。也就是说所有的Location对象的属性也是Link对象的属性，但是Location对象的方法不能用于Link对象。<br/>

Anchor.name Anchor对象name属性指定的值&nbsp; //用&lt;A
NAME=&gt;创建的HTML元素。anchor对象是document对象的一个属性,它本身没有属性方法或者事件处理程序。例：var
i = "x"； document.write(i.anchor("y"))；=》&lt;A
NAME="y"&gt;x&lt;/A&gt;</FONT></P>
<P><FONT FACE="Courier New"><br/>
Image.complete
如果图像还在载入，则返回false；如果图像已经完全载入，则返回true。<br/>

&lt;img onAbort="…"&gt; 当图像下载被取消时触发<br/>
&lt;img onError="…"&gt; 当图像载入失败时触发<br/>
&lt;img onLoad="…"&gt; 当图像完全载入时触发<br/>
&nbsp;<br/>
document.cookie = "Name=Value; expires=GMT_String;
domain=Cookie_Domain; path=Cookie_Dir; Cooke_Secure"
Name：cookie的名称；Value：cookie的值；GMT_String：表示cookie终止日期的GMT格式的字符串；Cookie_Dir：指定可以访问该cookie的最顶层目录的字符串；Cookie_Domain：指定域名或标识符的字符串；Cookie_Secure：如果为true，则该cookie只发往使用HTTPS（安全）协议链接的浏览器；如果为false（或者忽略）则发给所有的浏览器，即使使用了不安全的HTTP协议<br/>

&nbsp;<br/>
new Date() 创建一个日期对象(当前时间)<br/>
new Date("Month dd, yyyy hh:mm:ss")&nbsp;
创建一个日期对象<br/>
new Date(yyyy, mth, dd, hh, mm, ss) 创建一个日期对象<br/>
new Date(ms)
创建一个日期对象(ms：从GMT时间1970-1-1起的毫秒数)<br/>
Date.getYear()&nbsp; 获取年份值 两位数年份<br/>
Date.getFullYear() 获取全年份数 四位数年份（1999，2000等）<br/>
Date.getMonth()&nbsp; 获取年中的某月，从0（January）～
11（December）<br/>
Date.getDate() 获取月中的某日，从1～31<br/>
Date.getDay()&nbsp; /获取当前星期值，从0（Sunday）～
6（Staturday）<br/>
Date.getHours()&nbsp; 获取当前小时数，从0（午夜）～
23（晚上11点）<br/>
Date.getMinutes()&nbsp; 获取当前分钟数，从0～59<br/>
Date.getSeconds() 获取当前秒数，从0～59<br/>
Date.getMilliseconds()&nbsp;
获取当前毫秒数数，从0～999<br/>
Date.getTime() 从GMT时间1970年1月1日起的毫秒数<br/>
Date.toLocaleString() 从时间对象中获取时间，以字符串型式存在<br/>
注：除getDay()外，其他的get函数都有一个对应的set函数。</FONT></P>
<P><FONT FACE="Courier New">navigator.appCodeName&nbsp;
与浏览器相关的内部代码名<br/>
navigator.appMinorVersion&nbsp;
辅版本号（通常是应用于浏览器的补丁或服务包）<br/>
navigator.appName&nbsp; 浏览器的正式名称，对于Internet
Explorer返回Microsoft Internet Explorer，对于Netscape
Navigator返回Netscape<br/>
navigator.appVersion&nbsp; 浏览器的版本号<br/>
navigator.cookieEnabled&nbsp;
若用户的浏览器被设置为允许cookie，则返回true，否则返回false<br/>
navigator.cpuClass&nbsp;
浏览器正在运行的计算机的CUP型号（通常Intel芯片返回x86，PowerPC芯片返回PPC）<br/>

navigator.language&nbsp;
浏览器支持的语言（English返回en，German返回de，等等）<br/>
navigator.mi