2011-01-18 45 views
4

有什么更好的办法来清除对象:如何“清除”一个对象?

1)编写清除类的所有成员在类中的方法:MyObject.Clear();

2)在我的代码,在商业逻辑,null的对象:MyObject = null;

+3

3)删除引用并创建一个新的一? – spender 2011-01-18 20:58:01

回答

12

他们做不同的事情。将变量设置为null对对象本身没有任何影响。这可能意味着该对象现在有资格进行垃圾回收,但如果对同一对象有其他“实时”引用,则不会产生任何影响。

你应该怎么做?那么,这完全取决于你的情况。如果你有很多不同的地方参考同一个对象,他们都应该看到“清除”,然后修改对象。如果您只需要一个变量来引用不同的对象或根本不需要对象,只需更改该变量的值即可。

重要的是要知道两者之间的差异 - 请注意,变量的值永远不会是对象 ...它可能是参考值或值类型值。

1

第二个。 小心不要对您的对象持续引用。任何绑定事件处理程序,集合中的引用都会使您的实例“不可用”。

如果你来自C++,不要打扰垃圾收集器。我意识到,对内存性能的痴迷可能会导致操纵内存收集过程。事实上,你永远不需要使用它。只是取消任何引用。

3

我会建议只构造一个对象的新实例,而不是清除它。

如果您完成了一个对象,但没有包含其引用的类,则将其设置为null可能是适当的。但是,如果它只是在方法中使用,则不必做任何事情(垃圾收集器会在没有引用该对象后的某个时候清理它) - 让它“脱离”让它掉下来的范围。如果它在一个集合中,您可以将其从集合中删除。

一个例外是如果对象实现IDisposable。在这种情况下,您可能想要将其称为Dispose()方法,或者尝试构造代码以在using块中使用它,以便适当地清理其资源。

0

您的问题的答案是,“这取决于”。这取决于你想用它做什么。如果你想保留一个特定实例的引用(即其他引用它,或者构建它很昂贵),那么你最好用Clear方法。但只有当你要继续使用那个特定的对象实例。

如果您不再关心某个对象,那么请停止引用它。通常,您不必将其设置为null,因为代码生成器可以确定对象的生存期并使该对象可用于垃圾回收。但是,如果您想确保尽快收集对象(即在下一次垃圾回收周期中),那么设置MyObject = null即可。同样,这通常不是必需的,但它不会伤害任何东西。

0

我不这么认为。在使用C#语言课程时,我们有GC(垃圾回收)来推动这个变化非常困难,如果你使用C++,它证明很容易