是否将类实例化为变量

本文关键字:变量 实例化 是否 | 更新日期: 2023-09-27 18:03:47

这两种功能相同的代码编写方式在性能方面是否存在差异?

选项1:

SomeObjecModel TheObjectModel = new SomeObjectModel();
return TheObjectModel.SomeMethod();

选项2:

return  new SomeObjectModel().SomeMethod();

在选项1中对象被实例化为一个变量,而在选项2中没有变量。

是否将类实例化为变量

很可能没有可测量的差异。在这两种情况下,花费的大部分时间将用于实例化对象,以及执行您的方法。

使用你觉得更容易读的版本。

There WAS -在出现断点的情况下,您无法在调试器中看到该值(因为您只能在返回之前设置断点)。

因此,我经常使用第一种语法,以便能够在返回上设置断点并查看值。实际上,出于完全相同的原因,我甚至会将SomeMethod()调用放入变量中。

自VS 2013 Update 1或2以来,返回值在调试器中显式可用,因此第一种语法是没有意义的。

更新说明如下:

http://blogs.msdn.com/b/visualstudioalm/archive/2013/06/27/seeing -函数返回值- - -调试器在视觉工作室- 2013. aspx

生成的IL代码有不同之处:

Option1:
IL_0000:  newobj      UserQuery+SomeObjectModel..ctor
IL_0005:  stloc.0     // TheObjectModel
IL_0006:  ldloc.0     // TheObjectModel
IL_0007:  callvirt    UserQuery+SomeObjectModel.SomeMethod
IL_000C:  ret         
Option2:
IL_0000:  newobj      UserQuery+SomeObjectModel..ctor
IL_0005:  call        UserQuery+SomeObjectModel.SomeMethod
IL_000A:  ret       

(在打开优化的LinqPad中编译)

这两种方法都可以创建一个变量。一个是内联的。我更担心的是这个变量是否需要处理掉。如果是这样,我更愿意看到所有的东西都包装在一个'using'语句中。

这两种编写代码的方法没有区别。在第一个选项中,GC将收集作用域之后的变量。这不是你选择什么风格写代码的问题,编译器会从高级代码转换和编译成低级代码。

eg:你可以使用Delegate而不是Action,两者都服务于相同的功能,但编码风格不同。所以编译器总是将Action(高级)语句转换为Delegate(低级)

不会有性能差异。因为如果您检查IL代码,它会在创建构造函数后给它一个名称。在任何情况下,你都应该选择哪个更容易读懂。

Option1:
IL_0000:  newobj      UserQuery+SomeObjectModel..ctor
IL_0005:  stloc.0     // TheObjectModel
IL_0006:  ldloc.0     // TheObjectModel
IL_0007:  callvirt    UserQuery+SomeObjectModel.SomeMethod
IL_000C:  ret         
Option2:
IL_0000:  newobj      UserQuery+SomeObjectModel..ctor
IL_0005:  call        UserQuery+SomeObjectModel.SomeMethod
IL_000A:  ret  

在使用callvirt之前,可以在类的空实例上调用方法。为避免空调用,在第一个选项中创建了callvirt。