给定一个带有方法DoSomething的非静态类Foo,以下两个代码片段是有效的:
Foo myFoo = new Foo();
Foo.DoSomething();
或
new Foo().DoSomething();
考虑到我不需要对Foo做任何其他事情的情况,并且在调用DoSomething之后可以高兴地抛弃它,这两者之间是否存在偏好,或者它们是否编译成相同的东西?
我知道写Foo可能有更好的方法,但我现在无法做到这一点,所以我只是想知道使用我所拥有的最佳方式。
答案 0 :(得分:1)
这是IL:
案例1。
var t = new Foo();
t.DoSomething();
编译到
IL_0000: newobj instance void Tests.Foo::.ctor()
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: callvirt instance void Tests.Foo::DoSomething()
IL_000c: ret
案例2。
new Foo().DoSomething();
编译到
IL_0000: newobj instance void Tests.Foo::.ctor()
IL_0005: call instance void Tests.Foo::DoSomething()
IL_000a: ret
后者是比第一个更短的两个指令,但你不应该担心这个,除非你有大量的调用,因为这将是一个微不足道的差异。