计算类方法中类类型的对象数

时间:2009-07-22 22:58:02

标签: c# class object count methods

如何计算该类方法中类类型的对象数?就此而言,如何在不将对象添加到列表的情况下在类之外进行?

我应该想到这个!谢谢!我会在一段时间内没有回答,看看是否有更好的方法,因为我同意。我只是把头包裹在OO周围。如果你不介意让我解释一下,也许总的来说有更好的方法吗?

我有一个对象类,我想要添加3条信息,但首先我要循环并确保没有其他任何三个部分相同的对象,如果有的话,为每个案例做一些不同的事情。

4 个答案:

答案 0 :(得分:13)

实现所需内容的唯一方法是在类本身中保留这些对象的静态列表。如果您只想查看某个地方是否存在未进行垃圾回收的实例,那么您将需要使用WeakReference类。例如......

public class MyClass
{
    private static List<WeakReference> instances = new List<WeakReference>();

    public MyClass()
    {
         instances.Add(new WeakReference(this));
    }

    public static IList<MyClass> GetInstances()
    {
        List<MyClass> realInstances = new List<MyClass>();
        List<WeakReference> toDelete = new List<WeakReference>();

        foreach(WeakReference reference in instances)
        {
            if(reference.IsAlive)
            {
                realInstances.Add((MyClass)reference.Target);
            }
            else
            {
                toDelete.Add(reference);
            }
        }

        foreach(WeakReference reference in toDelete) instances.Remove(reference);

        return realInstances;
    }
}

由于您是OO / .NET新手,不要让WeakReference使用吓到你。垃圾收集的工作方式是引用计数。只要某段代码或对象可以访问特定实例(意味着它在作为本地,实例或静态变量的一部分或作为本地,实例或静态变量的一部分),则该对象被认为是活动的。一旦该变量超出范围,在此之后的某个时刻,垃圾收集器可以/将收集它。但是,如果要维护所有引用的列表,它们将永远不会超出范围,因为它们将作为该列表中的引用存在。 WeakReference是一个特殊类,允许您维护对垃圾收集器将忽略的对象的引用。 IsAlive属性指示WeakReference是否指向仍存在的有效对象。

所以我们在这里做的是保留WeakReference的这个列表,指向已创建的MyClass的每个实例。当你想获得它们的列表时,我们遍历我们的WeakReference并抢夺所有活着的。我们发现不再存在的任何内容都被放入另一个临时列表中,以便我们可以从外部列表中删除它们(这样就可以收集WeakReference类本身,并且我们的列表不会无缘无故地变大。)

答案 1 :(得分:1)

我不确定你的意思。但它可能是这样的:

MethodInfo methodInfo = ...;
MethodBody body = methodInfo.GetMethodBody();
int count = body.LocalVariables.Count(variable => variable.LocalType == typeof(DesiredType));

另一种可能性:Team Suite中的分析器(可能还有其他人)可以告诉您:

  • 每种方法中分配的T类型的对象数
  • 每种方法中分配的字节的数量

编辑:由于缺少“dup n ”或“swap n,n + 1”IL指令,编译器被迫生成当地人你可能没想到(你没有明确宣布的)。在优化开启时,编译器也可以随时删除本地文件。

答案 2 :(得分:0)

您可以实现某种类型的引用计数方案,但我不确定您为什么要这样做。对于每次调用'new',你可以递增一个计数器,然后你可以定义一个终结器来减少这个值。可能有一种更好,更强大的方法,这只是我的头脑。

答案 3 :(得分:0)

你是否意味着能够跟踪你调用new MyClass()的次数,以便此时有N个实例占用内存,你想知道N的值? / p>

如果要跟踪内存使用情况,请使用调试器转储堆的状态。问题是,答案取决于GC以及它是否收集了未引用的对象。

你可以在构造函数中增加一个计数器,但什么时候递减呢?终结者在另一个线程中运行,这强调了整个想法的不可预测性。可能更好地实现IDisposable递减计数器,并且在不需要时要求对象被处置。