【发布时间】:2016-03-30 01:44:03
【问题描述】:
我对在我的 asp.net mvc-5 Web 应用程序中实现 Dispose 的 write syntx 有疑问。
现在我使用 Visual Studio 2013 创建了一个新的 asp.net mvc-5 Web 应用程序,并将我的数据库表映射到一个 edmx 文件中。然后我创建了一个新的控制器类。现在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);
}
所以我有这个问题:- 我应该/更喜欢使用哪种 dispose 语法?这两种方法会产生相同的结果吗?
【问题讨论】:
-
我的代码在您声称有显着差异的两个示例之间看起来几乎相同...请说明您认为不同的部分(假设您了解
override的含义) -
公平点
Controller没有this.disposed = true;(只有GC.SuppressFinalize(this))...也仍然不确定您期望派生类实现的样子。 -
两次调用
GC.SuppressFinalize有什么意义(因为基类已经这样做了)? -
只是澄清一下 - 你明白你在谈论 2 种不同的情况 - 派生类覆盖父类的
Dispose(bool)(在DeptsController的情况下)与为派生类提供虚拟方法的基类覆盖(在StudentRepository的情况下)? -
@AlexeiLevenkov 好的,所以你的意思是最后调用 GC.SuppressFinalize(this);是多余的,因为基类 Controller 已经调用了它,并且当我调用它时 base.Dispose(disposing);在我的控制器中,GC 将被调用 ..
标签: c# asp.net asp.net-mvc asp.net-mvc-5 dispose