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;
}
}