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

#c#

#c#

Вопрос:

я использую c # и у меня вопрос, как статическое поле используется для подсчета количества экземпляров в классе, пожалуйста, уточните с точки зрения памяти, заранее спасибо.

Комментарии:

1. Вероятно, потому, что «пожалуйста, уменьшите объем памяти» неясно. Кроме того, правильное написание, заглавные буквы и знаки препинания помогут…

Ответ №1:

Чтобы просто подсчитать количество конструкций, объявите статическое поле и используйте Interlocked.Increment в своем конструкторе экземпляра для увеличения статического поля потокобезопасным способом.

Если вы хотите подсчитать живые объекты, вам также понадобится Interlocked.Decrement это поле в вашем финализаторе (т. Е. деструкторе C #). Однако обратите внимание, что добавление финализатора заставит объекты проходить через очередь завершения, что сделает сборку мусора менее эффективной.

В зависимости от того, как вы определяете «живой» объект, вам может быть интересно добавить Interlocked.Decrement его в свою IDisposable.Dispose реализацию.

Ответ №2:

Просто добавьте счетчик в конструктор вашего класса

 class MyClass
{

    static int instanceCount = 0;

    public MyClass()
    {
        instanceCount  ;
    }

}
  

Конструктор запускается каждый раз, когда создается экземпляр класса. Статическая переменная является общей для всех экземпляров созданного класса.

Комментарии:

1. Конечно, вопрос OP не был правильно сформулирован, но как насчет того, когда они будут уничтожены?

Ответ №3:

Вы можете использовать конструктор и деструктор для достижения желаемого, но вам не обязательно знать, сколько экземпляров вашего класса существует одновременно. Похоже, вы неправильно подходите к проблеме.

 class MyClass
{
    static int instances = 0;

    public MyClass()
    {
        instances  ;
    }

    ~MyClass()
    {
        instances--;
    }
}
  

Обратите внимание, что деструктор класса не будет вызван немедленно. Сборщик мусора должен решать, когда он собирает экземпляр вашего класса и, следовательно, когда вызывается ваш деструктор.

Комментарии:

1. вы, кажется, меня не поняли, я хочу знать, как это обрабатывается в памяти, но в любом случае спасибо за ваше внимание 🙂

Ответ №4:

Что-то вроде

 class someclass
{
    private static int instanceCounter;

    public someclass() { someclass.instanceCounter  ; }
}
  

Комментарии:

1. Хм, ну, на самом деле у вас нет понятия деструкторов в .Net, поэтому я не уверен на 100%, как это отследить, без объяснения AddRef / RemoveRef в стиле COM.