【发布时间】:2011-11-15 15:50:37
【问题描述】:
这是一个很好的观点,我希望答案是“一开始就不是一个热门的想法”——也就是说,不管有人愿意放纵一下,它都有一个我感兴趣的观点。
型号代码:
public partial class MyEntities : ObjectContext
{
// the idea is if the object is in a using block, this always gets called?
protected override void Dispose(bool disposing)
{
this.SaveChanges();
base.Dispose(disposing);
}
}
客户代码:
using(var model = new MyEntities())
{
// do something
// no worry about calling model.SaveChanges()
}
我不确定的问题是:
Dispose 是执行此操作的正确位置,因为我出于某种原因考虑“完成” - 我总是对 C# 销毁感到困惑。
-
如果在客户端代码中抛出异常,通常会跳过 SaveChanges,这很好,但如果这按我的想法工作,它总是会调用它。我应该使用空捕获的 try 吗?
public partial class MyEntities : ObjectContext { protected override void Dispose(bool disposing) { try { this.SaveChanges(); } catch {} base.Dispose(disposing); } }
【问题讨论】:
-
-1 Dispose 用于清理资源。在那里调用 SaveChanges 非常糟糕。
-
它的调用是绑定到包含堆栈帧的范围还是绑定到垃圾收集器?这就是我想我现在真正想知道的,因为你让我想得更多。
-
你不能让任何人看到这段代码。但是,关键是即使代码引发异常,您也会调用 SaveChanges()。这是搞砸数据库的好方法。
标签: c# finalizer object-lifetime