这是一个相当较好的观点,我期待答案是“从”开始“的答案是”这不是一个热门的想法“ - 这说,如果有人足够沉迷,我有一个很感兴趣的积分。

模型代码:

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()
}
.

我不确定的问题是:

  1. 是处理正确的地方,因为我思考“完成”出于某种原因 - 我总是对C#销毁感到困惑。

  2. 在客户端代码中抛出异常,通常会跳过SaveChanges,这是好的,但如果这有效,我会觉得如何,它总是称之为。我应该使用空捕获捕获吗?

    public partial class MyEntities : ObjectContext
    {
        protected override void Dispose(bool disposing)
        {
            try
            {
               this.SaveChanges();
            }
            catch {}
            base.Dispose(disposing);
        }
    }
    

有帮助吗?

解决方案

不要这样做。这是一个坏主意。

“处置”的目的是礼貌地提前处理非托管资源,以便其他进程可以使用它。 “Dispose”不应有语义 - 它不应改变程序的状态或以某种方式要求。它应该只做它所做的事情:处理资源

你应该在终结器中做到吗? 绝对不是。这更糟糕。最终结果可能根本无法运行,终结器在另一个线程上运行,即使对象未正确初始化,也可以调用终结器,等等。 写一个终结器几乎绝不是正确的事情,如果你做了一个终结器,它应该只处理资源。在终结器中没有做任何花哨的东西;如果你这样做,你几乎肯定会写一个危险的不正确和脆弱的程序。

正确的原则是切割到这里的原则是:如果语义原因需要呼叫,则强制用户将呼叫放入代码中。如果他们忘记这样做,他们会发现在测试中。 让用户决定是否有正确的事情,以便在最终块中拨打电话。不要为他们做出决定;你可能会决定错了。

其他提示

  1. 处置是你会做到这一点的地方,如果你要这样做。

  2. 这是 not 的原因之一。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top