我可以覆盖丢弃,以制作始终称之为SaveChanges的实体类吗?
-
29-10-2019 - |
题
这是一个相当较好的观点,我期待答案是“从”开始“的答案是”这不是一个热门的想法“ - 这说,如果有人足够沉迷,我有一个很感兴趣的积分。
模型代码:
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()
}
.
我不确定的问题是:
-
是处理正确的地方,因为我思考“完成”出于某种原因 - 我总是对C#销毁感到困惑。
-
在客户端代码中抛出异常,通常会跳过SaveChanges,这是好的,但如果这有效,我会觉得如何,它总是称之为。我应该使用空捕获捕获吗?
public partial class MyEntities : ObjectContext { protected override void Dispose(bool disposing) { try { this.SaveChanges(); } catch {} base.Dispose(disposing); } }
解决方案
不要这样做。这是一个坏主意。
“处置”的目的是礼貌地提前处理非托管资源,以便其他进程可以使用它。 “Dispose”不应有语义 - 它不应改变程序的状态或以某种方式要求。它应该只做它所做的事情:处理资源。
你应该在终结器中做到吗? 绝对不是。这更糟糕。最终结果可能根本无法运行,终结器在另一个线程上运行,即使对象未正确初始化,也可以调用终结器,等等。 写一个终结器几乎绝不是正确的事情,如果你做了一个终结器,它应该只处理资源。在终结器中没有做任何花哨的东西;如果你这样做,你几乎肯定会写一个危险的不正确和脆弱的程序。
正确的原则是切割到这里的原则是:如果语义原因需要呼叫,则强制用户将呼叫放入代码中。如果他们忘记这样做,他们会发现在测试中。 让用户决定是否有正确的事情,以便在最终块中拨打电话。不要为他们做出决定;你可能会决定错了。
其他提示
-
处置是你会做到这一点的地方,如果你要这样做。
-
这是 not 的原因之一。
不隶属于 StackOverflow