我正在使用一个在构造函数中引用了 EF 的类。
我已经实现了 IDisposable,但我不确定是否需要一个析构函数,因为我不确定能否将 EF 归类为非托管资源。
如果 EF 是托管资源,那么我就不需要一个析构函数,因此我认为这是一个正确的例子:
public ExampleClass : IDisposable
{
public ExampleClass(string connectionStringName, ILogger log)
{
//...
Db = new Entities(connectionStringName);
}
private bool _isDisposed;
public void Dispose()
{
if (_isDisposed) return;
Db.Dispose();
_isDisposed= true;
}
}
如果EF是非托管的,则我会选择这个:
如果EF是非托管的,那么我会选择这个:
public ExampleClass : IDisposable
{
public ExampleClass(string connectionStringName, ILogger log)
{
//...
Db = new Entities(connectionStringName);
}
public void Dispose()
{
Dispose(true);
}
~ExampleClass()
{
Dispose(false);
}
private bool _isDisposed;
protected virtual void Dispose(bool disposing)
{
if (_isDisposed) return;
// Dispose of managed resources
if (disposing)
{
// Dispose of managed resources; assumption here that EF is unmanaged.
}
// Dispose of unmanaged resources
Db.Dispose();
_isDisposed = true;
//freed, so no destructor necessary.
GC.SuppressFinalize(this);
}
}
这是哪一个?
DbContext
的创建和销毁。它需要为一个小的工作单元进行创建。它的内部遵循“工作单元”模式。 - Callum Linington然而,DbContext和相关的内部类默认会自行释放这些非托管资源。
这似乎很有道理,让我想把EF视为托管资源。据我所知,对于托管对象,我不需要使用析构函数,因此在得到其他通知之前,我可以放心地使用第一个示例。 - jacoblambert