Object.Finalize 是 .NET 釋放非受控資源的最後防線,但會帶來顯著效能負擔:
public class MyResource : IDisposable {
private bool disposed = false;
private IntPtr nativeHandle;
// 公開 Dispose,供使用者主動釋放
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this); // 告訴 GC 不需呼叫 Finalize
}
// 受控覆寫點
protected virtual void Dispose(bool disposing) {
if (!disposed) {
if (disposing) {
// 釋放受控資源
}
// 釋放非受控資源
if (nativeHandle != IntPtr.Zero) {
NativeMethods.CloseHandle(nativeHandle);
nativeHandle = IntPtr.Zero;
}
disposed = true;
}
}
// 最終保障
~MyResource() {
Dispose(false);
}
}
using 區塊決定性釋放:using (var r = new MyResource()) { ... }受控與非受控程式碼互呼叫(P/Invoke、COM Interop)每次轉換約 10~40 條指令開銷。
byte、int、double、結構體無需封送,直接複製記憶體。GCHandle.Alloc(buffer, GCHandleType.Pinned) 避免 GC 移動記憶體,供 Native 直接存取。IL 或使用 PerfView、dotnet-trace 定位轉換熱點。MemoryMappedFile 或 Span<T> 零複製共享。