在使用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的一個功能是無論是類控件或表單中的對象它都能夠為新對象提供缺省名字例如如果我們創建了一個新的ASPNET Web Application其缺省的名字將是WebApplication我們可以在“新工程”對話框中方便地改變該應用的名字但同時改變的只是該應用程序的名字空間的名字及其所在的虛擬目錄源代碼文件的缺省名字仍然是WebFormaspx和WebFormaspxcs(C#工程)或WebFormaspxvb(VBNET工程)
我們可以在方案浏覽器中改變ASPX和代碼使用的文件名字但Web頁類的名字仍然將是WebForm如果在該Web表單上生成一個按鈕其缺省的名字將是Button事實上所有控件的名字都是由控件的類型和數字組成的
我們能夠也應該將應用程序中所有的表單和控件的名字都修改成有意義的名字對於較小的演示性程序而言缺省的名字還能夠勝任但如果應用程序由多個表單每個表單上有許多按鈕和標簽時象frmStartupfrmDataEntry和frmReports這樣的表單名就比FormForm和Form這樣的名字更易於理解和維護
如果表單上控件要在代碼的其他地方引用使它有一個有意義的名字就更重要了btnOKbtnCancel和btnPrint這樣的名字使看代碼的人更容易理解因而也比名字為ButtonButtonButton這樣的控件更容易維護
修改一個工程中所有文件中出現的一個名字的一個好方法是在Visual Studio NET菜單中依次選擇“編輯”>“發現和替換”>“替換”命令
在看二周前編寫的代碼時我們經常就象第一次見到這些代碼一樣因此使它們有一個有助於我們理解其含義的名字是十分有必要的
即使不使用Visual Studio NET進行編程使用代碼支持文件也有利於提高應用程序的性能
在Web應用程序Web服務或Web控件等所有的ASPNET Web工程中Visual Studio NET都使用代碼支持文件代碼支持文件使工程具有更好的組織模塊性更適合多人組成的開發團隊另外它還會帶來性能的提高
代碼支持文件的內容被編譯成一個組合文件中的類一般是一個DLL文件有時也可以是EXE文件該文件駐留在應用程序的組合體高速緩沖區中在應用程序啟動時可以立即得到它
如果代碼是包含在<script>標記中或ASPX文件代碼中它仍然會被編譯成一個Web頁類在這種情況下每當該網頁在應用程序對話中第一次加載時都需要重新進行編譯被編譯的類就會駐留在內存中每當計算機啟動IIS停止重新啟動或者源代碼配置文件改變時該文件必須重新編譯盡管不大但這樣引起的性能損耗也是相當可觀的
盡量減少表單回送
每當點擊Web網頁上的ButtonLinkButton或ImageButton控件時表單就會被發送到服務器上如果控件的AutoPostBack屬性被設置為true如果CheckBoxCheckBoxList等控件的狀態被改變後也會使表單會發送回服務器
每次當表單被發送回服務器就會被重新加載啟動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 = DateTimeNow;
for (int i=; i < intLimit; i++)
{
strSub = iToString();
strWhole = strWhole + " " + strSub;
}
endTime = DateTimeNow;
elapsedTime = endTime startTime;
lblConcatText = elapsedTimeToString();
// lblConcatStringText = strWhole;
// 使用stringBuilder類進行同樣的操作
startTime = DateTimeNow;
StringBuilder sb = new StringBuilder();
for (int i=; i < intLimit; i++)
{
strSub = iToString();
sbAppend(" ");
sbAppend(strSub);
}
endTime = DateTimeNow;
elapsedTime = endTime startTime;
lblBuildText = elapsedTimeToString();
// lblBuildStringText = sbToString();
}
</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方法的速度比使用字符串連接的速度快近倍比較的結果如下所示
(圖picture)
只在必要時使用服務器端控件
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的隱藏域中並在每次回送中都會被傳遞這會引起嚴重的性能下降
在這方面的一個很好的例子是網頁上控件表格的應用如果不需要在代碼中引用表格中的元素則使用無需進行服務器端處理的HTML表格我們仍然可以在HTML表格單元中放置服務器控件並在代碼中引用服務器控件如果需要引用任意的表格元素例如指定的單元則整個表格必須是服務器控件
HyperLink控件LinkButton控件的差別
對於Web訪問者而言HyperLinkLinkButton控件是一樣的但它們在功能方面仍然有較大的差異
當用戶點擊控件時HyperLink控件會立即將用戶“導航”到目標URL表件不會回送到服務器上LinkButton控件則首先將表件發回到服務器然後將用戶導航到目標URL如果在“到達”目標URL之前需要進行服務器端處理則使用LinkButton控件如果無需進行服務器端處理則可以使用HyperLink控件
注釋代碼
這一技巧並不是針對ASPNET的但它是一個良好的編程習慣
注釋不僅僅應當說明代碼會執行什麼操作還應當注明原因例如不要僅僅在注釋中說明是在遍歷數組而是要說明遍歷數組是根據某一算法計算一個值除非算法是相當簡單的否則還應當對算法進行簡要的說明
NET工程中的不同的編程語言都有各自不同的注釋符號下面是一個簡要的說明
HTML <! 注釋 >
JavaScript // 注釋
VBScript 注釋
VBNET 注釋
C# // 注釋
/* 多行內容
的注釋
*/
SQL 注釋
在服務器控件的開始和結束標記中沒有注釋符號但服務器能夠忽略掉所有它不能識別的屬性因此我們能夠通過使用沒有定義的屬性來插入注釋下面是一個例子
<asp:TextBox
id="txtLastName"
size=""
comment="這是我的注釋"
runat="server" />
在Visual Studio NET中對源代碼進行注釋非常簡單高亮度顯示需要注釋的行然後按Ctrl+K+C組合鍵添加注釋要刪除注釋只需高亮度顯示被注釋的代碼並按下Ctrl+K+U組合鍵
在C#工程中我們還可以通過在每行的開始處使用///輸入XML注釋小節在注釋小節中我們可以使用下面的XML標記組織注釋
<summary></summary>
<remarks></remarks >
<param></param>
<returns></returns>
<newpara></newpara>
要在Visual Studio NET中查看這些XML注釋的格式化的報告我們可以首先選擇“工具”菜單項然後選擇“建立注釋Web網頁”菜單項
使用trace方法和trace屬性記錄Page目錄中網頁的執行情況
調試程序的一種古老的技術是在程序中的關健點插入輸出語句通常情況下輸出信息中會包含重要變量的值相關信息可以輸出到屏幕日志文件或者數據庫
在ASPNET中通過使用Page命令中的trace屬性這種調試技術的使用更簡單了Page命令是ASPX文件開始處的一行代碼它提供編譯器的指示Page命令中包含一個或多個屬性向編譯器提供使用的編程語言代碼支持文件的位置或要繼承的類的名字等信息
Page命令中的屬性之一是trace其值可能是true或false下面是一個典型的Page命令其中的trace屬性的值是true
<%@ Page language="c#" trace="true" %>
如果trace屬性的值設置為true由ASPX文件生成的Web頁就會顯示出來除了網頁本身外關於該頁的大量其他信息也會顯示出來這些信息以下面小節的形式顯示在一張表格中
·Request細節 提供Session ID請求時間和請求的狀態碼
·Trace Information 包含跟蹤日志網頁生命周期中按時間先後順序各個步驟的列表另外也可以向其中添加定制信息
·控件樹 以一種分層次的方式列出網頁上的所有控件包括每個控件以字節計算的大小
·Cookies集合 列出該網頁創建的所有Cookie
·頭部集合 HTTP頭部以及它們的值
·Server變量 與該網頁相關的Server環境變量
包含在Trace Information小節中的跟蹤日志是最有用的在這裡我們可以插入自己的跟蹤命令trace類中有個方法能夠在跟蹤日志中插入命令TraceWrite和TraceWarn除了TraceWarn命令用紅色字體顯示TraceWrite命令用黑色字體顯示外它們是相同的下面是跟蹤日志的一個屏幕快照其中包含有幾個TraceWarn命令
跟蹤日志中最方便的功能是我們可以在開發和測試過程中在整個代碼中插入TraceWrite和TraceWarn語句而在最終交付應用程序時可以通過改變Page命令中trace屬性的值禁止這些命令起作用而無需在部署應用軟件前刪除這些輸出語句
使用存儲過程
微軟公司的SQL Server和其他現代關系數據庫都使用SQL命令定義和處理查詢一個SQL語句或一系列SQL語句提交給SQL ServerSQL Server會對命令進行解析然後創建一個查詢計劃並對它進行優化然後執行該查詢計劃這都需要大量的時間
存儲過程是一系列被查詢處理器預解析和優化的SQL命令這些命令會被存儲起來可以得到快速地執行存儲過程也被稱作sprocs它可以接收輸入參數使一個單一的存儲過程能夠處理較大范圍的特定的查詢
因為sprocs是預先被解析的對於復雜的查詢更顯得重要其查詢計劃是預先優化的因此調用查詢過程比執行相同功能的SQL語句速度要快得多
使用NET命令行
NET命令行工具在命令提示符窗口中運行為了使命令能夠執行它必須駐留在命令提示符的當前目錄中或通過設置PATH環境變量
NET SDK在“啟動”菜單上安裝一個菜單項該菜單項能夠打開一個正確設置了PATH環境變量的命令提示符窗口我們可以通過依次點擊“開始”>“程序”>“Microsoft Visual Studio NET”>“Visual Studio NET工具”>“Visual Studio NET命令提示符”啟動命令提示符窗口
通過在將該菜單項從菜單上拖到桌面上時同時按Ctrl+C鍵就可以將該菜單項的快捷方式拷貝到桌面上使用起來會非常方便
-
From:http://tw.wingwit.com/Article/program/net/201311/14216.html