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

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

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

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

实现您正在寻找的东西的唯一方法是在类本身中保留这些对象的静态列表。 如果您只是想查看某个地方是否存在未被垃圾回收的实例,那么您将需要使用WeakReference类。 例如…

 public class MyClass { private static List instances = new List(); public MyClass() { instances.Add(new WeakReference(this)); } public static IList GetInstances() { List realInstances = new List(); List toDelete = new List(); 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类本身,并且我们的列表不会没有理由变大)。

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

 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指令,编译器被迫生成您可能不期望的本地(您没有明确声明的本地)。 在启用优化时,编译器也可以随意删除本地。

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

你是否意味着你可以跟踪你调用new MyClass()这样当前有N个实例占用内存,你想知道N的值吗?

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

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