【发布时间】:2011-07-18 11:28:25
【问题描述】:
我正在使用外部 API 来连接 FireWire 相机。该 API 可能是用 C++ 编写的,但幸运的是它带来了自己的 .NET 包装 DLL。 API 需要以下过程:
ApiResource.Init();
// ... use the ressource here ...
ApiResource.CloseAll();
ApiResource.Release();
因为我需要一些特定的处理代码,所以我决定为此编写一个包装类。由于事件处理程序等原因,我需要在我的表单打开时保持资源打开。所以我想使包装器更易于使用我会使其成为实现 IDisposable 的单例,所以我可以将它包装在 using陈述。我想要一个 Singleton 的原因是有一种受控和有限的方式来调用所需的 API 函数:
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;
}
}
}
我想使用它的方式是这样的:
using(Wrapper.Instance) {
Application.Run(new Form());
}
我对 C# 还很陌生,所以我不太确定以下几点:
-
Dispose()是否总是在上面的using(Singleton.Instance) { ... }中被调用?我的日志显示“是”,但我不确定... - 用
using语句包装Application.Run(...)是否安全?
【问题讨论】:
标签: c# c#-3.0 singleton using-statement