c#编译器比VB.NET编译器更智能吗?

Ola*_*laf 11 c# vb.net compiler-construction intermediate-language linqpad

如果我查看Linqpad中为以下两个代码片段创建的IL,我想知道这里发生了什么.

在c#中

int i = 42;
Run Code Online (Sandbox Code Playgroud)

得到以下IL代码

IL_0000:  ret
Run Code Online (Sandbox Code Playgroud)

而在VB中

Dim i As Integer = 42
Run Code Online (Sandbox Code Playgroud)

它是

IL_0000:  ldc.i4.s    2A 
IL_0002:  stloc.0  
Run Code Online (Sandbox Code Playgroud)

显然,c#编译器理解该值从未使用过,因此根本不返回任何内容.在VB.NET中,实际代码被翻译.

这是由于编译器优化的差异还是还有其他工作原因?

更新:只是为了澄清这一点 - 我只是将这一行输入LinqPad并查看它创建的IL(最明确的是运行相应的编译器).有没有计划.

Aak*_*shM 10

收走了linqpad问题,我跑vbc,并csc/optimize+ /debug-这些程序:

Module f

Public Sub Main()
    Dim i As Integer = 42
End Sub

End Module
Run Code Online (Sandbox Code Playgroud)

public static class f
{

public static void Main()
{
    int i = 42;
}

}
Run Code Online (Sandbox Code Playgroud)

并从ILDASM获得这些CIL结果:

对于VB:

.method public static void  Main() cil managed
{
  .entrypoint
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) 
  // Code size       4 (0x4)
  .maxstack  1
  .locals init (int32 V_0)
  IL_0000:  ldc.i4.s   42
  IL_0002:  stloc.0
  IL_0003:  ret
} // end of method f::Main
Run Code Online (Sandbox Code Playgroud)

对于C#:

.method public hidebysig static void  Main() cil managed
{
  .entrypoint
  // Code size       1 (0x1)
  .maxstack  8
  IL_0000:  ret
} // end of method f::Main
Run Code Online (Sandbox Code Playgroud)

所以,是的,至少在这方面csc比"更聪明" vbc.但我敢打赌,JITter会在执行时删除任何差异.

编辑

我检查过,实际上执行的本机代码不同的,至少在我的系统上.我Console.ReadLine()在两者中调用了一个机会来附加一个调试器,我得到了这些反汇编:

来自VB:

00000000  sub         rsp,38h 
00000004  mov         dword ptr [rsp+20h],0 
0000000c  mov         rax,7FF000434D8h 
00000016  mov         eax,dword ptr [rax] 
00000018  test        eax,eax 
0000001a  je          0000000000000021 
0000001c  call        FFFFFFFFE45BA230 
00000021  mov         dword ptr [rsp+20h],2Ah 
00000029  call        FFFFFFFFE26ABF20 
0000002e  mov         qword ptr [rsp+28h],rax 
00000033  nop 
00000034  jmp         0000000000000036 
00000036  add         rsp,38h 
0000003a  ret 
Run Code Online (Sandbox Code Playgroud)

来自C#:

00000000  sub         rsp,38h 
00000004  mov         rax,7FF000534D8h 
0000000e  mov         eax,dword ptr [rax] 
00000010  test        eax,eax 
00000012  je          0000000000000019 
00000014  call        FFFFFFFFE45AA230 
00000019  call        FFFFFFFFE391BF20 
0000001e  mov         qword ptr [rsp+20h],rax 
00000023  nop 
00000024  jmp         0000000000000026 
00000026  add         rsp,38h 
0000002a  ret 
Run Code Online (Sandbox Code Playgroud)

现在,我的组合几乎不存在,但即便如此我也能看到

mov         dword ptr [rsp+20h],2Ah 
Run Code Online (Sandbox Code Playgroud)

from-VB中的十六进制常量值2A,即十进制42.所以,你去,它最终执行更多的指令.

  • 好吧,我们也有一个更大的堆栈,如8(C#)vs 1 (2认同)