【问题标题】:Can I override Dispose to make an entity class that always calls SaveChanges?我可以重写 Dispose 以创建一个始终调用 SaveChanges 的实体类吗?
【发布时间】: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()
}

我不确定的问题是:

  1. Dispose 是执行此操作的正确位置,因为我出于某种原因考虑“完成” - 我总是对 C# 销毁感到困惑。

  2. 如果在客户端代码中抛出异常,通常会跳过 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


【解决方案1】:
  1. Dispose 是您要执行此操作的地方,如果您要这样做的话。

  2. 这是您应该这样做的原因之一。

【讨论】:

  • 我认为一种编程语言可以想象有一个“成功块”控制结构
  • 这就是面向对象和架构的用途。创建一个具有可扩展“成功块”的类,但可能在您的抽象类中定义了一些基本功能。
【解决方案2】:

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

“处置”的目的是礼貌地尽早处置非托管资源,以便其他进程可以使用它。 “Dispose”不应该有语义——它不应该改变你的程序的状态或以某种方式被要求。它应该只按照它所说的去做:处理资源

您应该在终结器中执行此操作吗? 绝对不是。那更糟。终结器可能根本不运行,终结器在另一个线程上运行,即使对象没有正确初始化也可以调用终结器,等等。 编写终结器几乎从来都不是正确的做法,如果您确实编写了终结器,它应该只处置资源。 不要在终结器中做任何花哨的事情;如果你这样做,你几乎肯定会写出一个危险的错误和脆弱的程序。

这里的正确原则是:如果出于语义原因需要调用,则强制用户将调用放入代码中。如果他们忘记这样做,他们会发现在测试中。 让用户决定将调用置于 finally 块中是否正确。 不要替他们做决定;你可能会做出错误的决定。

【讨论】:

  • 类似的问题和不幸被接受的答案并没有指出这不应该在IDisposable.Dispose here 中完成。
  • @Greg,我从 96 年到 01 年开始了一名 C++ 程序员......从那时起 C#.. 我被正确地分析了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多