成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

.NET內存管理的最佳實踐

譯文
開發 后端
.NET應用程序中常會處理服務器上大量的內存,此時避免內存浪費是開發中需要注意的問題。本文詳細介紹了.NET內存管理的最佳實踐,從代碼編寫到線程的使用,能夠顯著減少內存的浪費。

【51CTO精選譯文】我們在實際編程中使用的內存往往都會超出程序需要的內存,對于桌面應用程序內存是相對廉價的,但如果你在開發ASP.NET應用程序,需要處理服務器上大量的內存時,過度使用內存可能會帶來很多痛苦,因此有必要討論一下.NET內存管理的***實踐,以減少內存浪費。

程序員在為類中的成員變量獲取內存時往往有些多余的行為,因為有些不必要的內存使用會浪費掉一些內存空間,我們來看一段代碼:

  1. public class BadUse  
  2. {  
  3.    private SqlConnection con = new SqlConnection();  
  4.    private DataSet ds = new DataSet("MyData");  
  5.    public BadUse() {}  
  6.    public BadUse(string connectionString)  
  7.    {  
  8.        SqlConnection = new SqlConnection(connectionString);  
  9.    }  
  10.    public BadUse(SqlConnection con)  
  11.    {  
  12.        this.con = con;  
  13.    }  

如果在我們的系統中使用了多余的內存,類在被調用之前,甚至是構造函數被調用之前,就調用了對象成員初始化程序,它將為所有成員變量獲取內存,在上面的代碼中,在初始化期間我們創建了一個SqlConnection對象,在那之后,我們都調用默認的構造函數或創建對象的構造函數,因此沒有使用已經創建好的對象,重新創建了一遍對象,因此浪費了內存空間。

.NET內存管理***實踐方法:

  1. public class GoodUse  
  2. {  
  3.    private SqlConnection con = null;  
  4.    private DataSet ds = null;  
  5. public SqlConnection Connection // Better to use Properties  
  6. {  
  7.     get 
  8.     {  
  9.         if(this.con == null)   // Always check whether there is an existing object assigned to member  
  10.             this.con = new SqlConnection();  
  11.     return this.con;  
  12.     }  
  13.     set 
  14.     {  
  15.        if(value == null || this.con !=null)  
  16.         {  
  17.             this.con.dispose();     // Clears out Existing object if member is assigned to Null  
  18.             this.con = null;            //    Always better to assign null to member variables  
  19.        }  
  20.        if(value !=nullthis.con = value;  
  21.     }  
  22.   }  
  23.    public GoodUse() {}  
  24.    public GoodUse(string connectionString)  
  25.    {  
  26.          this.Connection = new SqlConnection(connectionString); //Assignes new object to null member  
  27.    }  
  28.  public GoodUse(SqlConnection con)  
  29.  {  
  30.        this.con = con;  
  31.   }  

從上面的代碼我們就更清晰了,使用屬性總比直接訪問對象要好,這里還給了你一個接口方便以后修改每個調用,與此類似,使用事件訪問程序訪問事件總是***的。

  1. private MyDelegate MyEvent;  
  2. public MyDelegate CheckEvent  
  3. {  
  4.     add  
  5.     {  
  6.        MyEvent + =value;  
  7.     }  
  8.     remove  
  9.     {  
  10.        MyEvent -= value;  
  11.     }  
  12. }  

在VB.NET中可以使用RaiseEvent,在代碼中無論何時觸發了事件都會調用它。

使用Using和Try/Catch程序塊

使用可隨意使用的對象時***使用Using程序塊,在.Net提供的所有構造函數中,Try /Catch和Using程序塊經常調用Dispose()函數,只要對象實施了IDisposable,因此在.Net中使用Try /Catch和Using程序塊總是***的。來看下面的代碼:

  1. public void Execute(string connectionstring, string sql)  
  2. {  
  3.     SqlConnection con = new SqlConnection(connectionstring);  
  4.     SqlCommand cmd = new SqlCommand(sql, con);  
  5.     con.Open();  
  6.     cmd.ExecuteNonQuery();  
  7.     cmd.Dispose();  
  8.     con.Dispose();  
  9. }  

在上面的代碼片段中,我們簡單地創建了SqlConnection和SqlCommand對象,這兩個對象都實施了IDisposable,因此上面的代碼可以按照***實踐方法重寫如下:

  1. public void Execute(string connectionstring, string sql)  
  2. {  
  3.      using(SqlConnection con = new SqlConnection(connectionstring))  
  4.     {  
  5.          using(SqlCommand cmd = new SqlCommand(sql, con))  
  6.         {  
  7.             con.Open();  
  8.             cmd.ExecuteNonQuery();  
  9.           }  
  10.      }  
  11.  }  

這樣重寫之后將會自動調用Dispose函數,我們不需要直接調用它,因此對于快速資源解除分配***使用Using程序塊。

也可以使用Try/ Catch程序塊,如:

  1. try 
  2. {  
  3.     SqlConnection con = new SqlConnection(connectionstring);  
  4.     try 
  5.     {  
  6.         SqlCommand cmd = new SqlCommand(sql, con);  
  7.         con.Open();  
  8.          cmd.ExecuteNonQuery();  
  9.     }  
  10.     catch {}  
  11.     finally 
  12.     {  
  13.         cmd.Dispose();  
  14.     }  
  15.     }  
  16.     catch(){}  
  17.     finally 
  18.     {  
  19.         con.Dispose();  
  20.     }  

接著是使用as或is比使用強制類型轉換要好,也就是說如果我們想轉換一個類型,應該使用as關鍵字而不是使用明確的類型映射。

  1. object o = new SqlConnection();  
  2. SqlConnection con = o as SqlConnection; // Better to use this  
  3. SqlConnection con = CType(o, SqlConnection); // Not always better  

在上面的語句中,如果你使用第二個轉換語句,如果CType不能轉換成那個類型或在o中有空值,它將會拋出錯誤,但在使用了as的語句中不會拋出錯誤,而是使轉換無效。

調用函數時使用Structure

調用函數時參數少是一件好事,如果直接向函數發送一個大對象將會花大量的時間發送多個參數,此時可以為那些要發送的參數創建一個Structure,然后直接發送這個Structure。

  1. public void Callme(int x, int y, string zy)    
  2. public void Callme(argumentStruct st) // Better in performance   

發送一個Structure總比發送離散對象要好。

使用一個大型組件總比使用大量的小型組件要好,大型組件中有許多命名空間,而不是大量的小型類庫,微軟也是這么干的,它將所有的組件都創建在mscorlib.dll中了,減少了元數據的負荷、JIT編譯時間和安全檢查等。

如果不是必須的***避免使用線程。

通常情況下,使用大量的線程可能導致性能下降,因為每個線程在獨立運行時會消耗大量的內存,當你需要快速處理時可以使用線程,但它會增加內存消耗。

當你創建線程時使用ThreadPool(線程池)。

避免使用ArrayList和HashTables,當你需要插入隨機數據時可以使用鏈接數組。

如果你看到ArrayList或HashTables的內部結構,就知道它僅僅是數組的打包,無論何時向這些結構中插入對象時,它將為所有已分配量重新聲明,然后手動轉變它們,ArrayList是一個對象數組,HashTable是一個結構數組。

另一個奇怪的事情是,ArrayList或HashTables的區間系數是4,這意味著它無論何時需要內存時分配的內存總是4的倍數,當你需要隨機插入時,LinkLists、Generic Lists和LinkedArrays比Collections對象的性能要好,當你需要添加數據和按順序顯示數據時使用Collections更好。

原文:Best Practices of Memory Usage

作者:Abhishek Sur

【編輯推薦】

  1. .NET 4.0內存映射文件詳解
  2. .NET真的不用管內存嗎?從List< T>列表聊起
  3. 淺析C#編程中的內存管理
  4. .NET內存中敏感數據的保護方案
  5. 淺析.NET框架下的自動內存管理
責任編輯:yangsai 來源: 51CTO.com
相關推薦

2014-06-09 15:50:08

2022-07-07 08:00:00

VDI虛擬化虛擬桌面

2013-06-09 10:38:54

IT運維管理運維管理ITIL管理

2013-09-17 11:28:48

2010-09-27 11:07:35

2018-09-28 05:18:41

2015-11-19 09:26:01

ASP.NET跨平臺實踐

2025-02-17 01:00:00

.NET性能服務器

2010-09-28 17:38:56

日志管理

2020-06-12 07:00:00

Web開發項目

2013-05-17 11:43:55

主數據數據管理

2018-12-04 09:00:00

API安全性令牌

2010-08-11 15:09:15

2017-11-01 14:45:51

數據管理數據

2025-04-11 03:00:55

2023-09-12 06:55:27

2014-07-29 09:25:39

加密密鑰管理云加密

2025-03-18 00:10:00

2011-08-30 11:19:25

遠程服務器數據中心遷移服務器管理工具

2013-09-03 09:37:50

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产在线观 | 午夜精品久久久久久久久久久久久 | 国产精品视频一二三区 | 国产精品区二区三区日本 | 国产专区在线 | 中文字幕视频一区二区 | 亚洲一区二区日韩 | 亚洲精品成人在线 | 欧美精品一 | 在线高清免费观看视频 | 一区二区免费 | 91精品国产一区二区三区香蕉 | 精品久久久久久久久久久久久久 | 久久久毛片 | 懂色av色香蕉一区二区蜜桃 | 亚洲欧美精品 | 91社区在线高清 | 久久久久国产 | 久久久噜噜噜www成人网 | 成人午夜精品 | 国产你懂的在线观看 | 亚洲精品黄色 | 伊人无码高清 | 在线免费观看成人 | 成人影视网| 日日干天天干 | 鲁一鲁资源影视 | 中文字幕国产视频 | 4h影视 | 青青草av在线播放 | 欧美精品在线观看 | 中文字幕一区二区三区不卡在线 | 三级av在线 | 久久久免费在线观看 | 久久久久久久久久影视 | 国产精品一区二区无线 | 日韩不卡三区 | 男人的天堂在线视频 | 殴美黄色录像 | 亚洲毛片在线 | 久久久av|