Ограничить создание экземпляров класса?

Я использую C#. Я создал класс, который может быть включен в любой c#.net проект (настольный или веб -), но я хочу, чтобы в этом приложении моего класса было создано только 10 объектов. Если экземпляры объекта создали более 10, то он должен дать ошибку или просто не будет работать.

здесь может быть две ситуации,

  1. я включу myclass.cs файл в любом проект или
  2. Я свяжу свой класс в DLL, а затем включу его в любой применение

в обеих ситуациях он должен через ошибку, если в приложении создано более 10 экземпляров моего класса.

этот вопрос задал мой учитель, он сказал мне искать ответ в Интернете, я пробовал, но нигде не нашел решения этой проблемы, я не слышал, что мы можем ограничивать объекты?

возможно ли это, если да, то как?

спасибо

6 ответов


сохранить статическую переменную с количеством созданных экземпляров. Увеличьте это число с каждой конструкцией объекта. Сделайте объект IDisposable и уменьшите это число при каждом вызове Dispose (). Если вы хотите, чтобы он был потокобезопасным, используйте Interlocked.Increment () и блокируется.Декремент (), чтобы изменить значение этой переменной вместо ++ и --.


Я считаю, что вы хотите какую-то форму шаблон многотонные.

шаблон multiton является вариацией шаблона singleton, но это позволяет использовать n экземпляров объекта. Подобно тому, как класс singleton имеет статическую переменную для хранения одного экземпляра, multiton часто реализуется со статическим массивом или картой экземпляров, в зависимости от того, как вы хотите получить доступ к экземплярам - массивы допускают только числовой доступ, но с помощью карты вы можете предоставьте строковые ключи своим экземплярам, сделав их именованными.


вам просто нужно использовать шаблон фабрики со счетчиком количества созданных экземпляров, после чего метод factory выдаст исключение / вернет значение 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), который предназначен именно для такого рода ситуации (ограничение доступа к ресурсам/объекты). Он обходит проблему нескольких экземпляров класса, запрашиваемого почти одновременно, и проверка количества не выполняется.


Я бы создал static integer и обновите его при создании экземпляра нового объекта.

class YourClass
{
    static int Count = 0;

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

возьмите статический счетчик в классе и создайте исключение в конструкторе класса, если count>10


Для утилизации экземпляра также создайте статический метод выгрузки (аналогичный AppDomain). Имейте реализацию вызова метода unload IDisposable, которая уменьшает счетчик, используя блокировку.Decrement, а также утилизировать экземпляр.

(Я предполагаю, что если вы ограничиваете количество экземпляров, у вас есть ресурсы в экземпляре для управления.)

Можно также использовать дженерики, чтобы разрешить повторное использование класса factory для ограничения экземпляров разный класс. Используйте ограничения, чтобы требовать от экземпляра реализации 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;

Вместо вызова метода unload экземпляр останется в куче, а счетчик количества экземпляров не будет уменьшаться, пока GC происходит.