在本篇文件中
我們將討論編程人員在使用ASP
NET開發應用程序時需要注意的
個技巧
這些技巧涉及從缺省的控件
表單名的改變到StringBuilder類的使用
有助於編程人員能夠盡快地適應
NET環境
在使用Visual Studio NET時除直接或非引用的對象外不要使用缺省的名字 NET帶來的好處之一是所有的源代碼和配置文件都是純文本文件
能夠使用Notepad或WordPad等任意的文本編輯器進行編輯
如果不願意
我們並非一定要使用Visual Studio
NET作為集成開發環境
但使用了Visual Studio
NET
我們可以在Windows文件管理器中看到文件
或在Visual Studio
NET之外從文本編輯器中浏覽文件的內容
使用Visual Studio
NET作為集成開發環境有許多好處
其中最顯著的好處是它極大地提高了生產效率
使用Visual Studio
NET
我們能夠在付出較小代價的情況下更快地開發軟件
作為集成開發環境一部分的IntelliSense提供自動的代碼完成
在輸入方法或函數時提供動態幫助
語法錯誤的實時提示
以及其他能夠提高生產效率的功能
象其他復雜的工具那樣
在學會如何充分發揮它的作用和掌握其
習性
前
Visual Studio
NET也會使我們產生一種挫折感
有時
它象一個難以了解的黑盒子
會生成大量的文件和許多無用的代碼
Visual Studio
NET的一個功能是
無論是類
控件或表單中的對象
它都能夠為新對象提供缺省名字
例如
如果我們創建了一個新的ASP
NET Web Application
其缺省的名字將是WebApplication
我們可以在
新工程
對話框中方便地改變該應用的名字
但同時改變的只是該應用程序的名字空間的名字及其所在的虛擬目錄
源代碼文件的缺省名字仍然是WebForm
aspx和WebForm
aspx
cs(C#工程)或WebForm
aspx
vb(VB
NET工程)
我們可以在方案浏覽器中改變ASPX和代碼使用的文件名字
但Web頁類的名字仍然將是WebForm
如果在該Web表單上生成一個按鈕
其缺省的名字將是Button
事實上
所有控件的名字都是由控件的類型和數字組成的
我們能夠
也應該將應用程序中所有的表單和控件的名字都修改成有意義的名字
對於較小的演示性程序而言
缺省的名字還能夠勝任
但如果應用程序由多個表單
每個表單上有許多按鈕和標簽時
象frmStartup
frmDataEntry和frmReports這樣的表單名就比Form
Form
和Form
這樣的名字更易於理解和維護
如果表單上控件要在代碼的其他地方引用
使它有一個有意義的名字就更重要了
btnOK
btnCancel和btnPrint這樣的名字使看代碼的人更容易理解
因而
也比名字為Button
Button
Button
這樣的控件更容易維護
修改一個工程中所有文件中出現的一個名字的一個好方法是
在Visual Studio
NET菜單中依次選擇
編輯
>
發現和替換
>
替換
命令
在看二周前編寫的代碼時
我們經常就象第一次見到這些代碼一樣
因此使它們有一個有助於我們理解其含義的名字是十分有必要的
即使不使用Visual Studio NET進行編程使用代碼支持文件也有利於提高應用程序的性能 在Web應用程序
Web服務或Web控件等所有的ASP
NET Web工程中
Visual Studio
NET都使用代碼支持文件
代碼支持文件使工程具有更好的組織
模塊性
更適合多人組成的開發團隊
另外
它還會帶來性能的提高
代碼支持文件的內容被編譯成一個組合文件中的類
一般是一個DLL文件
有時也可以是EXE文件
該文件駐留在應用程序的組合體高速緩沖區中
在應用程序啟動時
可以立即得到它
如果代碼是包含在<script>標記中或ASPX文件代碼中
它仍然會被編譯成一個Web頁類
在這種情況下
每當該網頁在應用程序對話中第一次加載時
都需要重新進行編譯
被編譯的類就會駐留在內存中
每當計算機啟動
IIS停止
重新啟動或者源代碼
配置文件改變時
該文件必須重新編譯
盡管不大
但這樣引起的性能損耗也是相當可觀的
盡量減少表單回送 每當點擊Web網頁上的Button
LinkButton或ImageButton控件時
表單就會被發送到服務器上
如果控件的AutoPostBack屬性被設置為true
如果CheckBox
CheckBoxList等控件的狀態被改變後
也會使表單會發送回服務器
每次當表單被發送回服務器
就會被重新加載
啟動Page_Load事件
執行Page_Load事件處理程序中的所有代碼
把網頁的初始化代碼放在這裡是最合適不過的了
我們經常會希望在每次加載網頁時執行一些代碼
而希望只有在網頁第一次加載時執行另一些代碼
甚至希望一些代碼在除首次加載外的每次加載時執行
可以利用IsPostBack特性來完成這一功能
在網頁第一次加載時
該屬性的值是false
如果網頁因回送而被重新加載
IsPostBack屬性的值就會被設置為true
通過測試
可以在任意時候執行指定的代碼
下面是相關的C#代碼
protected void Page_Load(Object sender
EventArgs e)
{
// 網頁每次加載時
執行的一些操作
if (!IsPostBack)
{
// 網頁第一次加載時執行的操作
}
else
{
// 回送時執行的操作
}
// 網頁每次加載時執行的操作
}
我們希望盡量不引起回送(每次回送都會要求服務器進行一系列的操作)
即使引起回送後
也希望能夠執行盡量少的操作
大規模
浪費時間的操作(例如數據庫查找)尤其應當避免
因為它們能夠延長應用程序的響應時間
使用StringBuilder類 字符串在
NET框架中是不可變的
這意味著改變字符串的操作符和方法會返回字符串的改變後的拷貝
這意味著性能還有提高的空間
當進行大量的字符串操作時
使用StringBuilder類就是一種比較好的選擇了
下面的C#代碼測試用二種方式從
個子字符串中生成字符串所需要的時間
第一次使用了一個簡單的字符串串聯操作
第二次使用了StringBuilder類
要想查看結果字符串
可以去掉下面的代碼中注解行的注解符號
<%@ Page Language=
C#
%>
<script runat=
server
>
void Page_Load(Object Source
EventArgs E)
{
int intLimit =
;
DateTime startTime;
DateTime endTime;
TimeSpan elapsedTime;
string strSub;
string strWhole =
;
// 首先執行字符串連接操作
startTime = DateTime
Now;
for (int i=
; i < intLimit; i++)
{
strSub = i
ToString();
strWhole = strWhole +
+ strSub;
}
endTime = DateTime
Now;
elapsedTime = endTime
startTime;
lblConcat
Text = elapsedTime
ToString();
// lblConcatString
Text = strWhole;
// 使用stringBuilder類進行同樣的操作
startTime = DateTime
Now;
StringBuilder sb = new StringBuilder();
for (int i=
; i < intLimit; i++)
{
strSub = i
ToString();
sb
Append(
);
sb
Append(strSub);
}
endTime = DateTime
Now;
elapsedTime = endTime
startTime;
lblBuild
Text = elapsedTime
ToString();
// lblBuildString
Text = sb
ToString();
}
</script>
<html>
<body>
<form runat=
server
>
<h
>String Concatenation Benchmark</h
>
Concatenation:
<asp:Label
id=
lblConcat
runat=
server
/>
<br/>
<asp:Label
id=
lblConcatString
runat=
server
/>
<br/>
<br/>
StringBuilder:
<asp:Label
id=
lblBuild
runat=
server
/>
<br/>
<asp:Label
id=
lblBuildString
runat=
server
/>
</form>
</body>
</html>
二種方式的差別是相當大的
使用StringBuilder類的Append方法的速度比使用字符串連接的速度快近
倍
只在必要時使用服務器端控件ASPNET中新引入了一種在服務器端運行的被稱作Web Server Controls的控件 在代碼中
它們經常通過下面的語法被說明
<asp:TextBox id=
txtLastName
size=
runat=
server
/>
它們有時也被稱作ASP控件
服務器端控件是由runat屬性指示的
它的值總是
server
通過添加runat屬性
一般的HTML控件可以被很方便地轉換到服務器端運行
下面是一個簡單的例子
<input type=
text
id=
txtLastName
size=
runat=
server
/>
可以通過id屬性中指定的名字
我們可以引用程序中的控件
可以通過編程的方式設置屬性和獲得值
因此
服務器端處理方式有較大的靈活性
這種靈活性是有一定代價的
每種服務器端控件都會消耗服務器上的資源
另外
除非控件
網頁或應用程序明確地禁止view state
控件的狀態是包含在view state的隱藏域中
並在每次回送中都會被傳遞
這會引起嚴重的性能下降
在這方面的一個很好的例子是
網頁上控件表格的應用
From:http://tw.wingwit.com/Article/program/ASP/201311/21790.html