.NET 應用效能優化往往在細節。本文彙整 11 個實戰優化技巧,涵蓋集合選擇、字串操作、XML 處理、迴圈優化、異常處理、資源釋放、快取策略等核心領域,助你寫出高效能代碼。
問題:ArrayList 存儲 object,值類型存入需裝箱,取出需拆箱,產生額外記憶體配置與 GC 壓力。
解決:.NET 2.0+ 使用泛型集合 List<T>、Dictionary<TKey, TValue> 等,強類型、無裝箱拆箱。
// 避免
ArrayList list = new ArrayList();
list.Add(100); // 裝箱
int i = (int)list[0]; // 拆箱
// 推薦
List list = new List();
list.Add(100); // 無裝箱
int i = list[0]; // 無拆箱
Hashtable、Dictionary<TKey, TValue> 經過高度優化,查找效能優於 StringDictionary、NameValueCollection、HybridDictionary。小量資料亦適用。
// 避免:每次建立新字串物件
obj.Status = "ACTIVE";
// 推薦:編譯期常數,單一物件
const string C_STATUS = "ACTIVE";
obj.Status = C_STATUS;
// 避免:建立兩個新字串(ToUpper/ToLower)
if (sVariable.ToUpper() == "COMPARE") ...
// 推薦:直接比較,忽略大小寫
const string C_VALUE = "COMPARE";
if (String.Compare(sVariable, C_VALUE, true) == 0) // true = ignoreCase
Console.WriteLine("SAME");
// 避免:每次串接產生新字串,O(n²) 複雜度
string sXML = "";
sXML += "";
sXML += "Data";
sXML += " ";
// 推薦:StringBuilder 可變緩衝區,O(n)
StringBuilder sb = new StringBuilder();
sb.Append("");
sb.Append("");
sb.Append("Data");
sb.Append(" ");
string result = sb.ToString();
// 避免:XmlDocument 建立完整 DOM 樹,記憶體佔用大
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);
string name = doc.SelectSingleNode("/packet/child").InnerText;
// 推薦:XPathDocument 唯讀、流式、記憶體效率高
XPathDocument xpDoc = new XPathDocument(new StringReader(xmlString));
XPathNavigator nav = xpDoc.CreateNavigator();
XPathNodeIterator iter = nav.Select("packet/child");
while (iter.MoveNext())
Console.WriteLine(iter.Current.Value);
// 避免:每次迴圈重新配置區域變數空間(雖 JIT 可能優化,但語意不清)
for (int i = 0; i < 10; i++)
{
SomeClass obj = new SomeClass();
// ...
}
// 推薦:語意清晰,避免誤解
SomeClass obj = null;
for (int i = 0; i < 10; i++)
{
obj = new SomeClass();
// ...
}
// 避免:吞沒所有例外,隱藏真實錯誤
try { ... }
catch (Exception ex) { ... }
// 推薦:精準處理預期例外
try { ... }
catch (NullReferenceException ex) { ... }
catch (ArgumentOutOfRangeException ex) { ... }
catch (InvalidCastException ex) { ... }
SqlConnection conn = null;
try
{
conn = new SqlConnection(connStr);
conn.Open();
// ...
}
catch (Exception ex)
{
// 錯誤處理
}
finally
{
if (conn != null) conn.Close(); // 或 conn.Dispose()
// 更佳:using 區塊自動釋放
}
最佳實務:實作 IDisposable 的物件一律用 using 區塊。
MemoryCache、IMemoryCache(ASP.NET Core)效能優化無銀彈,但這 11 項技巧涵蓋了 .NET 應用 80% 以上的常見效能陷阱。建議: