2016-03-24 14 views
-1

Es gibt zwei gemeinsame Wege positive Zahl zu negativ und umge zu konvertieren kehrt:Positive negative Zahl Best Practices in C#

var a = -a; 

und

var a = (-1)*a; 

Zweite bevorzugt ist, wie ich weiß, aber warum? Und gibt es noch andere Best Practices beim Konvertieren des Vorzeichens der Zahl (int, float, double usw.)?

EDIT: Gibt es einen Unterschied in unären Minus-Operation und Multiplikation auf -1?

+7

Was lässt Sie denken, dass die zweite bevorzugt wird? Scheint furchtbar unordentlich für mich. Beachten Sie, dass keiner funktioniert, wie Sie naiv erwarten würden, wenn 'a' ist' int.MinValue'/'long.MinValue' ... –

+1

Ich denke, Sie meinen' int a = 1' und 'a = -a' so etwas . – J3soon

+0

Ich meine jede Zahl ... Also Jon Skeet - Sie haben Recht, aber Sie vorschlagen keine richtige Version und beantwortete meine Frage nicht –

Antwort

4

Vor Ort http://tryroslyn.azurewebsites.net/ können Sie Code vom Compiler generiert sehen.

Und für:

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; 
    } 
} 

Compiler erzeugt:

.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 

Wie Sie Code für die Methode M siehe i viel einfachere und kürzer. Dann ist -a der bessere Weg.

+0

ohh, Vielen Dank! Das ist was ich suche! –

0

Ich verstehe nicht, warum Sie denken, dass die zweite die bevorzugte Methode wäre, da die erste viel einfacher ist und ich benutze diese Methode die ganze Zeit. Die zweite Methode ist ebenfalls sehr verbreitet, wird aber nicht verwendet, da Sie die geringste Menge an Code schreiben möchten. Wenn Sie jedoch vorhaben, alles klarzustellen, dann würde ich die zweite Methode bevorzugen. Sie könnten auch Math.abs (x) verwenden, wenn Sie möchten, aber ich würde definitiv die erste Methode bevorzugen. Wenn Sie mehr über Math.abs erfahren möchten, können Sie viele Tutorials über Google finden. Hoffe das löste Ihre Frage auf eine Art und Weise. :)