C# 在C中处理对象#

C# 在C中处理对象#,c#,.net,dispose,C#,.net,Dispose,我写了以下课程: public class CoupleFrames { public CoupleFrames(ColorImageFrame cif, Bitmap df) { this.colorFrame = cif; this.desktopFrame = df; } public ColorImageFrame colorFrame; public Bitmap desktopFrame; } 现在我使用下面

我写了以下课程:

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

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

让框架实现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();
    }
我不确定这是不是正确的方法。有人能告诉我处理整个物体的正确方法吗

当然-您应该使
IDisposable
实现
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
    未密封(并且无法密封),您可能需要使用虚拟方法和终结器进入更复杂的模式。它可能会变得非常复杂,你应该阅读。如果你的类是密封的,那么很多复杂性就会消失
  • 公共字段通常是一个坏主意(就封装而言),这就是为什么我在这里将它们设置为私有。我还将它们设置为只读,好像它们可以在以后更改一样。您需要考虑更改它们是否应该处理以前引用的对象等
  • 通过使
    CoupleFrame
    实现
    IDisposable
    ,您基本上是在告诉所有客户机,他们应该处理他们拥有的任何实例。如果你不喜欢强加这种负担,你需要重新考虑一下设计

您可以使用
IDisposable
界面

public class CoupleFrames : IDisposable
{
    ....

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

    ~CoupleFrames()
    {
        Dispose();
    }
}
您可以使用析构函数调用Dispose方法,因为GC有时会删除该对象。

我将实现


这取决于您是否希望类型拥有传递给构造函数的变量的所有权;如果不是,请对变量使用using,否则在类型上实现IDisposable并让它管理资源。由于
CoupleFrames
没有实例化这两个私有成员,我们应该在dispose方法中检查NRE。@ken2k:我实际上在构造函数中进行了非空性验证。将进行编辑以指示。@ken2k所以,我还需要测试成员是否为null?@Joseph82:您需要在某处进行测试-传递到构造函数中的
null
值有效吗?如果不是,则在那里抛出异常。如果是,请在尝试处置之前进行检查。
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;
    }
}