限制实例创建类?

时间:2009-08-09 14:03:33

标签: c# oop class instance

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

可能有两种情况,

  1. 我将myclass.cs文件包含在任何文件中 项目或
  2. 我将我的类捆绑在DLL中,然后将其包含在任何应用程序中
  3. 在这两种情况下,如果在应用程序中创建了超过10个类的实例,则必须通过错误。

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

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

    由于

6 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:10)

我相信你想要某种形式的multiton pattern

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

答案 2 :(得分:8)

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

示例:

public class Foobar
{
    private static int numInstances = 0;

    public static Foobar CreateFoobar()
    {
        if (numInstances++ < 10)
        {
            return new Foobar();
        }

        return null;
    }

    protected Foobar()
    {
        ...
    }
}

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

答案 3 :(得分:0)

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

class YourClass
{
    static int Count = 0;

    public YourClass()
    {
       Count++;
       if(Count > 10)
       {
           //throw exception
       }
    }
}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

对于处理实例,还要创建一个静态卸载方法(类似于AppDomain)。有卸载方法调用IDisposable的实现,它使用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;

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