whats novedades new net features español c# .net vb.net operators division

novedades - new features c#



División de enteros VB.NET vs C# (5)

¿Alguien quiere explicar por qué estos dos códigos muestran resultados diferentes?

VB.NET v4.0

Dim p As Integer = 16 Dim i As Integer = 10 Dim y As Integer = p / i //Result: 2

C # v4.0

int p = 16; int i = 10; int y = p / i; //Result: 1


"La división se realiza de forma diferente en C # y VB. C #, como otros lenguajes basados ​​en C, trunca el resultado de división cuando ambos operandos son literales enteros o variables enteras (o constantes enteras) .En VB, debe usar el operador de división de enteros ( / ) para obtener un resultado similar ".

Source


Cuando mira el código IL que producen esos dos fragmentos, se dará cuenta de que VB.NET primero convierte los valores enteros en dobles, aplica la división y luego redondea el resultado antes de volver a int32 y guardarlo en y.

C # no hace nada de eso.

Código VB.NET IL:

IL_0000: ldc.i4.s 10 IL_0002: stloc.1 IL_0003: ldc.i4.s 0A IL_0005: stloc.0 IL_0006: ldloc.1 IL_0007: conv.r8 IL_0008: ldloc.0 IL_0009: conv.r8 IL_000A: div IL_000B: call System.Math.Round IL_0010: conv.ovf.i4 IL_0011: stloc.2 IL_0012: ldloc.2 IL_0013: call System.Console.WriteLine

C # IL Código:

IL_0000: ldc.i4.s 10 IL_0002: stloc.0 IL_0003: ldc.i4.s 0A IL_0005: stloc.1 IL_0006: ldloc.0 IL_0007: ldloc.1 IL_0008: div IL_0009: stloc.2 IL_000A: ldloc.2 IL_000B: call System.Console.WriteLine

La división entera "correcta" en VB necesita una barra invertida: p / i



En C #, la división entera se aplica con / cuando tanto el numerador como el denomenator son enteros. Mientras que, en VB.Net ''/'' da como resultado la división de coma flotante, por lo que para la división de enteros en VB.Net use / . Eche un vistazo a esta publicación de MSDN .


En VB, para hacer una división entera , invierta la barra:

Dim y As Integer = p / i

de lo contrario, se expande a punto flotante para la división, luego se vuelve a forzar a un int después del redondeo cuando se asigna a y .