淺析ASP.NET編程中十大技巧

來源:互聯網
上載者:User
在本篇檔案中,我們將討論編程人員在使用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都使用代碼支援檔案。代碼支援檔案使工程具有更好的組織、模組性,更適合多人組成的Team Dev。另外,它還會帶來效能的提高。
  
  代碼支援檔案的內容被編譯成一個組合檔案中的類,一般是一個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的隱藏欄位中,並在每次回送中都會被傳遞,這會引起嚴重的效能下降。
  
                                                                                                                本文轉載於‘中國IT實驗室’

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.