为了处理实例,还创建了一个静态卸载方法(类似于 AppDomain)。让 IDisposable 的 unload 方法调用实现,该实现使用 Interlocked.Decrement 递减计数器并处理实例。
(我假设如果您限制实例的数量,那么您在实例中拥有要管理的资源。)
您还可以使用泛型来允许重用工厂类来限制不同类的实例。使用约束要求实例实现 IDisposible 并具有默认构造函数。还提供一个非静态属性来返回实际实例。
public class foo : IDisposable
{
public foo() { ; }
public string Name;
public void Dispose() { ; }
// Real class would free up instance resources
}
LimitedInstance< foo > li = LimitedInstance< foo >.CreateInstance();
li.Instance.Name = "Friendly Name for instance";
// do stuff with li
LimitedInstance< foo >.UnloadInstance( ref li );
唯一的问题是您不能在 C# 中重载赋值运算符。因此,如果您执行以下操作:
li = null;
而不是调用 unload 方法,然后实例将保留在堆上,并且您的实例数计数器不会递减,直到 GC 发生。