﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-白纸人生-随笔分类-.NET</title><link>http://www.cppblog.com/andxie99/category/4402.html</link><description>上学时，因我年龄最小，个头也最小，上课时，就像大猩猩堆里的猴一般。如今，这猴偶尔也把最近的一些情况写在这里。</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 05:33:49 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 05:33:49 GMT</pubDate><ttl>60</ttl><item><title>.NET性能优化方面的总结（4） JavaScript</title><link>http://www.cppblog.com/andxie99/archive/2007/04/07/21449.html</link><dc:creator>思勤无邪</dc:creator><author>思勤无邪</author><pubDate>Sat, 07 Apr 2007 05:17:00 GMT</pubDate><guid>http://www.cppblog.com/andxie99/archive/2007/04/07/21449.html</guid><wfw:comment>http://www.cppblog.com/andxie99/comments/21449.html</wfw:comment><comments>http://www.cppblog.com/andxie99/archive/2007/04/07/21449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/andxie99/comments/commentRss/21449.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/andxie99/services/trackbacks/21449.html</trackback:ping><description><![CDATA[<p><br><strong>&nbsp;&nbsp;&nbsp; 4.1 JScript性能优化的基本原则</strong><br><strong>&nbsp;&nbsp;&nbsp; </strong>1.&nbsp;尽可能少地减少执行次数。毕竟对解释语言来说，每一个执行步骤，都需要和解释引擎做一次交互。<br><strong>&nbsp;&nbsp;&nbsp; </strong>2.&nbsp;尽可能使用语言内置的功能，比如串链接。<br><strong>&nbsp;&nbsp;&nbsp; </strong>3.&nbsp;尽可能使用系统提供的API来进行优化。因为这些API是编译好的二进制代码，执行效率很高。<br><strong>&nbsp;&nbsp;&nbsp; </strong>4.&nbsp;书写最正确的代码。容错功能是要付出性能代价的。<br><br><strong>&nbsp;&nbsp;&nbsp; 4.2 JScript语言本身的优化</strong><br><strong>&nbsp;&nbsp;&nbsp; </strong>4.2.1 变量<br><strong>&nbsp;&nbsp;&nbsp; </strong>1.&nbsp;尽量使用局部变量。<br><strong>&nbsp;&nbsp;&nbsp; </strong>因为全局变量其实是全局对象的成员，而局部变量在栈上定义，优先查找，性能相对于全局变量要高。</p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>2.&nbsp;尽量在一个语句中做定义变量和赋值。</p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>3.&nbsp;省略不必要的变量定义。<br><strong>&nbsp;&nbsp;&nbsp; </strong>如果变量的定义可以被一个常量替代，就直接使用常量。</p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>4.&nbsp;使用Object语法对对象赋值。<br><strong>&nbsp;&nbsp;&nbsp; </strong>Object的赋值语法在操作复杂对象时效率更高。<br><strong>&nbsp;&nbsp;&nbsp; </strong>例如，可以将下面的代码：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">car&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Object();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>car.make&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Honda</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>car.model&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Civic</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>car.transmission&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">manual</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>car.miles&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">100000</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>car.condition&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">needs&nbsp;work</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span></div>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>替换成：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_6_122_Open_Image onclick="this.style.display='none'; Codehighlighter1_6_122_Open_Text.style.display='none'; Codehighlighter1_6_122_Closed_Image.style.display='inline'; Codehighlighter1_6_122_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_6_122_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_6_122_Closed_Text.style.display='none'; Codehighlighter1_6_122_Open_Image.style.display='inline'; Codehighlighter1_6_122_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #000000">car&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_6_122_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_6_122_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;make:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Honda</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;model:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Civic</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;transmission:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">manual</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;miles:&nbsp;</span><span style="COLOR: #000000">100000</span><span style="COLOR: #000000">,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;condition:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">needs&nbsp;work</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p><br><strong>&nbsp;&nbsp;&nbsp; 4.2.2 对象缓存<br>&nbsp;&nbsp;&nbsp; </strong>1.&nbsp;缓存对象查找的中间结果。<br><strong>&nbsp;&nbsp;&nbsp; </strong>因为JavaScript的解释性，所以a.b.c.d.e，需要进行至少4次查询操作，先检查a再检查a中的b，再检查b中的c，如此往下。所以如果这样的表达式重复出现，只要可能，应该尽量少出现这样的表达式，可以利用局部变量，把它放入一个临时的地方进行查询。</p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>2.&nbsp;缓存创建时间较长的对象。<br><strong>&nbsp;&nbsp;&nbsp; </strong>自定义高级对象和Date、RegExp对象在构造时都会消耗大量时间。如果可以复用，应采用缓存的方式。</p>
<p><strong>&nbsp;&nbsp;&nbsp; 4.2.3 字符串操作</strong><br><strong>&nbsp;&nbsp;&nbsp; </strong>1.&nbsp;使用"+=" 追加字符串，使用"+"来连接字符串。<br><strong>&nbsp;&nbsp;&nbsp; </strong>如果是追加字符串，最好使用s+=anotherStr操作，而不是要使用s=s+anotherStr。<br><strong>&nbsp;&nbsp;&nbsp; </strong>如果要连接多个字符串，应该使用"+"，如：<br><strong>&nbsp;&nbsp;&nbsp; </strong>s+=a;<br><strong>&nbsp;&nbsp;&nbsp; </strong>s+=b;<br><strong>&nbsp;&nbsp;&nbsp; </strong>s+=c;<br><strong>&nbsp;&nbsp;&nbsp; </strong>应该写成<br><strong>&nbsp;&nbsp;&nbsp; </strong>s+=a + b + c；</p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>2.&nbsp;连接大量的字符串，应使用Array的join方法。<br><strong>&nbsp;&nbsp;&nbsp; </strong>如果是收集字符串，最好使用JavaScript数组缓存，最后使用join方法连接起来，如下：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;buf&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Array();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_53_83_Open_Image onclick="this.style.display='none'; Codehighlighter1_53_83_Open_Text.style.display='none'; Codehighlighter1_53_83_Closed_Image.style.display='inline'; Codehighlighter1_53_83_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_53_83_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_53_83_Closed_Text.style.display='none'; Codehighlighter1_53_83_Open_Image.style.display='inline'; Codehighlighter1_53_83_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_53_83_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_53_83_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;buf.push(i.toString());<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;all&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;buf.join(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">);</span></div>
<p><br><strong>&nbsp;&nbsp;&nbsp; 4.2.4 类型转换<br>&nbsp;&nbsp;&nbsp; </strong>1.&nbsp;使用Math.floor()或者Math.round()将浮点数转换成整型。<br><strong>&nbsp;&nbsp;&nbsp; </strong>浮点数转换成整型，这个更容易出错，很多人喜欢使用parseInt()，其实parseInt()是用于将字符串转换成数字，而不是浮点数和整型之间的转换，我们应该使用Math.floor()或者Math.round()。<br>对象查找中的问题不一样，Math是内部对象，所以Math.floor()其实并没有多少查询方法和调用的时间，速度是最快的。</p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>2.&nbsp;自定义的对象，推荐定义和使用toString()方法来进行类型转换。<br><strong>&nbsp;&nbsp;&nbsp; </strong>对于自定义的对象，如果定义了toString()方法来进行类型转换的话，推荐显式调用toString()。因为内部的操作在尝试所有可能性之后，会尝试对象的toString()方法尝试能否转化为String，所以直接调用这个方法效率会更高。</p>
<p><strong>&nbsp;&nbsp;&nbsp; 4.2.5 循环的优化<br>&nbsp;&nbsp;&nbsp; </strong>1.&nbsp;尽可能少使用for(in)循环。<br><strong>&nbsp;&nbsp;&nbsp; </strong>在JavaScript中，我们可以使用for(;;),while(),for(in)三种循环，事实上，这三种循环中for(in)的效率极差，因为他需要查询散列键，只要可以就应该尽量少用。</p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>2.&nbsp;预先计算collection的length。<br><strong>&nbsp;&nbsp;&nbsp; </strong>如：将<br>&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; collection.length; i++)<br><strong>&nbsp;&nbsp;&nbsp; </strong>替换成：<br>&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 0,&nbsp;len = collection.length; i &lt;&nbsp;len; i++)<br><strong>&nbsp;&nbsp;&nbsp; </strong>效果会更好，尤其是在大循环中。</p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>3.&nbsp;尽量减少循环内的操作。<br><strong>&nbsp;&nbsp;&nbsp; </strong>循环内的每个操作，都会被放大为循环次数的倍数。所以，大循环内微小的改进，在性能的整体提升上都是可观的。</p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>4.&nbsp;使用循环替代递归。<br>相比循环，递归的效率更差一些。递归的优点是在形式上更自然一些。所以，在不影响代码的维护性的前提下，用循环替代递归。</p>
<p><strong>&nbsp;&nbsp;&nbsp; 4.2.6 其它方面</strong><br><strong>&nbsp;&nbsp;&nbsp; </strong>1.&nbsp;尽量使用语言内置的语法。<br><strong>&nbsp;&nbsp;&nbsp; </strong>"var arr = [&#8230;];"和"var arr = new Array(&#8230;);"是等效的，但是前者的效能优于后者。同样，"var foo = {};"的方式也比"var foo = new Object();"快；"var reg = /../;"要比"var reg=new RegExp()"快。</p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>2.&nbsp;尽量不要使用eval。<br>使用eval，相当于在运行时再次调用解释引擎，对传入的内容解释运行，需要消耗大量时间。</p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>3.&nbsp;使用prototype代替closure。<br><strong>&nbsp;&nbsp;&nbsp; </strong>使用closure在性能和内存消耗上都是不利的。如果closure使用量过大，这就会成为一个问题。所以，尽量将：<br>&nbsp;&nbsp;&nbsp;&nbsp; this.methodFoo = function()<br>替换成：<br>&nbsp;&nbsp;&nbsp;&nbsp; MyClass.protoype.methodFoo = function()<br>和closure存在于对象实例之中不同，prototype存在于类中，被该类的所有的对象实例共享。</p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>4.&nbsp;避免使用with语句。<br><strong>&nbsp;&nbsp;&nbsp; </strong>With语句临时扩展对象查找的范围，节省了文字的录入时间，但付出了更多的执行时间。因为每个给出的名称都要在全局范围查找。所以，可以将下面的代码：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">with</span><span style="COLOR: #000000">&nbsp;(document.formname)<br><img id=Codehighlighter1_25_79_Open_Image onclick="this.style.display='none'; Codehighlighter1_25_79_Open_Text.style.display='none'; Codehighlighter1_25_79_Closed_Image.style.display='inline'; Codehighlighter1_25_79_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_25_79_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_25_79_Closed_Text.style.display='none'; Codehighlighter1_25_79_Open_Image.style.display='inline'; Codehighlighter1_25_79_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_25_79_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_25_79_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;field1.value&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">one</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;field2.value&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">two</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p>变更为：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;form&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;document.formname;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>form.field1.value&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">one</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>form.field2.value&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">two</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span></div>
<p><br><strong>&nbsp;&nbsp;&nbsp; 4.3 DOM相关</strong><br><strong>&nbsp;&nbsp;&nbsp; </strong>4.3.1 创建DOM节点<br><strong>&nbsp;&nbsp;&nbsp; </strong>相比较通过document.write来给页面生成内容，找一个容器元素（比如指定一个div或者span）并设置他们的innerHTML效率更高。<br><strong>&nbsp;&nbsp;&nbsp; </strong>而设置innerHTML的方式比通过createElement方法创建节点的效率更高。事实上，设置元素的innerHTML是创建节点效率最高的一种方式。<br><strong>&nbsp;&nbsp;&nbsp; </strong>如果必须使用createElement方法，而如果文档中存在现成的样板节点，应该是用cloneNode()方法。因为使用createElement()方法之后，你需要设置多次元素的属性，使用cloneNode()则可以减少属性的设置次数。同样，如果需要创建很多元素，应该先准备一个样板节点。</p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>4.3.2 离线操作大型的DOM树<br><strong>&nbsp;&nbsp;&nbsp; </strong>在添加一个复杂的DOM树时，可以先构造，构造结束后再将其添加到DOM数的适当节点。这能够节省界面刷新的时间。</p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>同样，在准备编辑一个复杂的树时，可以先将树从DOM树上删除，等编辑结束后再添加回来。<br>&nbsp;<br><strong>&nbsp;&nbsp;&nbsp; 4.3.3 对象查询<br>&nbsp;&nbsp;&nbsp; </strong>使用[""]查询要比.item()更快。调用.item()增加了一次查询和函数的调用。<br><br><strong>&nbsp;&nbsp;&nbsp; 4.3.4 定时器<br>&nbsp;&nbsp;&nbsp; </strong>如果针对的是不断运行的代码，不应该使用setTimeout，而应该用setInterval。setTimeout每次要重新设置一个定时器。<br><br><strong>&nbsp;&nbsp;&nbsp; 4.4 其他</strong><br><strong>&nbsp;&nbsp;&nbsp; </strong>1.&nbsp;尽量减小文件尺寸。<br><strong>&nbsp;&nbsp;&nbsp; </strong>将JScript文件中无关的空行、空格、注释去掉，有助于减小JS文件的尺寸，提高下载的时间。（可以通过工具来支持代码发布）<br><strong>&nbsp;&nbsp;&nbsp; </strong>2.&nbsp;尽量不要在同一个Page内同时引用JScript和VBScript引擎<br><strong>&nbsp;&nbsp;&nbsp; </strong>3.&nbsp;将Page内的JScript移入到单独的JS文件中。<br><strong>&nbsp;&nbsp;&nbsp; </strong>4.&nbsp;将Page内的JScript放置在Page的最下面，有助于提高页面的响应速度。<br><strong>&nbsp;&nbsp;&nbsp; </strong>5.&nbsp;利用cache，减少JScript文件的下载次数<br><strong>&nbsp;&nbsp;&nbsp; </strong>6.&nbsp;在HTML内书写JScript文件的URL时，注意统一大小写。这样可以利用前面URL缓存的文件。<br><strong>&nbsp;&nbsp;&nbsp; </strong>7.&nbsp;推荐使用JScript Lint检查Javascript代码。毕竟，对JScript引擎来说，最容易理解的JScript代码，执行的效率也就最高。<br></p>
<img src ="http://www.cppblog.com/andxie99/aggbug/21449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/andxie99/" target="_blank">思勤无邪</a> 2007-04-07 13:17 <a href="http://www.cppblog.com/andxie99/archive/2007/04/07/21449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.NET性能优化方面的总结（3） Asp.Net </title><link>http://www.cppblog.com/andxie99/archive/2007/04/07/21437.html</link><dc:creator>思勤无邪</dc:creator><author>思勤无邪</author><pubDate>Sat, 07 Apr 2007 01:32:00 GMT</pubDate><guid>http://www.cppblog.com/andxie99/archive/2007/04/07/21437.html</guid><wfw:comment>http://www.cppblog.com/andxie99/comments/21437.html</wfw:comment><comments>http://www.cppblog.com/andxie99/archive/2007/04/07/21437.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/andxie99/comments/commentRss/21437.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/andxie99/services/trackbacks/21437.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; <strong>3.1 减少往返行程（Reduce Round Trips）</strong><br>&nbsp;&nbsp;&nbsp; 使用下面的方法可以减少Web服务器和Browser之间的往返行程：<br>&nbsp;&nbsp;&nbsp; 1.&nbsp;为Browser启用缓存<br>&nbsp;&nbsp;&nbsp; 如果呈现的内容是静态的或变化周期较长，应启用Browser缓存，避免发出冗余的http请求。</p>
<p>&nbsp;&nbsp;&nbsp; 2.&nbsp;缓冲页面输出<br>&nbsp;&nbsp;&nbsp; 如果可能，则尽量缓冲页面输出，处理结束后再一次传送到客户端，这可以避免频繁传递小块内容所造成的多次网络交互。由于这种方式在页面处理结束之前客户端无法看到页面内容，因此如果一个页面的尺寸较大的话，可考虑使用Response.Flush方法。该方法强制输出迄今为止在缓冲区中的内容，你应当采用合理的算法控制调用Response.Flush方法的次数。</p>
<p>&nbsp;&nbsp;&nbsp; 3.&nbsp;使用Server.Transfer重定向请求<br>&nbsp;&nbsp;&nbsp; 使用Server.Transfer方法重定向请求优于Response.Redirect方法。原因是Response.Redirect会向Broswer回送一个响应头，在响应头中指出重定向的URL，之后Brower使用新的URL重新发出请求。而Server.Transfer方法直接是一个简单的服务端调用，完全没有这些开销！<br>&nbsp;&nbsp;&nbsp; 需要注意Server.Transfer有局限性：第一，它会跳过安全检查；第二，只适用于在同一Web应用内的页面间跳转。<br><br>&nbsp;&nbsp;&nbsp; <strong>3.2 避免阻塞和长时间的作业<br></strong>&nbsp;&nbsp;&nbsp; 如果需要运行阻塞或长时间运行的操作，可以考虑使用异步调用的机制，以便Web服务器能够继续处理其它的请求。<br>&nbsp;&nbsp;&nbsp; 1.&nbsp;使用异步方式调用Web服务和远程对象<br>&nbsp;&nbsp;&nbsp; 只要有可能就要避免在请求的处理过程中对Web服务和远程对象的同步调用，因为它占用的是的ASP.NET 线程池中的工作线程，这将直接影响Web服务器响应其它请求的能力。</p>
<p>&nbsp;&nbsp;&nbsp; 2.&nbsp;考虑给不需要返回值的Web方法或远程对象的方法添加OneWay属性<br>&nbsp;&nbsp;&nbsp; 这种模式能让Web Server调用之后就立即返回。可根据实际情况决定是否使用这种方法。</p>
<p>&nbsp;&nbsp;&nbsp; 3.&nbsp;使用工作队列<br>&nbsp;&nbsp;&nbsp; 将作业提交到服务器上的工作队列中。客户端通过发送请求来轮询作业的执行结果。<br><br>&nbsp;&nbsp;&nbsp; <strong>3.3 使用缓存</strong><br>&nbsp;&nbsp;&nbsp; 缓存能在很大程度上决定ASP.NET应用的最终性能。Asp.net支持页面输出缓存和页面部分缓存，并提供Cache API，供应用程序缓存自己的数据。是否使用缓存可考虑下面的要点：<br>&nbsp;&nbsp;&nbsp; 1.&nbsp;识别创建与访问代价较大的数据<br>&nbsp;&nbsp;&nbsp; 2.&nbsp;评估需要缓存数据的易变性<br>&nbsp;&nbsp;&nbsp; 3.&nbsp;评估数据的使用频次<br>&nbsp;&nbsp;&nbsp; 4.&nbsp;将要缓存数据中易变数据和不变数据分离，只缓存不变数据<br>&nbsp;&nbsp;&nbsp; 5.&nbsp;选择合适的缓存机制（除Asp.net Cache外，Application state和Session state也可以作为缓存使用）<br><br>&nbsp;&nbsp;&nbsp; <strong>3.4 多线程<br></strong>&nbsp;&nbsp;&nbsp; 1.&nbsp;避免在请求处理过程中创建线程<br>&nbsp;&nbsp;&nbsp; 在执行请求的过程中创建线程是一种代价较大的操作，会严重影响Web Server的性能。如果后续的操作必须用线程完成，建议通过thread pool来创建/管理线程。</p>
<p>&nbsp;&nbsp;&nbsp; 2.&nbsp;不要依赖线程数据槽或线程静态变量<br>&nbsp;&nbsp;&nbsp; 由于执行请求的线程是ASP.NET thread pool中的工作线程，同一个Client的两次请求不一定由相同的线程来处理。 </p>
<p>&nbsp;&nbsp;&nbsp; 3.&nbsp;避免阻塞处理请求的线程<br>参考"避免阻塞和长时间的作业"小节。</p>
<p>&nbsp;&nbsp;&nbsp; 4.&nbsp;避免异步调用<br>&nbsp;&nbsp;&nbsp; 这和1的情况类似。异步调用会导致创建新的线程，增加服务器的负担。所以，如果没有并发的作业要执行，就不要执行异步调用。<br><br>&nbsp;&nbsp;&nbsp; 3<strong>.5 系统资源<br></strong>&nbsp;&nbsp;&nbsp; 1.&nbsp;考虑实现资源池以提升性能<br>&nbsp;&nbsp;&nbsp; 2.&nbsp;明确地调用Dispose或Close释放系统资源<br>&nbsp;&nbsp;&nbsp; 3.&nbsp;不要缓存或长时间占用资源池中的资源<br>&nbsp;&nbsp;&nbsp; 4.&nbsp;尽可能晚的申请，尽可能早的释放<br><br>&nbsp;&nbsp;&nbsp; <strong>3.6 页面处理</strong><br>&nbsp;&nbsp;&nbsp; 1.&nbsp;尽量减小Page的尺寸<br>&nbsp;&nbsp;&nbsp; 包括缩短控件的名称、CSS的class的名称、去掉无谓空行和空格、禁用不需要的ViewState<br>&nbsp;&nbsp;&nbsp; 2.&nbsp;启用页面输出的缓冲区（Buffer）<br>&nbsp;&nbsp;&nbsp; 如果Buffer的机制被关闭，可以用下面的方法打开。<br>&nbsp;&nbsp;&nbsp;&nbsp; 使用程序打开页面输出缓存：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.BufferOutput = true;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 使用@Page开关打开页面输出缓冲机制：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%@ Page Buffer = "true" %&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 使用Web.config或Machine.config配置文件的&lt;pages&gt;节点：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;pages buffer="true" &#8230;&gt;<br>&nbsp;&nbsp;&nbsp; 3.&nbsp;利用Page.IsPostBack优化页面输出<br>&nbsp;&nbsp;&nbsp; 4.&nbsp;通过分离页面的不同的内容，来提高缓存效率和减少呈现的时间&nbsp;<br>&nbsp;&nbsp;&nbsp; 5.&nbsp;优化复杂和代价较大的循环&nbsp;<br>&nbsp;&nbsp;&nbsp; 6.&nbsp;合理利用客户端的计算资源，将一些操作转移到客户端进行<br><br>&nbsp;&nbsp;&nbsp; <strong>3.7 ViewState<br></strong>&nbsp;&nbsp;&nbsp; ViewState是Asp.net为服务端控件在页面回传之间跟踪状态信息而设计的一种机制。<br>&nbsp;&nbsp;&nbsp; 1.&nbsp;关闭ViewState<br>&nbsp;&nbsp;&nbsp; 如果不需要跟踪页面状态，例如页面不会 回传（PostBack）、不需要处理服务端控件事件或者每次页面刷新时都会重新计算控件内容，那么就不需要用ViewState来记录页面状态了。可以对特定的WebControl设置EnableViewState属性，也可以在页面一级设置：<br>&lt;%@ Page EnableViewState="false" %&gt;</p>
<p>&nbsp;&nbsp;&nbsp; 2.&nbsp;在恰当的时间点初始化控件属性<br>&nbsp;&nbsp;&nbsp; ASP.NET的控件在执行构造函数、初始化的期间设置的属性不会被跟踪变化；而在初始化阶段之后对属性的修改都会被跟踪，并最终记录到IE页面的__VIEWSTATE之中。所以，选择合理的初始化控件属性的执行点，能有效的减小页面尺寸。</p>
<p>&nbsp;&nbsp;&nbsp; 3.&nbsp;谨慎选择放到ViewState中的内容<br>&nbsp;&nbsp;&nbsp; 放到ViewState中的内容会被序列化/反序列化，Asp.net为String、Integer、Boolean等基本类型的序列化做了优化，如果Array、ArrayList、HashTable存储的是基本类型效率也较高，但其它类型则需要提供类型转换器（Type Converter），否则将使用代价昂贵的二进制序列化程序。<br></p>
<img src ="http://www.cppblog.com/andxie99/aggbug/21437.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/andxie99/" target="_blank">思勤无邪</a> 2007-04-07 09:32 <a href="http://www.cppblog.com/andxie99/archive/2007/04/07/21437.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.NET性能优化方面的总结（2） Ado.Net</title><link>http://www.cppblog.com/andxie99/archive/2007/04/02/21119.html</link><dc:creator>思勤无邪</dc:creator><author>思勤无邪</author><pubDate>Mon, 02 Apr 2007 13:59:00 GMT</pubDate><guid>http://www.cppblog.com/andxie99/archive/2007/04/02/21119.html</guid><wfw:comment>http://www.cppblog.com/andxie99/comments/21119.html</wfw:comment><comments>http://www.cppblog.com/andxie99/archive/2007/04/02/21119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/andxie99/comments/commentRss/21119.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/andxie99/services/trackbacks/21119.html</trackback:ping><description><![CDATA[<p><strong>2. Ado.Net<br></strong><br><strong>&nbsp;&nbsp;&nbsp; 2.1 应用Ado.net的一些思考原则</strong><br><strong>&nbsp;&nbsp;&nbsp; </strong>1.&nbsp;根据数据使用的方式来设计数据访问层<br><strong>&nbsp;&nbsp;&nbsp; </strong>2.&nbsp;缓存数据，避免不必要的操作<br><strong>&nbsp;&nbsp;&nbsp; </strong>3.&nbsp;使用服务帐户进行连接<br><strong>&nbsp;&nbsp;&nbsp; </strong>4.&nbsp;必要时申请，尽早释放<br><strong>&nbsp;&nbsp;&nbsp; </strong>5.&nbsp;关闭可关闭的资源<br><strong>&nbsp;&nbsp;&nbsp; </strong>6.&nbsp;减少往返<br><strong>&nbsp;&nbsp;&nbsp; </strong>7.&nbsp;仅返回需要的数据<br><strong>&nbsp;&nbsp;&nbsp; </strong>8.&nbsp;选择适当的事务类型<br><strong>&nbsp;&nbsp;&nbsp; </strong>9.&nbsp;使用存储过程<br><br><strong>&nbsp;&nbsp;&nbsp; 2.2 Connection</strong><br><strong>&nbsp;&nbsp;&nbsp; </strong>数据库连接是一种共享资源，并且打开和关闭的开销较大。Ado.net默认启用了连接池机制，关闭连接不会真的关闭物理连接，而只是把连接放回到连接池中。因为池中共享的连接资源始终是有限的，如果在使用连接后不尽快关闭连接，那么就有可能导致申请连接的线程被阻塞住，影响整个系统的性能表现。<br><strong>&nbsp;&nbsp;</strong>&nbsp;<strong> 2.2.1 在方法中打开和关闭连接</strong><br><strong>&nbsp;&nbsp;&nbsp; </strong>这个原则有几层含义：<br><strong>&nbsp;&nbsp;&nbsp; </strong>1.&nbsp;主要目的是为了做到必要时申请和尽早释放<br><strong>&nbsp;&nbsp;&nbsp; </strong>2.&nbsp;不要在类的构造函数中打开连接、在析构函数中释放连接。因为这将依赖于垃圾回收，而垃圾回收只受内存影响，回收时机不定<br><strong>&nbsp;&nbsp;&nbsp; </strong>3.&nbsp;不要在方法之间传递连接，这往往导致连接保持打开的时间过长</p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>这里强调一下在方法之间传递连接的危害：曾经在压力测试中遇到过一个测试案例，当增大用户数的时候，这个案例要比别的案例早很久就用掉连接池中的所有连接。经分析，就是因为A方法把一个打开的连接传递到了B方法，而B方法又调用了一个自行打开和关闭连接的C方法。在A方法的整个运行期间，它至少需要占用两条连接才能够成功工作，并且其中的一条连接占用时间还特别长，所以造成连接池资源紧张，影响了整个系统的可伸缩性！<br><br><strong>&nbsp;&nbsp;&nbsp; 2.2.2 显式关闭连接</strong><br><strong>&nbsp;&nbsp;&nbsp; </strong>Connection对象本身在垃圾回收时可以被关闭，而依赖垃圾回收是很不好的策略。推荐使用using语句显式关闭连接，如下例：&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;(SqlConnection&nbsp;conn&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;SqlConnection(connString))<br><img id=Codehighlighter1_59_86_Open_Image onclick="this.style.display='none'; Codehighlighter1_59_86_Open_Text.style.display='none'; Codehighlighter1_59_86_Closed_Image.style.display='inline'; Codehighlighter1_59_86_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_59_86_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_59_86_Closed_Text.style.display='none'; Codehighlighter1_59_86_Open_Image.style.display='inline'; Codehighlighter1_59_86_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_59_86_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_59_86_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;conn.Open();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Dispose&nbsp;is&nbsp;automatically&nbsp;called&nbsp;on&nbsp;the&nbsp;conn&nbsp;variable&nbsp;here</span></div>
<p><br><strong>&nbsp;&nbsp;&nbsp; 2.2.3 确保连接池启用<br>&nbsp;&nbsp;&nbsp; </strong>Ado.net是为每个不同的连接串建立连接池，因此应该确保连接串不会出现与具体用户相关的信息。另外，要注意连接串是大小写敏感的。<br><strong>&nbsp;&nbsp;&nbsp; 2.2.4 不要缓存连接<br>&nbsp;&nbsp;&nbsp; </strong>例如，把连接缓存到Session或Application中。在启用连接池的情况下，这种做法没有任何意义。<br><strong>&nbsp;&nbsp;&nbsp; 2.3 Command<br>&nbsp;&nbsp;&nbsp; 2.3.1 使用ExecuteScalar和ExecuteNonQuery<br>&nbsp;&nbsp;&nbsp; </strong>如果想返回像Count(*)、Sum(Price)或Avg(Quantity)那样的单值，可以使用ExecuteScalar方法。ExecuteScalar返回第一行第一列的值，将结果集作为标量值返回。因为单独一步就能完成，所以ExecuteScalar不仅简化了代码，还提高了性能。<br>&nbsp;&nbsp;&nbsp; 使用不返回行的SQL语句时，例如修改数据（INSERT、UPDATE或DELETE）或仅返回输出参数或返回值，请使用ExecuteNonQuery。这避免了用于创建空DataReader的任何不必要处理。<br><strong>&nbsp;&nbsp;&nbsp; 2.3.2 使用Prepare<br>&nbsp;&nbsp;&nbsp; </strong>当需要重复执行同一SQL语句多次，可考虑使用Prepare方法提升效率。需要注意的是，如果只是执行一次或两次，则完全没有必要。例如：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">cmd.CommandText&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">insert&nbsp;into&nbsp;Table1&nbsp;(&nbsp;Col1,&nbsp;Col2&nbsp;)&nbsp;values&nbsp;(&nbsp;@val1,&nbsp;@val2&nbsp;)</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>cmd.Parameters.Add(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">@val1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;SqlDbType.Int,&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Col1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>cms.Parameters.Add(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">@val2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;SqlDbType.NChar,&nbsp;</span><span style="COLOR: #000000">50</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Col2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>cmd.Parameters[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].Value&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>cmd.Parameters[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].Value&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">XXX</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>cmd.Prepare();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>cmd.ExecuteNonQuery();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>cmd.Parameters[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].Value&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>cmd.Parameters[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].Value&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">YYY</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>cmd.ExecuteNonQuery();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>cmd.Parameters[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].Value&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>cmd.Parameters[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].Value&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ZZZ</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>cmd.ExecuteNonQuery();</span></div>
<p><br><strong>&nbsp;&nbsp;&nbsp; 2.3.3 使用绑定变量</strong> <span style="COLOR: red">★<br></span><strong>&nbsp;&nbsp;&nbsp; </strong>SQL语句需要先被编译成执行计划，然后再执行。如果使用绑定变量的方式，那么这个执行计划就可以被后续执行的SQL语句所复用。而如果直接把参数合并到了SQL语句中，由于参数值千变万化，执行计划就难以被复用了。例如上面Prepare一节给出的示例，如果把参数值直接写到insert语句中，那么上面的四次调用将需要编译四次执行计划。<br><strong>&nbsp;&nbsp;&nbsp; </strong>为避免这种情况造成性能损失，要求一律使用绑定变量方式。<br><strong>&nbsp;&nbsp;&nbsp; 2.4 DataReader<br>&nbsp;&nbsp;&nbsp; </strong>DataReader最适合于访问只读的单向数据集。与DataSet不同，数据集并不全部在内存中，而是随不断发出的read请求，一旦发现数据缓冲区中的数据均被读取，则从数据源传输一个数据缓冲区大小的数据块过来。另外，DataReader保持连接，DataSet则与连接断开。<br><strong>&nbsp;&nbsp;&nbsp; 2.4.1 显式关闭DataReader<br>&nbsp;&nbsp;&nbsp; </strong>与连接类似，也需要显式关闭DataReader。另外，如果与DataReader关联的Connection仅为DataReader服务的话，可考虑使用Command对象的ExecuteReader(CommandBehavior.CloseConnection)方式。这可以保证当DataReader关闭时，同时自动关闭Connection。<br><strong>&nbsp;&nbsp;&nbsp; 2.4.2 用索引号访问代替名称索引号访问属性<br>&nbsp;&nbsp;&nbsp; </strong>从Row中访问某列属性，使用索引号的方式比使用名称方式有细微提高。如果会被频繁调用，例如在循环中，那么可考虑此类优化。示例如下：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">cmd.CommandText&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">select&nbsp;Col1,&nbsp;Col2&nbsp;from&nbsp;Table1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>SqlDataReader&nbsp;dr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;cmd.ExecuteReader();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;col1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;dr.GetOrdinal(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Col1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;col2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;dr.GetOrdinal(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Col2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(dr.Read())<br><img id=Codehighlighter1_180_233_Open_Image onclick="this.style.display='none'; Codehighlighter1_180_233_Open_Text.style.display='none'; Codehighlighter1_180_233_Closed_Image.style.display='inline'; Codehighlighter1_180_233_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_180_233_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_180_233_Closed_Text.style.display='none'; Codehighlighter1_180_233_Open_Image.style.display='inline'; Codehighlighter1_180_233_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_180_233_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_180_233_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&nbsp;dr[col1]&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">_</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;dr[col2]);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p><br><strong>&nbsp;&nbsp;&nbsp; 2.4.3 使用类型化方法访问属性<br>&nbsp;&nbsp;&nbsp; </strong>从Row中访问某列属性，用GetString、GetInt32这种显式指明类型的方法，其效率较通用的GetValue方法有细微提高，因为不需要做类型转换。<br><strong>&nbsp;&nbsp;&nbsp; 2.4.4 使用多数据集</strong><br><strong>&nbsp;&nbsp;&nbsp; </strong>部分场景可以考虑一次返回多数据集来降低网络交互次数，提升效率。示例如下：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">cmd.CommandText&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">StoredProcedureName</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;The&nbsp;stored&nbsp;procedure&nbsp;returns&nbsp;multiple&nbsp;result&nbsp;sets.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">SqlDataReader&nbsp;dr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;cmd.ExecuteReader();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(dr.read())<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;read&nbsp;first&nbsp;result&nbsp;set</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>dr.NextResult();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(dr.read())<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;</span></div>
<p><br><strong>&nbsp;&nbsp;&nbsp; 2.5 DataSet</strong><br><strong>&nbsp;&nbsp;&nbsp; 2.5.1 利用索引加快查找行的效率</strong><br><strong>&nbsp;&nbsp;&nbsp; </strong>如果需要反复查找行，建议增加索引。有两种方式：<br><strong>&nbsp;&nbsp;&nbsp; </strong>1.&nbsp;设置DataTable的PrimaryKey<br><strong>&nbsp;&nbsp;&nbsp; </strong>适用于按PrimaryKey查找行的情况。注意此时应调用DataTable.Rows.Find方法，一般惯用的Select方法不能利用索引。<br><strong>&nbsp;&nbsp;&nbsp; </strong>2.&nbsp;使用DataView<br><strong>&nbsp;&nbsp;&nbsp; </strong>适用于按Non-PrimaryKey查找行的情况。可为DataTable创建一个DataView，并通过SortOrder参数指示建立索引。此后使用Find或FindRows查找行。<br></p>
<img src ="http://www.cppblog.com/andxie99/aggbug/21119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/andxie99/" target="_blank">思勤无邪</a> 2007-04-02 21:59 <a href="http://www.cppblog.com/andxie99/archive/2007/04/02/21119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.NET性能优化方面的总结</title><link>http://www.cppblog.com/andxie99/archive/2007/03/24/20538.html</link><dc:creator>思勤无邪</dc:creator><author>思勤无邪</author><pubDate>Sat, 24 Mar 2007 09:06:00 GMT</pubDate><guid>http://www.cppblog.com/andxie99/archive/2007/03/24/20538.html</guid><wfw:comment>http://www.cppblog.com/andxie99/comments/20538.html</wfw:comment><comments>http://www.cppblog.com/andxie99/archive/2007/03/24/20538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/andxie99/comments/commentRss/20538.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/andxie99/services/trackbacks/20538.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp; 从2004年底开始接触C#到现在也有2年多的时间了，因为有C++方面的基础，对于C#，我习惯于与C++对比。现在总结一些.NET方面的性能优化方面的经验，算是对这两年多的.NET工作经历的总结。&nbsp;&nbsp;&nbsp; 由于使用C#时间不长，欢迎各高手补充。&nbsp;&nbsp;&nbsp; 标有 ★ 表示特别重要，会严重影响性能，程序中不应出现...&nbsp;&nbsp;<a href='http://www.cppblog.com/andxie99/archive/2007/03/24/20538.html'>阅读全文</a><img src ="http://www.cppblog.com/andxie99/aggbug/20538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/andxie99/" target="_blank">思勤无邪</a> 2007-03-24 17:06 <a href="http://www.cppblog.com/andxie99/archive/2007/03/24/20538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#中一种执行命令行或DOS内部命令的方法</title><link>http://www.cppblog.com/andxie99/archive/2006/12/09/16200.html</link><dc:creator>思勤无邪</dc:creator><author>思勤无邪</author><pubDate>Sat, 09 Dec 2006 14:52:00 GMT</pubDate><guid>http://www.cppblog.com/andxie99/archive/2006/12/09/16200.html</guid><wfw:comment>http://www.cppblog.com/andxie99/comments/16200.html</wfw:comment><comments>http://www.cppblog.com/andxie99/archive/2006/12/09/16200.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/andxie99/comments/commentRss/16200.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/andxie99/services/trackbacks/16200.html</trackback:ping><description><![CDATA[<font face="Courier New"><br>&nbsp;&nbsp;&nbsp; 用Ping命令作示例，说明C#下执行命令行或DOS内部命令的一种方法，并获取相应的结果。执行时可以让这些程序的执行过程不显示出来，调用外部程序就可以分析执行结果。<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;要用使用Process类来创建独立的进程,导入</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Diagnostics;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;Cmd<br><img id=Codehighlighter1_82_1799_Open_Image onclick="this.style.display='none'; Codehighlighter1_82_1799_Open_Text.style.display='none'; Codehighlighter1_82_1799_Closed_Image.style.display='inline'; Codehighlighter1_82_1799_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_82_1799_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_82_1799_Closed_Text.style.display='none'; Codehighlighter1_82_1799_Open_Image.style.display='inline'; Codehighlighter1_82_1799_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_82_1799_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_82_1799_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CmdConsole<br><img id=Codehighlighter1_110_1797_Open_Image onclick="this.style.display='none'; Codehighlighter1_110_1797_Open_Text.style.display='none'; Codehighlighter1_110_1797_Closed_Image.style.display='inline'; Codehighlighter1_110_1797_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_110_1797_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_110_1797_Closed_Text.style.display='none'; Codehighlighter1_110_1797_Open_Image.style.display='inline'; Codehighlighter1_110_1797_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_110_1797_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_110_1797_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[STAThread]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Main(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">[]&nbsp;args)<br><img id=Codehighlighter1_181_403_Open_Image onclick="this.style.display='none'; Codehighlighter1_181_403_Open_Text.style.display='none'; Codehighlighter1_181_403_Closed_Image.style.display='inline'; Codehighlighter1_181_403_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_181_403_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_181_403_Closed_Text.style.display='none'; Codehighlighter1_181_403_Open_Image.style.display='inline'; Codehighlighter1_181_403_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_181_403_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_181_403_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Please&nbsp;Input&nbsp;IP&nbsp;Address:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;ip&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Console.ReadLine();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;strRst&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CmdPing(ip);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(strRst);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadLine();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;CmdPing(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;strIp)<br><img id=Codehighlighter1_474_1791_Open_Image onclick="this.style.display='none'; Codehighlighter1_474_1791_Open_Text.style.display='none'; Codehighlighter1_474_1791_Closed_Image.style.display='inline'; Codehighlighter1_474_1791_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_474_1791_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_474_1791_Closed_Text.style.display='none'; Codehighlighter1_474_1791_Open_Image.style.display='inline'; Codehighlighter1_474_1791_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_474_1791_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_474_1791_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;实例一个Process类,启动一个独立进程</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Process&nbsp;p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Process();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;设定程序名</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.StartInfo.FileName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">cmd.exe</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;关闭Shell的使用</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.StartInfo.UseShellExecute&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;重定向标准输入</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.StartInfo.RedirectStandardInput&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;重定向标准输出</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.StartInfo.RedirectStandardOutput&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">重定向错误输出</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.StartInfo.RedirectStandardError&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;设置不显示窗口</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.StartInfo.CreateNoWindow&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;启动进程</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;pingrst;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.Start();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.StandardInput.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ping&nbsp;-n&nbsp;1&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;strIp);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.StandardInput.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">exit</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;从输出流获取命令执行结果</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;strRst&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;p.StandardOutput.ReadToEnd();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(strRst.IndexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">(&nbsp;0%&nbsp;loss&nbsp;)</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pingrst&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">连接</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(strRst.IndexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Destination&nbsp;host&nbsp;unreachable.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pingrst&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">无法到达目的主机</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(strRst.IndexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Request&nbsp;timed&nbsp;out.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pingrst&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">超时</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(strRst.IndexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Unknown&nbsp;host</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pingrst&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">无法解析主机</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pingrst&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;strRst;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;if&nbsp;end</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.Close();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;pingrst;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
</font>
<img src ="http://www.cppblog.com/andxie99/aggbug/16200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/andxie99/" target="_blank">思勤无邪</a> 2006-12-09 22:52 <a href="http://www.cppblog.com/andxie99/archive/2006/12/09/16200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在不同页面之间传递参数</title><link>http://www.cppblog.com/andxie99/archive/2006/10/27/14271.html</link><dc:creator>思勤无邪</dc:creator><author>思勤无邪</author><pubDate>Fri, 27 Oct 2006 02:12:00 GMT</pubDate><guid>http://www.cppblog.com/andxie99/archive/2006/10/27/14271.html</guid><wfw:comment>http://www.cppblog.com/andxie99/comments/14271.html</wfw:comment><comments>http://www.cppblog.com/andxie99/archive/2006/10/27/14271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/andxie99/comments/commentRss/14271.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/andxie99/services/trackbacks/14271.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 近来论坛中关于在不同页面之间传递参数的问题很多，在此做一个简单的说明，希望给给朋友们一些帮助，也希望朋友们能开展更多这方面的讨论，欢迎高手们提出自己更好的方法。&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于不同页面之间传递参数，一般常规用法是：&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、通过URL后带的参数&nbsp;&nbsp;<br>这种方法受限制很多，一是将参数暴露出来，容易带来一些安全方面的隐患，二是所带参数如果数量较多，控制起来也很麻烦；&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、通过常规表单中的POST提交&nbsp;&nbsp;<br>这种方法最常用，但在ASP.NET页面中的FROM控件无法象一般FORM那样将参数传到另一页面，需要通过特定的方式，否则和第一种方式无异。&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、Session方式&nbsp;&nbsp;<br>传统方式之一，对于特定的环境有利，释放也比较容易&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、通过接口或类的方式实现。我们主要讨论一下这个方法。&nbsp;&nbsp;<br>基于WEB方式，使用变量传递必须要使用私有变量，因为很简单，如果你使用公有或静态变量，那会出现极大的混乱，朋友们可以考虑一下为什么？&nbsp;&nbsp;<br>如果用类的属性，一个问题是对象的生存时间和范围限制我们不能以私有的方式来进行传递。&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面是结合一些SDK中的一些方法写的一个例子，供参考：&nbsp;&nbsp;<br><br>说明：为了进行更大数量和类型的参数的传递，也是chequan朋友的问题，考虑使用结构来实现。结构有其好处，合理使用，应该不会造成太大的资源占用，特别是在这种传递上。有想法的朋友也可以一起讨论一下结构的使用。&nbsp;&nbsp;<br>例子：&nbsp;&nbsp;<br>做一个类文件，为Trancfer.cs，内容如下：&nbsp;&nbsp;<br>using System;&nbsp;&nbsp;<br><br>namespace WEBLOG.Class&nbsp;&nbsp;<br>{&nbsp;&nbsp;<br>&nbsp;&nbsp; /// &lt;summary&gt;&nbsp;&nbsp;<br>&nbsp;&nbsp; /// 定义一个结构，需要传递的内容可以由自己来定义，可以定义多个结构，以适合自己的需要&nbsp;&nbsp;<br>&nbsp;&nbsp; /// &lt;/summary&gt;&nbsp;&nbsp;<br>&nbsp;&nbsp; public struct NormalUserRegInfo&nbsp;&nbsp;<br>&nbsp;&nbsp; {&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public string UserName;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public string UserPassWord;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public string Quesion;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public string Answer;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public string UserEmail;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public string UserClass;&nbsp;&nbsp;<br>&nbsp;&nbsp; }&nbsp;&nbsp;<br><br>&nbsp;&nbsp; /// &lt;summary&gt;&nbsp;&nbsp;<br>&nbsp;&nbsp; /// 此接口定义了一个返回所需传递对象的属性&nbsp;&nbsp;<br>&nbsp;&nbsp; /// 发送对象的页面必须实现此接口&nbsp;&nbsp;<br>&nbsp;&nbsp; /// &lt;/summary&gt;&nbsp;&nbsp;<br>&nbsp;&nbsp; public interface ITransferface&nbsp;&nbsp;<br>&nbsp;&nbsp; {&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TrancferClass TranceferObject{get;set;}&nbsp;&nbsp;<br>&nbsp;&nbsp; }&nbsp;&nbsp;<br><br>&nbsp;&nbsp; /// &lt;summary&gt;&nbsp;&nbsp;<br>&nbsp;&nbsp; /// Trancfer 的摘要说明。&nbsp;&nbsp;<br>&nbsp;&nbsp; /// &lt;/summary&gt;&nbsp;&nbsp;<br>&nbsp;&nbsp; public class TrancferClass&nbsp;&nbsp;<br>&nbsp;&nbsp; {&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public TrancferClass()&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TOD 在此处添加构造函数逻辑&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private NormalUserRegInfo _strMessage;&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public NormalUserRegInfo TranceferMessage&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return this._strMessage;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this._strMessage = value;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br><br>&nbsp;&nbsp; }&nbsp;&nbsp;<br>}&nbsp;&nbsp;<br><br>有了这个类，就可以在页面中进行操作了，&nbsp;&nbsp;<br>假设我们有一个页面，名为Set.aspx，通过一个Button将一些参数发到Get.aspx页面中，&nbsp;&nbsp;<br>这两个页面的相关代码如下：&nbsp;&nbsp;<br>====================&nbsp;&nbsp;<br>Set.aspx.cs&nbsp;&nbsp;<br>====================&nbsp;&nbsp;<br>using System;&nbsp;&nbsp;<br>using System.Collections;&nbsp;&nbsp;<br>using System.ComponentModel;&nbsp;&nbsp;<br>using System.Data;&nbsp;&nbsp;<br>using System.Drawing;&nbsp;&nbsp;<br>using System.Web;&nbsp;&nbsp;<br>using System.Web.SessionState;&nbsp;&nbsp;<br>using System.Web.UI;&nbsp;&nbsp;<br>using System.Web.UI.WebControls;&nbsp;&nbsp;<br>using System.Web.UI.HtmlControls;&nbsp;&nbsp;<br>using WEBLOG.Class;&nbsp;&nbsp;<br><br>namespace WEBLOG&nbsp;&nbsp;<br>{&nbsp;&nbsp;<br>&nbsp;&nbsp; /// &lt;summary&gt;&nbsp;&nbsp;<br>&nbsp;&nbsp; /// Set 的摘要说明。&nbsp;&nbsp;<br>&nbsp;&nbsp; /// &lt;/summary&gt;&nbsp;&nbsp;<br>&nbsp;&nbsp; public class Set : System.Web.UI.Page,ITransferface&nbsp;&nbsp;<br>&nbsp;&nbsp; {&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected System.Web.UI.WebControls.Button Button1;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private TrancferClass _temptrancefer;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private void Page_Load(object sender, System.EventArgs e)&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 在此处放置用户代码以初始化页面&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _temptrancefer = new TrancferClass();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#region Web 窗体设计器生成的代码&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;override protected void OnInit(EventArgs e)&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeComponent();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.OnInit(e);&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;summary&gt;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// 设计器支持所需的方法 - 不要使用代码编辑器修改&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// 此方法的内容。&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;/summary&gt;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private void InitializeComponent()&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Button1.Click += new System.EventHandler(this.Button1_Click);&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Load += new System.EventHandler(this.Page_Load);&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endregion&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//实现ITransferface接口&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public TrancferClass TranceferObject&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return this._temptrancefer;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this._temptrancefer = value;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private void Button1_Click(object sender, System.EventArgs e)&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义一个结构，传递这个结构&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NormalUserRegInfo temptest = new NormalUserRegInfo();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temptest.Answer="AAAAAAAAAAAAAAAA";&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temptest.Quesion="BBBBBBBBBBBBB";&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temptest.UserName="CCCCCCCCCCCCCCCCC";&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temptest.UserPassWord="DDDDDDDDDDDDDDDDDDDDDDDDD";&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.TranceferObject.TranceferMessage = temptest;&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调用Server.Transfer()，转向执行Get.aspx&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Server.Transfer("Get.aspx");&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp; }&nbsp;&nbsp;<br>}&nbsp;&nbsp;<br><br>====================&nbsp;&nbsp;<br>Get.aspx.cs&nbsp;&nbsp;<br>====================&nbsp;&nbsp;<br>using System.Data;&nbsp;&nbsp;<br>using System.Drawing;&nbsp;&nbsp;<br>using System.Web;&nbsp;&nbsp;<br>using System.Web.SessionState;&nbsp;&nbsp;<br>using System.Web.UI;&nbsp;&nbsp;<br>using System.Web.UI.WebControls;&nbsp;&nbsp;<br>using System.Web.UI.HtmlControls;&nbsp;&nbsp;<br>using WEBLOG.Class;&nbsp;&nbsp;<br><br>namespace WEBLOG&nbsp;&nbsp;<br>{&nbsp;&nbsp;<br>&nbsp;&nbsp; /// &lt;summary&gt;&nbsp;&nbsp;<br>&nbsp;&nbsp; /// Receiver 的摘要说明。&nbsp;&nbsp;<br>&nbsp;&nbsp; /// &lt;/summary&gt;&nbsp;&nbsp;<br>&nbsp;&nbsp; public class Get : System.Web.UI.Page&nbsp;&nbsp;<br>&nbsp;&nbsp; {&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private void Page_Load(object sender, System.EventArgs e)&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ITransferface mySender;&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!IsPostBack)&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//判断当前页面的HttpHandler，如果实现了ITransferface接口&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//就转换成ITransferface&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(Context.Handler is ITransferface)&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySender = (ITransferface)Context.Handler;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NormalUserRegInfo tempreceive =mySender.TranceferObject.TranceferMessage;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(tempreceive.Answer + "&lt;BR&gt;");&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(tempreceive.Quesion + "&lt;BR&gt;");&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(tempreceive.UserName + "&lt;BR&gt;");&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(tempreceive.UserPassWord + "&lt;BR&gt;");&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write("没有接收到任何参数");&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#region Web 窗体设计器生成的代码&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;override protected void OnInit(EventArgs e)&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeComponent();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.OnInit(e);&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;summary&gt;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// 设计器支持所需的方法 - 不要使用代码编辑器修改&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// 此方法的内容。&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;/summary&gt;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private void InitializeComponent()&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Load += new System.EventHandler(this.Page_Load);&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endregion&nbsp;&nbsp;<br><br>&nbsp;&nbsp; }&nbsp;&nbsp;<br>}&nbsp;&nbsp;<br>
<img src ="http://www.cppblog.com/andxie99/aggbug/14271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/andxie99/" target="_blank">思勤无邪</a> 2006-10-27 10:12 <a href="http://www.cppblog.com/andxie99/archive/2006/10/27/14271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>