16

可能重复:
我如何找出在 C# 中为一个类创建了多少个对象

是否可以获得所选类的活动(已创建但尚未销毁)的实例数?

例如:

public class MyClass { }

...

var c1 = new MyClass();
var c2 = new MyClass();

count = GetActiveInstances(typeof(MyClass))

应该返回 2。如果 GC 销毁这些类中的任何一个,则返回 1 或 0。

4

9 回答 9

29

您可以在程序中保存全局静态计数器。
这是一个简单的线程安全解决方案:

class MyClass
{
    static int counter = 0;

    public MyClass()
    {
        Interlocked.Increment(ref counter);
    }

    ~MyClass()
    {
        Interlocked.Decrement(ref counter);
    }
}

也看看下面类似的问题 - Count number of objects of class type within class method

于 2012-09-05T07:40:21.243 回答
7

这 :

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();
于 2012-09-05T07:46:45.573 回答
4

仅当您在构造函数(增量)和终结器(减量)中实现计数机制时。但即使这样也不能解释那些真正不活跃的实例(没有人对它们有任何参考)但还没有被收集到。

此外,向类添加终结器(无论多么微不足道)都会对性能产生不利影响,这是反对这样做的论据。

于 2012-09-05T07:39:47.633 回答
2

试试这个:

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);
于 2012-09-05T07:42:41.380 回答
1
public class MyClass
{
    private static int count;
    private static object _lock = new object();

    public MyClass()
    {
         lock(_lock)
         {
             count++;
         }
     }

    private ~MyClass()
    {
        lock(_lock)
        {
             count--;
        }
    }
}
于 2012-09-05T07:40:32.053 回答
1
 public class MyClass
    {
public  static int countinstance  =0;
MyClass(){ countinstance  ++;}
 ~ MyClass() {countinstance  --; }
    }

通过countinstance简单轻松地激活实例

于 2012-09-05T07:44:13.743 回答
0

我不知道内置机制,但你总是可以在构造函数中增加一个私有静态变量。

public class MyClass
{
    private static int instances = 0;

    public MyClass() => instances++;
    ~MyClass() => instances--;
}

没试过,但应该可以。

于 2012-09-05T07:40:42.670 回答
0

这样的事情是不可能的,但你可以做类似的事情

注意: 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;
}
于 2012-09-05T07:43:10.437 回答
-1

您可以通过在类中为计数创建一个静态变量来尝试它,并在 中递增constructor和递减。destructor这可能对您有所帮助。

于 2012-09-05T07:41:40.030 回答