Количество экземпляров класса

  Возможный дубликат:
Как я могу узнать, сколько объектов создано из класса в С#

Можно ли получить количество экземпляров, которые активны (созданы и еще не уничтожены) для выбранного класса?

Например:

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. Это поможет вам.