在这两个代码块的背景中发生了什么不同?一个被认为比另一个更"好"吗?
我的想法是Example2可能更糟糕,因为它可能不得不等待垃圾收集器处理该项目,但我不知道垃圾收集器是否知道这是否属实.
例1:
ListItem item;
for (int i = 1; i <= 32; i++)
{
item = new ListItem();
//do some stuff
}
Run Code Online (Sandbox Code Playgroud)
例2:
for (int i = 1; i <= 32; i++)
{
ListItem item = new ListItem();
//do some stuff
}
Run Code Online (Sandbox Code Playgroud)
Ces*_*Gon 10
我已将您的代码复制到Visual Studio中,编译它,然后查看生成的IL.这是从示例1生成的IL:
.method private hidebysig static void One() cil managed
{
// Code size 30 (0x1e)
.maxstack 2
.locals init ([0] class WinTest.ListItem item,
[1] int32 i,
[2] bool CS$4$0000)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: stloc.1
IL_0003: br.s IL_0011
IL_0005: nop
IL_0006: newobj instance void WinTest.ListItem::.ctor()
IL_000b: stloc.0
IL_000c: nop
IL_000d: ldloc.1
IL_000e: ldc.i4.1
IL_000f: add
IL_0010: stloc.1
IL_0011: ldloc.1
IL_0012: ldc.i4.s 32
IL_0014: cgt
IL_0016: ldc.i4.0
IL_0017: ceq
IL_0019: stloc.2
IL_001a: ldloc.2
IL_001b: brtrue.s IL_0005
IL_001d: ret
} // end of method Program::One
Run Code Online (Sandbox Code Playgroud)
这是从例2生成的IL:
.method private hidebysig static void Two() cil managed
{
// Code size 30 (0x1e)
.maxstack 2
.locals init ([0] int32 i,
[1] class WinTest.ListItem item,
[2] bool CS$4$0000)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: stloc.0
IL_0003: br.s IL_0011
IL_0005: nop
IL_0006: newobj instance void WinTest.ListItem::.ctor()
IL_000b: stloc.1
IL_000c: nop
IL_000d: ldloc.0
IL_000e: ldc.i4.1
IL_000f: add
IL_0010: stloc.0
IL_0011: ldloc.0
IL_0012: ldc.i4.s 32
IL_0014: cgt
IL_0016: ldc.i4.0
IL_0017: ceq
IL_0019: stloc.2
IL_001a: ldloc.2
IL_001b: brtrue.s IL_0005
IL_001d: ret
} // end of method Program::Two
Run Code Online (Sandbox Code Playgroud)
据我所知,它们是相同的,除了本地人以相反的顺序声明(并因此被访问)这一事实.我不认为这会对性能产生任何影响.
| 归档时间: |
|
| 查看次数: |
1408 次 |
| 最近记录: |