1

给定一个具有方法 DoSomething 的非静态类 Foo,以下两个代码片段是有效的:

Foo myFoo = new Foo();
Foo.DoSomething();

或者

new Foo().DoSomething();

鉴于我不需要对 Foo 做任何其他事情,并且可以在调用 DoSomething 后愉快地将其丢弃,这两者之间是否存在偏好,或者它们是否编译为相同的东西?

我知道可能有更好的写 Foo 的方法,但我目前无法做到这一点,所以我只是想知道使用我所拥有的最好的方法。

4

1 回答 1

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

后者比第一个短两条指令,但除非你有大量的调用,否则你不应该担心这一点,因为这将是一个微不足道的差异。

于 2013-04-29T06:46:37.643 回答