2016-03-24 2 views
-1

Есть 2 основных способа преобразования положительное число в отрицательное и наоборот:Положительное Отрицательное число лучших практик в C#

var a = -a; 

и

var a = (-1)*a; 

Вторым является предпочтительным, так как я знаю, но почему? И есть ли другая лучшая практика в преобразовании знака числа (int, float, double и т. Д.)?

EDIT: есть ли разница в унарной работе минус и умножении на -1?

+7

Что заставляет вас думать, что второй предпочтительнее? Кажется ужасно грязным для меня. Обратите внимание, что ни один из них не будет работать так, как вы могли бы наивно ожидать, если '' '' 'int.MinValue' /' long.MinValue' ... –

+1

Я думаю, вы имеете в виду 'int a = 1' и' a = -a' что-то вроде этого , – J3soon

+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 - лучший способ.

+0

ohh, Благодаря! Это то, что я ищу! –

0

Я не понимаю, почему вы думаете, что второй предпочтительный метод, поскольку первый из них намного проще, и я все время использую этот метод. Второй метод также является очень распространенным, но не используется так, как вы хотели бы написать наименьшее количество кода, но если вы планируете сделать все понятным ... тогда я бы предпочел второй метод. Вы также можете использовать Math.abs (x), если хотите, но я бы определенно предпочел первый метод. Если вы хотите узнать больше о Math.abs, вы можете найти множество обучающих программ через Google. Надеюсь, что это решило ваш вопрос. :)

Смежные вопросы