C#中的正数到负数最佳实践

时间:2016-03-24 11:18:54

标签: c# numbers negative-number

将正数转换为负数有两种常用方法,反之亦然:

var a = -a;

var a = (-1)*a;

我知道第二个是首选,但为什么呢?转换数字符号(int,float,double等)还有其他最佳实践吗?

编辑:一元减运和乘法有没有差别-1?

2 个答案:

答案 0 :(得分: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的代码更简单,更短。 然后-a是更好的方式。

答案 1 :(得分:0)

我不明白为什么你认为第二种方法是首选方法,因为第一种方法更简单,我总是使用这种方法。第二种方法也是一种非常常见的方法,但是没有使用,因为你想要编写最少量的代码,但是如果你打算让一切都清楚......那么我更喜欢第二种方法。 你也可以使用Math.abs(x),但我肯定更喜欢第一种方法。如果你想了解更多关于Math.abs的信息,那么你可以通过谷歌找到很多教程。 希望这能以某种方式解决您的问题。 :)