Количество экземпляров класса
Возможный дубликат:
Как я могу узнать, сколько объектов создано из класса в С#
Можно ли получить количество экземпляров, которые активны (созданы и еще не уничтожены) для выбранного класса?
Например:
public class MyClass { }
...
var c1 = new MyClass();
var c2 = new MyClass();
count = GetActiveInstances(typeof(MyClass))
Должен вернуть 2. Если GC уничтожит любой из этих классов, то 1 или 0.
Ответы
Ответ 1
Вы можете использовать глобальный статический счетчик в своей программе.
Это простой поточно-безопасный вариант:
class MyClass
{
static int counter = 0;
public MyClass()
{
Interlocked.Increment(ref counter);
}
~MyClass()
{
Interlocked.Decrement(ref counter);
}
}
также рассмотрим следующий аналогичный вопрос - Подсчитать количество объектов типа класса в методе класса
Ответ 2
это:
public class MyClass
{
private static int instances = 0;
public MyClass()
{
instances++;
}
~MyClass()
{
instances--;
}
public static int GetActiveInstances()
{
return instances;
}
}
использовать:
MyClass c1 = new MyClass();
MyClass c2 = new MyClass();
int count = MyClass.GetActiveInstances();
Ответ 3
Только если вы реализуете механизм подсчета внутри конструктора (increment) и finalizer (декремент). Но даже это не будет учитывать экземпляры, которые действительно неактивны (никто не ссылается на них), но еще не собраны.
Кроме того, добавление финализатора в класс - независимо от того, насколько тривиальным - будет отрицательно влиять на производительность, что является аргументом против этого.
Ответ 4
public class MyClass
{
private static int count;
private static object _lock = new object();
public MyClass()
{
lock(_lock)
{
count++;
}
}
private ~MyClass()
{
lock(_lock)
{
count--;
}
}
}
Ответ 5
Попробуйте это:
public class MyClass
{
public static int activeCount = 0;
public MyClass() => activeCount++;
~MyClass() => activeCount--;
}
//In the main
var testClass1 = new MyClass();
var testClass2 = new MyClass();
Console.WriteLine(MyClass.activeCount);
Ответ 6
public class MyClass
{
public static int countInstance = 0;
MyClass() => countinstance++;
~MyClass() => countinstance--;
}
просто и легко активировать экземпляр
Ответ 7
Я не знаю встроенного механизма, но вы всегда можете вставить в конструктор приватную статическую переменную.
public class MyClass
{
private static int instances = 0;
public MyClass() => instances++;
~MyClass() => instances--;
}
Не пробовал, но должно работать.
Ответ 8
Это невозможно, но вы можете сделать что-то вроде
Примечание. ClassInstance
также может иметь значение int только для поддержания счетчика.
public class MyType
{
public static List<MyType> ClassInstance = new List<MyType>();
public MyType() => ClassInstance.Add(this);
public RemoveClass(MyType t)
{
ClassInstance.Remove(t);
t = null;
}
public int ActiveCount => ClassInstance.Count;
}
Ответ 9
Вы можете попробовать, сделав статическую переменную для подсчета в классе и увеличьте ее в constructor
и уменьшите в destructor
. Это поможет вам.