限制实例创建类?

Pra*_*ant 10 c# oop class instance

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

可能有两种情况,

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

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

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

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

谢谢

Dav*_*kle 19

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

  • Dykam:这是C#.C#没有析构函数,它有不确定的终结符.如果你在终结器中减少计数,那么当你的类已经超出范围,但尚未被垃圾收集,并且你不能再创建任何对象时,你可能会为自己做好准备. (7认同)

Tho*_*ens 10

我相信你想要某种形式的多重模式.

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


Nol*_*rin 8

您只需要使用带有创建实例数的计数器的工厂模式,之后工厂方法将抛出异常/返回null.

例:

public class Foobar
{
    private static int numInstances = 0;

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

        return null;
    }

    protected Foobar()
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • “numInstances”何时以及如何减少? (2认同)