Dispose():
Purpose: Explicitly releases unmanaged resources.
Usage: Called by the developer manually.
Implementation: Part of the IDisposable interface.
Timing: Immediate, deterministic cleanup.
Finalize():
Purpose: Implicitly releases unmanaged resources.
Usage: Called by the garbage collector.
Implementation: Defined using a destructor syntax (~ClassName).
Timing: Non-deterministic, depends on garbage collection timing.
Key Difference: Dispose() is called manually for immediate cleanup, while Finalize() is called by the garbage collector for non-deterministic cleanup.