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();