Effective C# 原則 18:實作標準 Dispose 模式(二)
實作 IDisposable 的雙重意義 實作 IDisposable 做成兩件事:提供及時釋放所有受控資源的機制;提供標準模式讓使用者釋放非受控資源。這很重要
Effective C# 原則 17:最小化裝箱與拆箱(三)
集合中實值型別的裝箱拆箱問題 Person 為實值型別,存入 ArrayList 前被裝箱,產生副本。取出時透過屬性修改,又建立副本。修改僅針對副本,而 ToS
Effective C# 原則 16:最小化垃圾(一)
垃圾回收器雖強,避免不必要配置更重要 GC 對記憶體管理表現出色,高效移除不再使用的物件。但不管如何,配置與釋放堆積物件總比非堆積物件耗費更多處理器時間。應用程
Effective C# 原則 16:最小化垃圾(二)
重用靜態資源與字串優化 首次要求黑色筆刷時,Brushes 類別建立它;之後保留單一參考,重複要求直接回傳同一控制代碼。結果:只建立一個黑色筆刷並持續重用。若應
Effective C# 原則 15:使用 using 與 try/finally 進行資源清理(一)
IDisposable 與資源釋放責任 使用非受控資源的型別必須實作 IDisposable.Dispose() 精確釋放系統資源。.NET 環境規定釋放資源程
Effective C# 原則 15:使用 using 與 try/finally 進行資源清理(二)
using 陳述式的編譯行為 在函式內使用可處理物件時,using 陳述式是確保物件妥善處理的最簡單方法。物件配置時,編譯器將其置入 try/finally 區
Effective C# 原則 15:使用 using 與 try/finally 進行資源清理(三)
多重 using 的嵌套問題與替代方案 每個 using 陳述式產生新的巢狀 try/finally 區塊。我發現這結構不佳,遇到多個實作 IDisposabl
Effective C# 原則 14:使用建構函式鏈結(一)
避免重複程式碼:建構函式鏈結 撰寫建構函式是重複性工作。許多開發人員先寫一個建構函式,再複製貼上到其他建構函式滿足多載介面。請停止這樣做。有經驗的 C++ 程式
Effective C# 原則 14:使用建構函式鏈結(三)
建構函式鏈結的編譯器優化 差異在於編譯器未產生對基類的多重呼叫,也未複製實例變數到每個建構函式。基類建構函式僅在最後一個建構函式中呼叫。關鍵限制:你不能同時包含
Effective C# 原則 18:實作標準 Dispose 模式(三)
衍生類別的資源清理 若衍生類別有額外清理工作,讓它實作 Dispose 方法: public class DerivedResourceHog : MyReso
Effective C# 原則 12:優先使用欄位初始化器而非指派陳述式(二)
建構函式中重複初始化的問題 建立 MyClass 物件並指定集合大小時,會建立兩個 ArrayList,其中一個瞬間成為垃圾。初始化器在所有建構函式之前執行,建
Effective C# 原則 11:優先選擇 foreach 迴圈(三)
foreach 的可讀性與彈性 (譯註:雖然程式碼較多,但程式設計師一眼即可看出是三維陣列迴圈;而 foreach 卻無人能一眼看出在做什麼!這當然可視為優點。
Effective C# 原則 8:確保 0 對實值型別是有效狀態(三)
Equals() 實作細節與陷阱 Equals() 決不應拋出例外:兩變數要麼相等要麼不等,無其他失敗餘地。所有失敗(null 參考、錯誤參數)直接回傳 fal
Effective C# 原則 9:釐清多種相等運算之關係(一)
四種相等比較方法概覽 建立自訂型別(類別或結構)時,必須定義何種情況下視為相等。C# 提供四種不同方法判斷兩物件是否相等: public static bool
Effective C# 原則 9:釐清多種相等運算之關係(二)
靜態 Equals 與執行個體 Equals 的關係 前一篇介紹的兩個方法——運算子 ==() 和執行個體 Equals()——尚未討論。我將詳細說明,但先完成
Effective C# 原則 6:區分實值型別與參考型別資料(三)
型別變更帶來的行為改變 將 Employee 從實值型別(struct)改為參考型別(class),會擾亂所有現有程式碼:回傳值從值傳回變為參考傳回,參數從傳值
Effective C# 原則 4:使用 ConditionalAttribute 取代 #if 預處理器區塊(三)
ConditionalAttribute 的運作機制 ConditionalAttribute 告訴 C# 編譯器:此方法僅在編譯環境變數 DEBUG 定義時才
Effective C# 原則 3:優先使用 is 或 as 運算子,避免強制轉型(三)
編譯時期與執行時期型別的落差 兩種轉換都失敗了。但我告訴過你,強制轉換可在使用者定義型別上完成。你以為會成功,確實若如你所想會成功。但轉換失敗,因為編譯器為物件