我对write syntx有一个问题,要在我的asp.net mvc-5 web应用程序中实现Dispose。
现在我使用Visual Studio 2013创建了一个新的asp.net mvc-5 Web应用程序,并将我的数据库表映射到edmx文件中。然后我创建了一个新的Controller类。现在,Dispose()
的默认代码如下所示: -
public class DeptsController : Controller
{
private ApplicationDbContext db = new ApplicationDbContext();
//code goes here..
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
但与此同时,我发现许多在线文章和书籍使用以下语法来处理当前请求,如link所示: -
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
context.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
所以我有这个问题: - 我应该/更喜欢使用哪种处理语法?这两种方法会产生相同的结果吗?
答案 0 :(得分:1)
如果您的班级有~DeptsController
方法(也称为终结方法或“析构函数”),而且只需拨打Dispose()
,则需要拨打GC.SuppressFinalize(this)
以阻止Dispose
1}}被叫两次。
如果你的班级没有析构函数,则没有必要。
答案 1 :(得分:0)
当您实现IDisposble时,只需使用visual studio将构建的实现。生成的代码中的注释可以准确地告诉您何时执行操作,而无需调用GC。生成代码的示例:
private bool disposedValue = false; // To detect redundant calls
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// TODO: dispose managed state (managed objects).
}
// TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
// TODO: set large fields to null.
disposedValue = true;
}
}
// TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources.
// ~ChampionGgCallerHttpClient() {
// // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
// Dispose(false);
// }
// This code added to correctly implement the disposable pattern.
public void Dispose()
{
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
Dispose(true);
// TODO: uncomment the following line if the finalizer is overridden above.
// GC.SuppressFinalize(this);
}