代码之家  ›  专栏  ›  技术社区  ›  Ben Lesh

在重新填充IDisposable对象之前,是否必须先处理它们?

  •  2
  • Ben Lesh  · 技术社区  · 15 年前

    假设我的命令体系结构模式中有一个方法可以像这样改变图形路径的内容:(graphicsPath是IDisposable)

    (这纯粹是一个未经测试的快速示例)

    public void DoSomething(ref GraphicsPath path) 
    {
       if(path != null) 
          {
          List<PointF> pts = new List<PointF>();
          foreach(PointF pt in path.PathPoints) 
          {
             //again, just a silly example.
             float y = pt.X;
             float x = pt.Y;
             pts.Add(new PointF(x, y));
          }
       path.Dispose(); //<-- Do I need this?
       path = new GraphicsPath(pts.ToArray(), path.PathTypes);
      }
    }
    

    在将路径设置为新路径之前,是否需要释放路径?如果是,为什么?

    4 回复  |  直到 15 年前
        1
  •  8
  •   Paul Sasik    15 年前

    对。因为您是通过引用传递路径变量的,所以在重新分配前一个实例时将其“孤立”。使用Dispose()清理是正确的操作。

        2
  •  4
  •   Adam Ralph    15 年前

    这是一个很难回答的问题。如果消费代码应该负责管理对象的生存期,那么它应该调用Dispose(),而不是您的代码。这样做的原因是,使用代码除了传递给您的代码之外,还可以维护对实例的另一个引用,并且在调用方法之后,它可能期望能够继续使用此引用。

    或者,如果类的语义表明它将在对象传递后管理其生存期,那么它应该如您所描述的那样调用Dispose()。

    一般来说,当一个对象实现IDisposable时,当您完成它(或在using块中使用引用)后,应该明确地调用它的dipose()方法。

    前面已经说过,您可能希望重新审视您的设计,因为它所代表的语义不直观。

        3
  •  0
  •   McKay    15 年前

    是的,你可能应该。

    如果对象是一次性的,那基本上就是说它有一些资源需要清理(比如打开的文件、数据库或其他东西)。

    调用Dispose,清除这些内容(在理想环境中)

        4
  •  0
  •   Otávio Décio    15 年前

    在不讨论函数的优点的情况下,是的-您需要调用Dispose,以便对象能够清理自己沿途分配的资源。

    另一个原因-在你分配给它任何东西的时候,你要为它的生命负责,所以你需要在清理之前确保它正在使用的任何东西。

    推荐文章