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中,我将参考保存在局部变量中。
哪个选项更好,为什么? (如果有的话)
答案 0 :(得分:4)
如您所见,在选项1中,我不创建局部变量来保存对象的引用
您可能没有明确地创建它,但请相信我在IL级别,编译器发出的是创建对象的实例,因为您无法在没有实例的对象上调用实例方法。
这些在垃圾收集方面是等价的,编译器可能会优化它。并且因为它们当然是等同的,所以首选的是涉及更少代码并且对您更具可读性的那个。对我来说这是第一次,但它可能是主观的,所以这取决于你。
答案 1 :(得分:2)
没有区别,JIT编译器将为两者生成完全相同的机器代码。 DataBaseManager对象对垃圾收集器是可见的,通常作为Insert方法中的 Me 引用保存在CPU寄存器中。之后运行的任何GC都会清理它。