一、在使用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,其缺省的名字將是WebApplication1。咱們能夠在「新工程」對話框中方便地改變該應用的名字,但同時改變的只是該應 用程序的名字空間的名字及其所在的虛擬目錄,源代碼文件的缺省名字仍然是WebForm1.aspx和WebForm1.aspx.cs(C#工程)或WebForm1.aspx.vb(VB.NET工程)。
咱們能夠在方案瀏覽器中改變ASPX和代碼使用的文件名字,但Web頁類的名字仍然將是WebForm1。若是在該Web表單上生成一個按鈕,其缺省的名字將是Button1。事實上,全部控件的名字都是由控件的類型和數字組成的。
咱們可以,也應該將應用程序中全部的表單和控件的名字都修改爲有意義的名字。對於較小的演示性程序而言,缺省的名字還可以勝任,但若是應用程序由多個表 單,每一個表單上有許多按鈕和標籤時,象frmStartup、frmDataEntry和frmReports這樣的表單名就比Form一、Form2和 Form3這樣的名字更易於理解和維護。
若是表單上控件要在代碼的其餘地方引用,使它有一個有意義的名字就更重要了。btnOK、btnCancel和btnPrint這樣的名字使看代碼的人更容易理解,於是,也比名字爲Button一、Button二、Button3這樣的控件更容易維護。
修改一個工程中全部文件中出現的一個名字的一個好方法是,在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#代碼
測試用二種方式從10000個子字符串中生成字符串所須要的時間。第一次使用了一個簡單的字符串串聯操做;第二次使用了StringBuilder類。要想查看結果字符串,能夠去掉下面的代碼中註解行的註解符號:
<%@ Page Language="C#" %>
<script runat="server">
void Page_Load(Object Source, EventArgs E)
{
int intLimit = 10000;
DateTime startTime;
DateTime endTime;
TimeSpan elapsedTime;
string strSub;
string strWhole = "";
// 首先執行字符串鏈接操做
startTime = DateTime.Now;
for (int i=0; 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=0; 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">
<h1>String Concatenation Benchmark</h1>
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方法的速度比使用字符串鏈接的速度快近200倍。比較的結果以下所示:
(圖:picture01)
五、只在必要時使用服務器端控件
ASP.NET中新引入了一種在服務器端運行的被稱做Web Server Controls的控件,在代碼中,它們常常經過下面的語法被說明:
<asp:TextBox id="txtLastName" size="40" runat="server" />
它們有時也被稱做ASP控件。服務器端控件是由runat屬性指示的,它的值老是「server」。
經過添加runat屬性,通常的HTML控件能夠被很方便地轉換到服務器端運行,下面是一個簡單的例子:
<input type="text" id="txtLastName" size="40" runat="server" />
能夠經過id屬性中指定的名字,咱們能夠引用程序中的控件,能夠經過編程的方式設置屬性和得到值,所以,服務器端處理方式有較大的靈活性。
這種靈活性是有必定代價的。每種服務器端控件都會消耗服務器上的資源。另外,除非控件、網頁或應用程序明確地禁止view state,控件的狀態是包含在view state的隱藏域中,並在每次回送中都會被傳遞,這會引發嚴重的性能降低。
在這方面的一個很好的例子是,網頁上控件表格的應用,若是不須要在代碼中引用表格中的元素,則使用無需進行服務器端處理的HTML表格。咱們仍然能夠在 HTML表格單元中放置服務器控件,並在代碼中引用服務器控件。若是須要引用任意的表格元素,例如指定的單元,則整個表格必須是服務器控件。
6. HyperLink控件、LinkButton控件的差異
對於Web訪問者而言,HyperLink、LinkButton控件是同樣的,但它們在功能方面仍然有較大的差別。
當用戶點擊控件時,HyperLink控件會當即將用戶「導航」到目標URL,表件不會回送到服務器上。LinkButton控件則首先將表件發回到服務 器,而後將用戶導航到目標URL。若是在「到達」目標URL以前須要進行服務器端處理,則使用LinkButton控件;若是無需進行服務器端處理,則可 以使用HyperLink控件。
七、註釋代碼
這一技巧並非針對ASP.NET的,但它是一個良好的編程習慣。
註釋不只僅應當說明代碼會執行什麼操做,還應當註明緣由。例如,不要僅僅在註釋中說明是在遍歷數組,而是要說明遍歷數組是根據某一算法計算一個值,除非算法是至關簡單的,不然還應當對算法進行簡要的說明。
.NET工程中的不一樣的編程語言都有各自不一樣的註釋符號,下面是一個簡要的說明:
HTML <!-- 註釋 -->
JavaScript // 註釋
VBScript ' 註釋
VB.NET ' 註釋
C# // 註釋
/* 多行內容
的註釋
*/
SQL -- 註釋
在服務器控件的開始和結束標記中沒有註釋符號,但服務器可以忽略掉全部它不能識別的屬性,所以咱們可以經過使用沒有定義的屬性來插入註釋。下面是一個例子:
<asp:TextBox
id="txtLastName"
size="40"
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目錄中網頁的執行狀況
調試程序的一種古老的技術是在程序中的關健點插入輸出語句,一般狀況下,輸出信息中會包含重要變量的值,相關信息能夠輸出到屏幕、日誌文件或者數據庫。
在ASP.NET中,經過使用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類中有2個方法可以在跟蹤日誌中插入命 令:Trace.Write和Trace.Warn,除了Trace.Warn命令用紅色字體顯示、Trace.Write命令用黑色字體顯示外,它們是 相同的。下面是跟蹤日誌的一個屏幕快照,其中包含有幾個Trace.Warn命令。
跟蹤日誌中最方便的功能是咱們能夠在開發和測試過程當中在整個代碼中插入Trace.Write和Trace.Warn語句,而在最終交付應用程序時,能夠經過改變Page命令中trace屬性的值,禁止這些命令起做用,而無需在部署應用軟件前刪除這些輸出語句。
九、使用
存儲過程
微軟公司的SQL Server和其餘現代關係數據庫都使用SQL命令定義和處理查詢。一個SQL語句或一系列SQL語句提交給SQL Server,SQL Server會對命令進行解析,而後建立一個查詢計劃並對它進行優化,而後執行該查詢計劃,這都須要大量的時間。
存儲過程是一系列被查詢處理器預解析和優化的SQL命令,這些命令會被存儲起來,能夠獲得快速地執行。存儲過程也被稱做sprocs,它能夠接收輸入參數,使一個單一的存儲過程可以處理較大範圍的特定的查詢。 由於sprocs是預先被解析的,對於複雜的查詢更顯得重要,其查詢計劃是預先優化的,所以調用查詢過程比執行相同功能的SQL語句速度要快得多。 十、使用。NET命令行 .NET命令行工具在命令提示符窗口中運行。爲了使命令可以執行,它必須駐留在命令提示符的當前目錄中,或經過設置PATH環境變量。 .NET SDK在「啓動」菜單上安裝一個菜單項,該菜單項可以打開一個正確設置了PATH環境變量的命令提示符窗口。咱們能夠經過依次點擊「開始」->「程 序」->「Microsoft Visual Studio .NET」->「Visual Studio .NET工具」->「Visual Studio .NET命令提示符」,啓動命令提示符窗口。 經過在將該菜單項從菜單上拖到桌面上時,同時按Ctrl+C鍵,就能夠將該菜單項的快捷方式拷貝到桌面上,使用起來會很是方便。