4

我写了以下课程:

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();

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

4

4 回答 4

15

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

当然 - 你应该做CoupleFramesimplement 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 没有密封(也不能密封),您可能需要使用虚拟方法和终结器进入更复杂的模式。它可能会变得非常复杂,您应该阅读Joe Duffy 等人在此处给出的建议。如果您的课程是密封的,那么很多复杂性都会消失
  • 公共字段通常是一个坏主意(就封装而言),这就是我在这里将它们设为私有的原因。我也将它们设为只读,好像它们可以稍后更改,您需要考虑更改它们是否应该处理先前引用的对象等。
  • 通过制作CoupleFrameimplement IDisposable,您基本上是在告诉所有客户他们应该处置他们拥有的任何实例。如果您对施加这种负担不满意,则需要重新考虑一下设计。
于 2013-06-26T09:14:31.877 回答
2

我会实现Dispose 模式

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;
    }
}
于 2013-06-26T09:48:20.320 回答
-1

您可以使用该IDisposable界面。

public class CoupleFrames : IDisposable
{
    ....

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

    ~CoupleFrames()
    {
        Dispose();
    }
}

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

于 2013-06-26T09:17:34.393 回答
-3

使 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();
    }
于 2013-06-26T09:13:59.847 回答