在C#中处置对象

时间:2013-06-26 09:11:53

标签: c# .net dispose

我写了以下课程:

public class CoupleFrames
{
    public CoupleFrames(ColorImageFrame cif, Bitmap df)
    {
        this.colorFrame = cif;
        this.desktopFrame = df;
    }

    public ColorImageFrame colorFrame;
    public Bitmap desktopFrame;
}

现在我使用以下代码来处理变量。

CoupleFrames cf = new CoupleFrames(frame1, frame2);
// some code...
cf.colorFrame.Dispose();
cf.desktopFrame.Dispose();

我不确定这是正确的方法。有人可以建议我处理整个物体的正确方法吗?

5 个答案:

答案 0 :(得分:14)

  

我不确定这是正确的方法。有人可以建议我处理整个物体的正确方法吗?

当然 - 您应该CoupleFrames实施IDisposable,而 Dispose方法应该处理它“拥有”的对象。例如:

public sealed class CoupleFrames : IDisposable
{
    private readonly ColorImageFrame colorFrame;
    private readonly Bitmap desktopFrame;

    public CoupleFrames(ColorImageFrame cif, Bitmap df)
    {
        // TODO: Argument validation, unless it's valid for these parameters
        // to be null, in which case the Dispose method would need to be careful.
        this.colorFrame = cif;
        this.desktopFrame = df;
    }

    public void Dispose()
    {
        colorFrame.Dispose();
        desktopFrame.Dispose();
    }
}

需要注意几点:

  • 你应该确保CoupleFrame确实“拥有”这些组成对象。处置依赖于明确的所有权模式
  • 如果CoupleFrame 密封(且不可能),您可能需要使用虚拟方法和终结器进入更复杂的模式。它可能变得非常复杂,你应该阅读advice given here by Joe Duffy et al。如果你的课程被密封了,很多复杂性就会消失
  • 公共字段通常是一个坏主意(在封装方面),这就是我在这里将它们设为私有的原因。我也已将它们作为readonly,好像以后可以更改它们,你需要考虑是否应该更改它们来处理先前引用的对象等。
  • 通过CoupleFrame实现IDisposable,您基本上告诉所有客户他们应该处置他们拥有的任何实例。如果你不满意这种负担,你需要重新考虑一下这个设计。

答案 1 :(得分:1)

我会实施Dispose pattern

public class CoupleFrames : IDisposable
{
    public CoupleFrames(ColorImageFrame cif, Bitmap df)
    {
        this.colorFrame = cif;
        this.desktopFrame = df;
    }

    public ColorImageFrame colorFrame;
    public Bitmap desktopFrame;

    private bool disposed;

    public void Dispose()
    {
        Dispose(true);
        GC.SupressFinalize(this); 
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposed)
        {
            return;
        }
        if (disposing)
        {
            colorFrame.Dispose();
            desktopFrame.Dispose();
        }
        disposed = true;
    }
}

答案 2 :(得分:0)

在你的类中实现IDisposable并让它从那里处理成员变量。

public class CoupleFrames : IDisposable
        {
            public CoupleFrames(ColorImageFrame cif, Bitmap df)
            {
                this.colorFrame = cif;
                this.desktopFrame = df;
            }

            public ColorImageFrame colorFrame;
            public Bitmap desktopFrame;

            public void Dispose()
            {
                this.colorFrame.Dispose();
                this.desktopFrame.Dispose();
            }
        }

答案 3 :(得分:0)

您可以使用IDisposable界面。

public class CoupleFrames : IDisposable
{
    ....

    public void Dispose()
    {
        // Your disposing code here
    }

    ~CoupleFrames()
    {
        Dispose();
    }
}

您可以使用析构函数调用Dispose方法,因为GC有时可以删除该对象。

答案 4 :(得分:-2)

使CoupleFrames实现Idisposable接口。

public class CoupleFrames : IDisposable
{
    public CoupleFrames(ColorImageFrame cif, Bitmap df)
    {
        this.colorFrame = cif;
        this.desktopFrame = df;
    }

    public ColorImageFrame colorFrame;
    public Bitmap desktopFrame;

    public void Dispose()
    {
        cf.colorFrame.Dispose();
        cf.desktopFrame.Dispose();
    }