如何计算该类方法中类类型的对象数?就此而言,如何在不将对象添加到列表的情况下在类之外进行?
我应该想到这个!谢谢!我会在一段时间内没有回答,看看是否有更好的方法,因为我同意。我只是把头包裹在OO周围。如果你不介意让我解释一下,也许总的来说有更好的方法吗?
我有一个对象类,我想要添加3条信息,但首先我要循环并确保没有其他任何三个部分相同的对象,如果有的话,为每个案例做一些不同的事情。
答案 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中的分析器(可能还有其他人)可以告诉您:
编辑:由于缺少“dup
n ”或“swap
n,n + 1”IL指令,编译器被迫生成当地人你可能没想到(你没有明确宣布的)。在优化开启时,编译器也可以随时删除本地文件。
答案 2 :(得分:0)
您可以实现某种类型的引用计数方案,但我不确定您为什么要这样做。对于每次调用'new',你可以递增一个计数器,然后你可以定义一个终结器来减少这个值。可能有一种更好,更强大的方法,这只是我的头脑。
答案 3 :(得分:0)
你是否意味着能够跟踪你调用new MyClass()
的次数,以便此时有N个实例占用内存,你想知道N的值? / p>
如果要跟踪内存使用情况,请使用调试器转储堆的状态。问题是,答案取决于GC以及它是否收集了未引用的对象。
你可以在构造函数中增加一个计数器,但什么时候递减呢?终结者在另一个线程中运行,这强调了整个想法的不可预测性。可能更好地实现IDisposable
递减计数器,并且在不需要时要求对象被处置。