using (var state = new DatabaseState())
{
state.GetDate().Dump();
}
...
var state = new DatabaseState();
try
{
state.GetDate().Dump();
}
finally
{
state.Dispose();
}
public class DatabaseState : IDisposable
{
private SqlConnection _connection;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
...
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (_connection != null)
{
_connection.Dispose();
_connection = null;
}
}
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (_connection != null)
{
_connection.Dispose();
_connection = null;
}
}
}
public class DatabaseState : IDisposable
{
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
...
~UnmanagedDatabaseState()
{
Dispose(false);
}
protected override void Dispose(bool disposing)
{
//managed resources...
if (_unmanagedPointer != IntPtr.Zero)
{
Marshal.FreeHGlobal(_unmanagedPointer);
_unmanagedPointer = IntPtr.Zero;
}
base.Dispose(disposing);
}
CA2000: Dispose objects before losing scope
public class BookFeedRepository : IBookFeedRepository
{
private BookFeedContext _context;
//...
}
public interface IBookFeedRepository : IDisposable
{
//...
}
public class DifficultToDiscover : IDisposable
{
void IDisposable.Dispose()
{
//...
}
}
public class EasyToDiscover : IDisposable
{
public void Dispose()
{
//...
}
}
https://www.pluralsight.com/courses/idisposable-best-practices-csharp-developers