可能重复:
我如何找出在 C# 中为一个类创建了多少个对象
是否可以获得所选类的活动(已创建但尚未销毁)的实例数?
例如:
public class MyClass { }
...
var c1 = new MyClass();
var c2 = new MyClass();
count = GetActiveInstances(typeof(MyClass))
应该返回 2。如果 GC 销毁这些类中的任何一个,则返回 1 或 0。
可能重复:
我如何找出在 C# 中为一个类创建了多少个对象
是否可以获得所选类的活动(已创建但尚未销毁)的实例数?
例如:
public class MyClass { }
...
var c1 = new MyClass();
var c2 = new MyClass();
count = GetActiveInstances(typeof(MyClass))
应该返回 2。如果 GC 销毁这些类中的任何一个,则返回 1 或 0。
您可以在程序中保存全局静态计数器。
这是一个简单的线程安全解决方案:
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
这 :
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();
仅当您在构造函数(增量)和终结器(减量)中实现计数机制时。但即使这样也不能解释那些真正不活跃的实例(没有人对它们有任何参考)但还没有被收集到。
此外,向类添加终结器(无论多么微不足道)都会对性能产生不利影响,这是反对这样做的论据。
试试这个:
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);
public class MyClass
{
private static int count;
private static object _lock = new object();
public MyClass()
{
lock(_lock)
{
count++;
}
}
private ~MyClass()
{
lock(_lock)
{
count--;
}
}
}
public class MyClass
{
public static int countinstance =0;
MyClass(){ countinstance ++;}
~ MyClass() {countinstance --; }
}
通过countinstance简单轻松地激活实例
我不知道内置机制,但你总是可以在构造函数中增加一个私有静态变量。
public class MyClass
{
private static int instances = 0;
public MyClass() => instances++;
~MyClass() => instances--;
}
没试过,但应该可以。
这样的事情是不可能的,但你可以做类似的事情
注意: 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;
}
您可以通过在类中为计数创建一个静态变量来尝试它,并在 中递增constructor
和递减。destructor
这可能对您有所帮助。