首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Effective C# 原則 16:最小化垃圾(二)

     編輯:關於C語言

重用靜態資源與字串優化

首次要求黑色筆刷時,Brushes 類別建立它;之後保留單一參考,重複要求直接回傳同一控制代碼。結果:只建立一個黑色筆刷並持續重用。若應用程式不需要特定資源(如檸檬綠筆刷),可能永遠不建立。框架提供方法限制物件,在滿足目標下使用最小物件集合。學會在應用程式中運用此技巧。

提升區域變數為成員與單例模式

已學會兩種技術最小化配置數量:將常用區域變數提升為類別成員;提供單例模式類別儲存常用給定物件實例。最後技術包含建立不變型別的最終使用值。System.String 即不變型別:建立後內容不可更改。修改字串內容實際上建立新物件,舊字串成垃圾。看似無辜的例子:

string msg = "Hello, ";
msg += thisUser.Name;
msg += ". Today is ";
msg += System.DateTime.Now.ToString();

實際上等同低效寫法:

string msg = "Hello, ";
string tmp1 = new String(msg + thisUser.Name); msg = tmp1; // "Hello " 成垃圾
string tmp2 = new String(msg + ". Today is "); msg = tmp2; // "Hello " 成垃圾
string tmp3 = new String(msg + DateTime.Now.ToString()); msg = tmp3; // "Hello . Today is " 成垃圾

tmp1,tmp2,tmp3 與原始 msg 全成垃圾。+= 產生新物件並回傳,不會修改原儲存空間。對此例,應用 string.Format():

string msg = string.Format("Hello, {0}. Today is {1}", thisUser.Name, DateTime.Now.ToString());

複雜字串操作用 StringBuilder

StringBuilder msg = new StringBuilder("Hello, ");
msg.Append(thisUser.Name);
msg.Append(". Today is ");
msg.Append(DateTime.Now.ToString());
string finalMsg = msg.ToString();

StringBuilder 為可變字串類別,用於產生不變字串物件。在未建立不變字串前,提供有效方法儲存可變字串。重要的是學習此設計習慣:設計提倡不變型別時(原則 7),對需多次建構才得最終物件者,考慮用物件建構器簡化建立。(譯註:僅當使用不變型別時適用;引用型別不一定非要用建構器。注意不變型別特點:一經建立永不改變,所有修改產生新實例。string 為典型不變引用型別;DateTime 為不變實值型別。)

總結

垃圾回收器管理記憶體確實高效,但建立與釋放堆積物件仍耗時。避免建立大量物件、不使用的物件、區域函式重複建立引用物件。反之,將區域變數提升為型別成員,或將最常用物件實例建為靜態物件。最後,考慮用可變物件建構器建構不變物件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved