2016-03-24 143 views
-1

有亦然2種常見的方式來轉換正數負和副負數最佳實踐:積極在C#

var a = -a; 

var a = (-1)*a; 

其次是首選,因爲我知道,但爲什麼?在轉換數字符號(int,float,double等)方面還有其他的最佳做法嗎?

編輯:一元減法運算和乘法運算有沒有區別?

+7

什麼讓你覺得第二個是首選?似乎對我非常混亂。請注意,既不會天真地期望如果'a'是'int.MinValue' /'long.MinValue' ... –

+1

我認爲你的意思是'int a = 1'和'a = -a'類似的東西。 – J3soon

+0

我的意思是任何數字...所以喬恩Skeet - 你是對的,但你不建議任何正確的版本,並沒有回答我的問題 –

回答

4

現場http://tryroslyn.azurewebsites.net/您可以看到編譯器生成的代碼。

併爲:

using System; 
public class C { 
    public int M() { 
     int a = -2; 

     a = -a; 

     return a;    
    } 

    public int M1() { 
     int a = 3; 

     a = (-1) * a; 

     return a; 
    } 
} 

編譯器生成:

.class private auto ansi '<Module>' 
{ 
} // end of class <Module> 

.class public auto ansi beforefieldinit C 
    extends [mscorlib]System.Object 
{ 
    // Methods 
    .method public hidebysig 
     instance int32 M() cil managed 
    { 
     // Method begins at RVA 0x2050 
     // Code size 4 (0x4) 
     .maxstack 8 

     IL_0000: ldc.i4.s -2 
     IL_0002: neg 
     IL_0003: ret 
    } // end of method C::M 

    .method public hidebysig 
     instance int32 M1() cil managed 
    { 
     // Method begins at RVA 0x2058 
     // Code size 8 (0x8) 
     .maxstack 2 
     .locals init (
      [0] int32 
     ) 

     IL_0000: ldc.i4.3 
     IL_0001: stloc.0 
     IL_0002: ldc.i4.m1 
     IL_0003: ldloc.0 
     IL_0004: mul 
     IL_0005: stloc.0 
     IL_0006: ldloc.0 
     IL_0007: ret 
    } // end of method C::M1 

    .method public hidebysig specialname rtspecialname 
     instance void .ctor() cil managed 
    { 
     // Method begins at RVA 0x206c 
     // Code size 7 (0x7) 
     .maxstack 8 

     IL_0000: ldarg.0 
     IL_0001: call instance void [mscorlib]System.Object::.ctor() 
     IL_0006: ret 
    } // end of method C::.ctor 

} // end of class C 

正如你看到的子程序M我更simplier和更短的代碼。 然後-a是更好的方法。

+0

ohh,謝謝!這就是我想要的! –

0

我不明白你爲什麼認爲第二種方法是首選方法,因爲第一種方法簡單得多,而且我始終使用這種方法。第二種方法也是一種非常常見的方法,但沒有使用,因爲您希望編寫最少量的代碼,但如果您打算將所有內容都清除乾淨,那麼我寧願使用第二種方法。 你也可以使用Math.abs(x)如果你想,但我肯定會喜歡第一種方法。如果你想了解更多關於Math.abs的信息,那麼你可以通過google找到很多教程。 希望通過某種方式解決了您的問題。 :)