我使用外部API连接到FireWire相机。 API可以用C ++编写,但幸运的是它带来了自己的.NET包装器DLL。 API需要以下过程:
ApiResource.Init();
// ... use the ressource here ...
ApiResource.CloseAll();
ApiResource.Release();
因为我需要一些特定的处理代码,所以我决定为此编写一个包装类。因为事件处理程序等,我需要在我的Form打开时保持ressources打开。所以我想让包装器更容易使用我会让它成为一个实现IDisposable
的单例,所以我可以将它包装在{ {1}}陈述。我想要Singleton的原因是有一种受控且有限的方式来调用所需的API函数:
using
我想用它的方式是:
class Wrapper : IDisposable {
private Wrapper _instance;
public Wrapper Instance
{
get
{
if(_instance == null)
_instance = new Wrapper();
return _instance;
}
}
private Wrapper ()
{
ApiResource.Init();
_disposed = false;
}
// Finalizer is here just in case someone
// forgets to call Dispose()
~Wrapper() {
Dispose(false);
}
private bool _disposed;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(!_disposed)
{
if(disposing)
{
}
ApiResource.CloseAll();
ApiResource.Release();
_instance = null;
log("Wrapper disposed.");
_disposed = true;
}
}
}
我对C#很陌生,所以我不确定几件事情:
using(Wrapper.Instance) {
Application.Run(new Form());
}
中是否会始终调用Dispose()
?我的记录显示“是”,但我不确定...... using(Singleton.Instance) { ... }
语句包裹Application.Run(...)
是否安全?答案 0 :(得分:2)
您的两个问题的答案都是是:
Dispose()
将始终在using
块结束时被调用,除非块开始时Wrapper.Instance
为null
。
将Run()
块中的using
来电包裹起来非常安全。