2010-07-17 196 views
2

是否有从POV性能差/的MemoryUsage之前初始化一个对象,或返回状态之后,如“样品”在:对象初始化

Function Foo() as ComplexObject 

    ' is there a difference ??? ' 
    ' A ' 
    ' Dim obj as New ComplexObject() ' 

    If condition Then Return Nothing 

    ' is there a difference ??? '   
    ' B ' 
    Dim obj as New ComplexObject() 
    ... 
    Return obj 

End Function 

回答

2

如果你的意思,但比较:

Dim obj as New ComplexObject() 

If condition Then Return Nothing之前,则是:是有区别的:它之前完成,那么它new每次一个对象,即使它很快被丢弃并从gen-0收集(对于返回Nothing的情况)。然而,如果你只是If之前声明它(没有New),那么两者应该是相同的(由于IL中的所有本地数据库都是方法范围的,所以局部变量的位置是无关紧要的)。

我不知道VB的,但在C#中,您还可以使用条件运算符:

return condition ? null : new ComplexObject(); 
+0

我担心编译器会创建(并初始化)所有声明的对象(在内部循环之外)。 – serhio 2010-07-17 22:33:57

+0

关于VB.NET中C#或IIF运算符的'?'不能用于我的情况,因为或者我返回一个Nothing(null)或者我需要用新的ComplexObject做一些事情,而不是直接返回它。 – serhio 2010-07-17 22:44:55

+1

@serhio - *声明*发生在IL的开始处;然而,创建**必须在您的代码所说的逻辑点上发生。 – 2010-07-17 22:46:31

1

唯一的区别是,创建对象在返回之前什么都不会使用更多的CPU - 无论哪种方式,对象都将被正确地垃圾回收,并且不再被引用。

我大家都赞成尽可能晚地定义/声明变量。

+0

所以,你确认“A”变种更多的CPU和内存消耗。 – serhio 2010-07-17 22:29:17

+0

我一定会期待它 - 编译器可能会“做正确的事情”并将对象创建移动到if(...)return,以便优化发布版本,但我不会在这就是这样。 – 2010-07-17 22:40:13

1

是的,因为您正在分配本地对象,所以一旦它离开了需要进行垃圾回收的方法,就会产生差异。

+0

因此,无论声明的位置如何,编译器都不会在函数的开头创建所有声明的对象? – serhio 2010-07-17 22:31:20

+0

在Release模式下,编译器可能会检测到您正在创建一个永远不会使用的对象,因此可能会将其删除,但我不会依赖它。只需在需要时尽可能晚地声明/初始化变量。 – 2010-07-17 22:38:14

+0

事实上,我认为在编译时'条件'不能被验证,只有在运行时这是可能的。 – serhio 2010-07-17 22:41:05