限制实例创建一个类?

我正在使用C#。 我创建了一个可以包含在任何c#.net项目中的类(基于桌面或基于Web),但我希望在我的类的应用程序中只创建10个对象。 如果对象实例创建超过10,那么它应该给出错误或简单不起作用。

可能有两种情况,

  1. 我将myclass.cs文件包含在任何项目中
  2. 我将我的类捆绑在DLL中,然后将其包含在任何应用程序中

在这两种情况下,如果在应用程序中创建了超过10个类的实例,则必须通过错误。

这个问题是我的老师问的,他告诉我在互联网上搜索答案,我试过但没有找到解决这个问题的方法,我还没有听说过我们可以限制对象?

是否可能,如果是,那么如何?

谢谢

保留一个静态变量,其中包含创建的实例数。 每次构造对象时增加该数字。 使对象IDisposable并在每次调用Dispose()时减少该数字。 如果您希望它是线程安全的,请使用Interlocked.Increment()和Interlocked.Decrement()来更改此变量的值而不是++和 – 。

我相信你想要某种forms的多重模式 。

多重模式是单例模式的变体,但允许对象的n个实例。 就像单例类如何使用静态变量来保存单个实例一样,多重通常使用静态数组或实例映射来实现,具体取决于您希望如何访问实例 – 数组仅允许数字访问,但是通过使用在地图中,您可以为实例提供String键,使其命名。

您只需要使用工厂模式和创建的实例数的计数器,之后工厂方法将抛出exception/返回null。

例:

public class Foobar { private static int numInstances = 0; public static Foobar CreateFoobar() { if (numInstances++ < 10) { return new Foobar(); } return null; } protected Foobar() { ... } } 

上面的方法对单实例应用程序非常有效,但对于多实例应用程序,您可能希望使用信号量 ( System.Threading存在一个实现),这种情况适用于这种情况。 (限制对资源/对象的访问)。 它解决了几乎同时请求类的多个实例的问题,并且计数检查失败。

我会创建一个静态整数,并在实例化一个新对象时更新它。

 class YourClass { static int Count = 0; public YourClass() { Count++; if(Count > 10) { //throw exception } } } 

在类中使用静态计数器,如果count> 10,则在类构造函数中抛出exception

对于处理实例,还要创建一个静态卸载方法(类似于AppDomain)。 有卸载方法调用IDisposable的实现,它使用Interlocked.Decrement递减计数器并处理实例。

(我假设您是否限制实例中要有资源管理的实例数。)

您还可以使用generics来允许重新使用工厂类来限制不同类的实例。 使用约束来要求实例实现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; 

而不是调用卸载方法,然后实例将保留在堆上,并且您的实例数量的计数器不会递减,直到GC发生。