我写了以下课程:
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();
我不确定这是正确的方法。有人可以建议我处理整个物体的正确方法吗?
答案 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。如果你的课程被密封了,很多复杂性就会消失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();
}