x=x+1 vs. x +=1

后端 未结 17 1283
独厮守ぢ
独厮守ぢ 2020-12-29 02:57

I\'m under the impression that these two commands result in the same end, namely incrementing X by 1 but that the latter is probably more efficient.

If this is not c

17条回答
  •  天涯浪人
    2020-12-29 03:17

    From the MSDN library for +=:

    Using this operator is almost the same as specifying result = result + expression, except that result is only evaluated once.

    So they are not identical and that is why x += 1 will be more efficient.

    Update: I just noticed that my MSDN Library link was to the JScript page instead of the VB page, which does not contain the same quote.

    Therefore upon further research and testing, that answer does not apply to VB.NET. I was wrong. Here is a sample console app:

    Module Module1
    
    Sub Main()
        Dim x = 0
        Console.WriteLine(PlusEqual1(x))
        Console.WriteLine(Add1(x))
        Console.WriteLine(PlusEqual2(x))
        Console.WriteLine(Add2(x))
        Console.ReadLine()
    End Sub
    
    Public Function PlusEqual1(ByVal x As Integer) As Integer
        x += 1
        Return x
    End Function
    
    Public Function Add1(ByVal x As Integer) As Integer
        x = x + 1
        Return x
    End Function
    
    Public Function PlusEqual2(ByVal x As Integer) As Integer
        x += 2
        Return x
    End Function
    
    Public Function Add2(ByVal x As Integer) As Integer
        x = x + 2
        Return x
    End Function
    
    End Module
    

    IL for both PlusEqual1 and Add1 are indeed identical:

    .method public static int32 Add1(int32 x) cil managed
    {
    .maxstack 2
    .locals init (
        [0] int32 Add1)
    L_0000: nop 
    L_0001: ldarg.0 
    L_0002: ldc.i4.1 
    L_0003: add.ovf 
    L_0004: starg.s x
    L_0006: ldarg.0 
    L_0007: stloc.0 
    L_0008: br.s L_000a
    L_000a: ldloc.0 
    L_000b: ret 
    }
    

    The IL for PlusEqual2 and Add2 are nearly identical to that as well:

    .method public static int32 Add2(int32 x) cil managed
    { 
    .maxstack 2
    .locals init (
        [0] int32 Add2)
    L_0000: nop 
    L_0001: ldarg.0 
    L_0002: ldc.i4.2 
    L_0003: add.ovf 
    L_0004: starg.s x
    L_0006: ldarg.0 
    L_0007: stloc.0 
    L_0008: br.s L_000a
    L_000a: ldloc.0 
    L_000b: ret 
    }
    

提交回复
热议问题