new 指令在托管堆上指標前移配置,**極快** (僅指標運算),連續記憶體有利 CPU 快取。GC.Collect() (生產環境**極少**主動呼叫)。
public class ResourceHolder : IDisposable
{
private IntPtr _unmanagedHandle;
private bool _disposed;
public ResourceHolder() => _unmanagedHandle = AcquireUnmanagedResource();
// 公開 Dispose (供呼叫端主動釋放)
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this); // 告訴 GC 不需呼叫 Finalize
}
// 受保護虛擬方法 (供衍生類別覆寫)
protected virtual void Dispose(bool disposing)
{
if (_disposed) return;
if (disposing)
{
// 釋放託管資源 (其他 IDisposable 物件)
}
// 釋放非託管資源
ReleaseUnmanagedResource(_unmanagedHandle);
_unmanagedHandle = IntPtr.Zero;
_disposed = true;
}
// Finalize (析構函式) - 保障未呼叫 Dispose 時仍能釋放非託管資源
~ResourceHolder() => Dispose(false);
}
| 特性 | Finalize (~) | Dispose() |
|---|---|---|
| 呼叫時機 | GC 回收時 (非決定性) | 呼叫端決定 (決定性) |
| 效能影響 | 物件需進入 Finalization Queue,**至少經過 2 次 GC** 才釋放記憶體 | 立即釋放資源,GC 正常回收記憶體 |
| 適用資源 | 僅非託管資源保障 | 託管 + 非託管資源 |
| 執行緒 | Finalizer 專用執行緒 | 呼叫端執行緒 |
ArrayPool<T>.Shared、MemoryPool<T> 減少 LOH 壓力。WeakReference<T> 允許 GC 回收。<gcServer enabled="true"/>:伺服器模式 (多執行緒並行 GC),適合高吞吐服務。<gcConcurrent enabled="true"/>:背景 GC (預設開啟),減少暫停時間。GC.LatencyMode = GCLatencyMode.SustainedLowLatency:關鍵路徑暫時降低延遲 (慎用)。理解 GC 運作原理,配合 IDisposable 模式與物件池化,即能編寫高效能、低延遲的 .NET 應用程式。