ASP.NET程式設計中的十大技巧

 
     在本篇文件中,我們將討論程式設計人員在使用ASP.NET開發應用程式時需要注意的10個技巧,這些技巧涉及從缺省的控件、表單名的改變到StringBuilder類的使用,有助於程式設計人員能夠儘快地適應.NET環境。
  
  1、在使用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這樣的表單名就比Form1、Form2和Form3這樣的名字更易於理解和維護。
  如果表單上控件要在代碼的其他地方引用,使它有一個有意義的名字就更重要了。btnOK、btnCancel和btnPrint這樣的名字使看代碼的人更容易理解,因而,也比名字為Button1、Button2、Button3這樣的控件更容易維護。
        修改一個工程中所有文件中出現的一個名字的一個好方法是,在Visual Studio .NET菜單中依次選擇“編輯”->“發現和替換”->“替換”命令。
  在看二周前編寫的代碼時,我們經常就象第一次見到這些代碼一樣,因此使它們有一個有助於我們理解其含義的名字是十分有必要的。
  
  
  2、即使不使用Visual Studio .NET進行程式設計,使用代碼支援文件也有利於提高應用程式的性能   
       在Web應用程式、Web服務或Web控件等所有的ASP.NET Web工程中,Visual Studio .NET都使用代碼支援文件。代碼支援文件使工程具有更好的組織、模組性,更適合多人組成的開發團隊。另外,它還會帶來性能的提高。
       代碼支援文件的內容被編譯成一個組合文件中的類,一般是一個DLL文件,有時也可以是EXE文件。該文件駐留在應用程式的組合體高速緩衝區中,在應用程式啟動時,可以立即得到它。
        如果代碼是包含在<script>標記中或ASPX文件代碼中,它仍然會被編譯成一個Web頁類。在這種情況下,每當該網頁在應用程式對話中第一次加載時,都需要重新進行編譯,被編譯的類就會駐留在記憶體中。每當電腦啟動、IIS停止、重新啟動或者源代碼、配置文件改變時,該文件必須重新編譯。儘管不大,但這樣引起的性能損耗也是相當可觀的。
  
  
  3、儘量減少表單回送
        每當點擊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
  {
  // 回送時執行的操作
  }
  // 網頁每次加載時執行的操作
  }
  我們希望儘量不引起回送(每次回送都會要求伺服器進行一系列的操作),即使引起回送後。也希望能夠執行儘量少的操作。大規模、浪費時間的操作(例如資料庫查找)尤其應當避免,因為它們能夠延長應用程式的響應時間。
  
  
  4、使用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倍。
  
  
  5、隻在必要時使用伺服器端控件   
        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控件。
  
  
  7、注釋代碼
        這一技巧並不是針對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網頁”菜單項。
  
  
  8、使用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屬性的值,禁止這些命令起作用,而無需在部署應用軟體前刪除這些輸出語句。
  
  
  9、使用存儲過程 
       微軟公司的SQL Server和其他現代關係資料庫都使用SQL命令定義和處理查詢。一個SQL語句或一系列SQL語句提交給SQL Server,SQL Server會對命令進行解析,然後創建一個查詢計劃並對它進行優化,然後執行該查詢計劃,這都需要大量的時間。
       存儲過程是一系列被查詢處理器預解析和優化的SQL命令,這些命令會被存儲起來,可以得到快速地執行。存儲過程也被稱作sprocs,它可以接收輸入參數,使一個單一的存儲過程能夠處理較大範圍的特定的查詢。
       因為sprocs是預先被解析的,對於複雜的查詢更顯得重要,其查詢計劃是預先優化的,因此調用查詢過程比執行相同功能的SQL語句速度要快得多。
  
  10、使用.NET命令行
       .NET命令行工具在命令提示符窗口中運行。為了使命令能夠執行,它必須駐留在命令提示符的目前工作目錄中,或透過設定PATH環境變量。
      .NET SDK在“啟動”菜單上裝設一個菜單項,該菜單項能夠打開一個正確設定了PATH環境變量的命令提示符窗口。我們可以透過依次點擊“開始”->“程式”->“Microsoft Visual Studio .NET”->“Visual Studio .NET工具”->“Visual Studio .NET命令提示符”,啟動命令提示符窗口。
       透過在將該菜單項從菜單上拖到桌面上時,同時按Ctrl+C鍵,就可以將該菜單項的快捷方式拷貝到桌面上,使用起來會非常方便。
 
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值