#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.