2010-11-17 156 views
0

GC如何处理在以下两种场景中创建的对象?处理对象

1)

Private Function DoSomething() As Boolean 
    Return New DatabaseManager().Insert() 
End Function 

2)

Private Function DoSomething() As Boolean 
    Dim mngr As New DatabaseManager() 
    Return mngr.Insert() 
End Function 

在选项1,我不创建本地变量来保存对象的引用。在选项2中,我保留了局部变量中的引用。

什么选择更好,为什么? (如果有的话)

回答

4

正如你可以看到,在选项1,我不创建本地变量来保存对象

您可能没有明确的创建它的参考,但相信我在编译器发出的IL级别是创建对象的实例,因为不能在没有实例的情况下调用对象上的实例方法。

这些在垃圾收集方面是等价的,可能编译器会优化它。而且,因为它们当然相同,所以首选是代码少并且对您更易读的。对我来说这是第一次,但它可能是主观的,所以这真的取决于你。

+1

在IL级别,很有可能创建一个对象而不将其存储在局部变量中。该对象被返回到堆栈中,所以如果你只使用它一次,没有什么能够阻止编译器消除不必要的'stloc.0'和'ldloc.0'。 – cHao 2010-11-17 18:52:21

+0

@ cHao,非常好的评论,点了。我会更新我的帖子。 – 2010-11-17 18:53:45

2

没有区别,JIT编译器会为两者生成完全相同的机器码。 DataBaseManager对象对于垃圾收集器是可见的,通常在Insert方法中将其保存在CPU寄存器中,作为引用。之后运行的任何GC都会清理它。