От положительного к отрицательному числу лучших практик в C#
Существует 2 распространенных способа преобразования положительного числа в отрицательное и наоборот:
var a = -a;
а также
var a = (-1)*a;
Второе предпочтительнее, насколько я знаю, но почему? И есть ли другие лучшие практики в преобразовании знака числа (int, float, double и т. Д.)?
РЕДАКТИРОВАТЬ: есть ли разница в унарной минус операции и умножения на -1?
2 ответа
На сайте 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 i намного проще и короче. затем -a
это лучший способ.
Я не понимаю, почему вы думаете, что второй будет предпочтительным методом, так как первый намного проще, и я использую этот метод все время. Второй метод также очень распространен, но он не используется, так как вы хотите написать наименьшее количество кода, но если вы планируете все прояснить... тогда я бы предпочел второй метод. Вы также можете использовать Math.abs(x), если хотите, но я бы определенно предпочел первый метод. Если вы хотите узнать больше о Math.abs, вы можете найти множество учебных пособий через Google. Надеюсь, что это решило ваш вопрос в некотором роде.:)