计数类方法中的类的对象的数(Count number of objects of class typ

2019-06-26 13:54发布

我怎么能算那类的方法中的类的对象的数量? 对于这个问题,如何做到这一点的一类外不添加对象的列表?

我应该想到这一点! 谢谢! 我要离开它解答了一小会儿,看看是否有更好的办法,因为我同意。 我只是sortv包裹我的周围OO头。 如果你不介意让我解释一下,也许有一般的更好的办法?

我有我想添加3条信息给一个对象类,但首先我通过要循环,确保没有其他对象与任何三块相同的,如果有,做一些对每个不同的案件。

Answer 1:

完成你在找什么,唯一的方法是保持在类中这些对象的静态列表。 如果你只是想看看是否有什么地方实例尚未收集垃圾,那么你要使用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使用吓唬你。 垃圾收集的工作方式是通过引用计数。 只要一些代码段或对象能够访问的特定实例(意味着它的范围之内,为或为本地,实例的一部分,或静态变量),那么对象被认为是活的。 一旦该变量落在OUT范围,在以后某个时候,垃圾收集器/将收集它。 但是,如果你要维护所有引用的列表,也绝对不会掉出的范围,因为他们将在该列表中引用存在。 该WeakReference是一类特殊的可以让你保持一个对象,垃圾收集器会忽略一个参考。 该IsAlive属性指示是否WeakReference指向仍然存在一个有效的对象。

所以我们在这里做什么是这个名单保留WeakReference s表示点的每个实例MyClass一个已经创建。 当你想获得他们的名单,我们通过迭代WeakReference S和抢夺了所有的人是活的。 任何我们发现不再活着放入另一个临时列表,以便我们可以将它们删除从我们的名单外(从而使WeakReference类本身可以被收集和我们的名单不会增长没有理由巨大)。



Answer 2:

我不完全明白你的意思。 但它也可能是这样的:

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

另一种可能性:在团队套房(或者其他人)的分析器可以告诉你:

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

编辑:由于缺乏一个“的dup n”或“ swap N,N + 1” IL指令,编译器被强制产生当地人,你可能不希望(那些你没有明确声明)。 编译器也是免费的,其中可以消除当地人当优化上。



Answer 3:

您可以实现某种类型的引用计数方案,虽然我不知道你为什么会想这样做。 对于每次调用“新”你可以增加一个计数器,然后你可以定义一个终结,以减小该值。 有可能是一个更好的,更强大的方式做到这一点,这只是从我的头顶。



Answer 4:

你的方式,将允许你跟踪你有多少次叫意味着new MyClass()这样有N个实例占用内存的那一刻,你想知道的N的值?

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

你可以让你在构造函数中增加一个计数器,但是当递减呢? 终结在另一个线程,这凸显了这一整体思路的不可预测性运行。 也许是更好地实现IDisposable递减计数器,并要求对象时,没有必要被处理完毕。



文章来源: Count number of objects of class type within class method