我正在使用C#。我创建了一个可以包含在任何c#.net项目中的类(基于桌面或基于Web),但我希望在我的类的应用程序中只创建10个对象。如果对象实例创建的数量超过10,那么它应该给出错误或简单不起作用。
可能有两种情况,
在这两种情况下,如果在应用程序中创建了超过10个类的实例,则必须通过错误。
我的老师问过这个问题,他告诉我在互联网上搜索答案,我试过但没有找到解决这个问题的方法,我还没有听说过我们可以限制对象吗?
是否可能,如果是,那么如何?
由于
答案 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()
{
...
}
}
上述方法对单实例应用程序非常有效,但对于多实例应用程序,您可能希望使用semaphore(System.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发生。