C# 计算类的实例数
可能重复:C# 计算类的实例数,c#,.net,class,object,C#,.net,Class,Object,可能重复: 是否可以获取所选类的活动(已创建但尚未销毁)实例数 例如: public class MyClass { } ... var c1 = new MyClass(); var c2 = new MyClass(); count = GetActiveInstances(typeof(MyClass)) 应该返回2。如果GC破坏了这些类中的任何一个,那么只有在构造函数(递增)和终结器(递减)内部实现了计数机制时,才使用1或0。但即使这样,也不能解释那些真正不活动(没有人对它们有
是否可以获取所选类的活动(已创建但尚未销毁)实例数 例如:
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);
}
}
还可以看看下面类似的问题-我不知道内置的机制,但您总是可以在构造函数中包含私有静态变量
public class MyClass
{
private static int instances = 0;
public MyClass() => instances++;
~MyClass() => instances--;
}
还没有尝试过,但应该可以工作。您可以在类中为count创建一个静态变量,然后在
构造函数中递增,在析构函数中递减。这可能会对您有所帮助。试试这个:
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);
这样的事情是不可能的,但你可以这样做
注意: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;
}
公共类MyType
{
public static List ClassInstance=new List();
public MyType()=>ClassInstance.Add(此);
公共RemoveClass(MYT类型)
{
分级状态。移除(t);
t=零;
}
public int ActiveCount=>ClassInstance.Count;
}
通过countinstance轻松激活实例这:
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();
定义“active”,你所说的destructed是什么意思。无聊的人会声明一个静态int变量在构造时增加,在删除时减少。不,C#或.NET中没有任何东西支持这一点。而且,我很难看到它的实际应用?每个“活动”,即引用的对象都可以通过您自己的代码访问,因此您可以创建自己的计数机制。实际用途是使用PostSharp+SmartInspect跟踪性能计数器和内存泄漏。对我来说,这是一个重复的问题,而且有很多重复的答案。这是一个C#问题,不是Java。有关lock
@YannickBlondeau的使用,请参见+1:lock
应始终以私有
字段为目标。如果你要做,那就做对。不。决不要锁定决赛选手。您不希望Finalizer线程因任何原因阻塞。如果您必须从终结器执行类似操作,请使用interlocted.Increment
和interlocted.Decrement
。谢谢@Jon,我不知道…我在尝试编译时,终结器行上的修饰符“public”对该项无效,因为终结器不能具有访问修饰符。
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();