在C#中,有没有一种方法可以停止实例化类,例如在'n'个实例化之后说呢?这个link并没有太大帮助。
关于尝试事情,我正在考虑使类静态化,但是 在停止实例化之前,必须先实现“ n”个实例化。通过反射有可能吗?
答案 0 :(得分:2)
您可能有一个私有静态计数器,在构造函数中对其进行递增,如果达到限制,则抛出异常。但是请注意,这是一个非常奇怪的设计,很可能是糟糕的设计。 更好的方法是使用工厂模式
class LimitedInstantiation
{
private static int instCounter = 0;
public LimitedInstantiation()
{
instCounter++;
// limit your number of instances
if (instCounter > 3)
{
throw new Exception("Limit of instances reached");
}
}
~LimitedInstantiation()
{
// Reduce your number of instances in the destructor
instCounter--;
}
}
您可以测试是否这样:
try
{
var instance1 = new LimitedInstantiation();
var instance2 = new LimitedInstantiation();
var instance3 = new LimitedInstantiation();
// this should fail.
var instance4 = new LimitedInstantiation();
}
catch (Exception e)
{
Console.WriteLine(e);
}
答案 1 :(得分:1)
您可以使用类似于单例模式的模式(除了我们允许多个实例):
public sealed class LimitedInstantiationsClass
{
private const int _maxInstantiations = 5;
private static int _instantiations = 0;
private static object _lockObject = new object();
private LimitedInstantiationsClass()
{
}
public static bool TryGetInstance(out LimitedInstantiationsClass instance)
{
instance = null;
if (_instantiations >= _maxInstantiations)
{
return false;
}
lock (_lockObject)
{
if (_instantiations >= _maxInstantiations)
{
return false;
}
++_instantiations;
}
instance = new LimitedInstantiationsClass();
return true;
}
}
本质上,因为构造函数是私有的,所以只有TryInstance
方法可以创建class *的实例。在课程中,我们私下跟踪提供的实例数。锁定代码是为了确保此方法是线程安全的,因此我们将提供的最大值是_maxInstantiations(5)。
我们两次检查_instantiations >= _maxInstantiations
的原因是,这可能在第一次检查和获取锁之间发生变化。我们将在外部进行测试,以避免在无法创建更多实例的情况下获得锁的成本。
TryInstance
将在达到限制后返回false。
**您仍然可以使用Reflection在其他位置创建一个对象,但是几乎可以使用任何方法来实现。