承接上集,本文深入解析四個高頻使用的核心類型/介面,掌握其正確用法與常見陷阱,寫出更健壯的 .NET 程式碼。
僅在使用非受控資源時需主動介入。垃圾回收三階段:標記 → 完成器佇列 → 釋放記憶體。常用靜態方法:
GC.Collect():強制立即回收所有代 (效能敏感區慎用)。GC.WaitForPendingFinalizers():阻塞直到完成器執行完畢。GC.SuppressFinalize(this):在 Dispose() 中呼叫,告知 GC 無需再呼叫完成器。128 位元整數,幾乎不可能重複。常見用途:資料庫主鍵、分散式系統識別碼、暫存檔命名。效能考量:Guid.NewGuid() 比 int 主鍵大 4 倍,索引分裂較頻繁,大量資料場景需權衡。
單一方法 object Clone(),語意由實作者定義。範例實作深複製:
public class UserInfo : ICloneable
{
public string UserName { get; set; }
public string Password { get; set; }
public object Clone()
{
return new UserInfo { UserName = this.UserName, Password = this.Password };
}
}
// 使用示範
UserInfo u1 = new UserInfo("Tom", "123");
UserInfo u2 = u1; // 參考複製
UserInfo u3 = u1.Clone() as UserInfo; // 深複製
u2.UserName = "Tom_Ref";
u3.UserName = "Tom_Clone";
// u1.UserName 仍為 "Tom"
標準 Dispose(bool disposing) 模式同時處理受控與非受控資源:
public class BaseResource : IDisposable
{
private IntPtr handle; // 非受控
private Component comp; // 受控
private bool disposed;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing) comp.Dispose(); // 釋放受控
CloseHandle(handle); // 釋放非受控
handle = IntPtr.Zero;
disposed = true;
}
}
~BaseResource() { Dispose(false); } // 完成器備援
}
關鍵原則:
Dispose 可重複呼叫且不拋出例外。Dispose()。ObjectDisposedException。Dispose(false) 中釋放。