with net c# vb.net operators

net - vb to c#



Sin operador incremental en VB.net (5)

Como dijo @paxdiablo, en VB (o más bien, en su antecesor BASIC), todo solía ser una afirmación . Y, de hecho, cada declaración fue introducida por una palabra clave.

Entonces para asignar una variable que teníamos

LET x = x + 1

y para llamar a un método, tuvimos

CALL SomeMethod

En VB, el LET y CALL finalmente se descartaron (excepto en una circunstancia especial) porque es completamente redundante y no agrega claridad. Pero la gramática léxica subyacente de VB no cambió demasiado: cada enunciado todavía tiene que ser una afirmación . i++ no es una declaración en VB, ya que carece de una llamada de función o una asignación.

Hubo un argumento en la primera versión de VB.NET sobre si introducir operadores previos y posteriores al incremento como en C #. Se decidió no hacerlo, por una razón bastante simple: no se recomienda el uso de efectos secundarios en las expresiones de todos modos. Por lo general, deja que la claridad sufra. Así que incluso en C # los usos legítimos de i++ en una expresión son muy raros, y los usos legítimos de ++i son aún más raros (aunque no negaré que en algunos casos agrega claridad).

En la mayoría de los casos, puede usar i += 1 bien y esto expresa perfectamente la intención.

Observe que en C ++, la situación es fundamentalmente diferente porque aquí (¡pero no en C #!) i++ realidad tiene una semántica diferente que i += 1 debido a la sobrecarga del operador (en C # también tenemos sobrecarga del operador pero ++ no puede sobrecargarse).

Soy bastante nuevo en vb.net y me encontré con este problema al convertir un bucle for en C # a VB.net Me di cuenta de que los operadores de incremento no están disponibles en vb.net (++ y -) mientras que yo era capaz de hacerlo algo así como cnt +=1

Investigué un poco y me encontré con la publicación de Eric sobre el mismo, pero no pude entender completamente. Menciona de In VB, una DECLARACIÓN no puede ser solo una EXPRESIÓN. no estoy seguro de cómo eso realmente encaja

Espero que alguien aquí pueda explicar por qué esto no funciona de la misma manera que en C #. (Espero que esto también sea cierto como en por qué tenemos == en C # para comparar)


Como ejemplo de la diferencia entre expresión y enunciado en VB, en VB lo siguiente genera un error de compilación ya que count += 1 incrementa el count por 1, pero el count += 1 expresión total count += 1 no devuelve un resultado, por lo que no puede ser utilizado como un parámetro.

Dim count As Integer = 0 Console.WriteLine(count += 1) '' compiler error

Tienes que hacer esto en cambio

Dim count As Integer = 0 count += 1 Console.Writeline(count)

Por supuesto, esto se aplica al uso del operador += en una cadena.

¿Qué significa "In VB, una declaración no puede ser solo una expresión"?

  • El compilador de VB requiere que los resultados se consuman en alguna asignación u otra operación.
  • Debido a esto, una operación de asignación en VB no produce un resultado. Si lo hiciera, el compilador de VB no lo dejaría solo como una declaración (el compilador requiere que se consuman los resultados).
  • Por lo tanto, las asignaciones en VB se pueden usar como enunciados, pero no como expresiones. Es decir, no puede usar una declaración de asignación como un parámetro para un método, o como un resultado intermedio.
  • En C #, una operación de asignación produce un valor. Por lo tanto, para que las asignaciones sean independientes como enunciados, el compilador no requiere que se consuman todos los resultados.
  • El corolario en C # es que cualquier otra operación que produce un resultado puede ser independiente como una declaración. 2 + 2 por ejemplo, produce el resultado 4 y puede estar solo como una declaración, mientras que en VB no puede.

Respuesta simplificada a "¿Por qué los operadores de incremento previo y posterior no están disponibles en VB?"

count++ dice, primero devuelve el valor del count , luego el count incremental (y no devuelve el valor de la asignación para count ).
En este caso, el valor incrementado no se usa (se usa el valor antes de incrementar). Como se mencionó anteriormente, el compilador de VB requiere que utilice o asigne valores de operaciones.

++count dice: primer count incrementos, luego devuelve el valor de la asignación para count .
En este caso, el valor de asignar +1 a la count se devuelve como el valor de la expresión. Como se mencionó anteriormente, las asignaciones en VB no producen un resultado.
Por lo tanto, habría un gran dolor al implementar estos operadores en VB.


Los siguientes métodos de extensión replican ++x x++ --x x--

Public Module INC_DEC <Runtime.CompilerServices.Extension> Public Function PreINC(ByRef x As Integer) As Integer Return Interlocked.Increment(x) End Function <Runtime.CompilerServices.Extension> Public Function PostINC(ByRef x As Integer) As Integer Dim tmp = x Interlocked.Increment(x) Return tmp End Function <Runtime.CompilerServices.Extension> Public Function PreDEC(ByRef x As Integer) As Integer Return Interlocked.Decrement(x) End Function <Runtime.CompilerServices.Extension> Public Function PostDEC(ByRef x As Integer) As Integer Dim tmp = x Interlocked.Decrement(x) Return tmp End Function End Module


Simplemente porque los diseñadores pensaron que i++ es innecesario cuando tienes i += 1 .

For bucles no necesita ninguno, por lo que no pierde nada.

Es Visual Basic después de todo ... ¿por qué hacerlo complicado?


Yo diría que los diseñadores de lenguaje simplemente pensaron que BASIC era una línea de base mejor que C al diseñar Visual BASIC . Puede seguir el linaje de C (y, antes, BCPL ) a través de C++ , Java y C# .

El linaje VB proviene del BASIC original de Dartmouth (y, anteriormente, Fortran ) y es una bestia completamente diferente.

En otras palabras, lo que comenzó como el venerable BASIC :

LET I = I + 1

probablemente ha sido pirateado y destruido lo suficiente :-)

Según la publicación de Eric, i++; de hecho es solo una expresión, una que produce i con el efecto secundario de que i se incrementa después del evento ( i++; es una expresión, al igual que la expresión de efectos no secundarios i; ).

Eso es porque C permite estas expresiones desnudas, incluso cosas como 42; que realmente no hace mucho pero es perfectamente válido. En otras palabras, el siguiente es un programa completo de C :

int main (void) { 1; 2; 3; 4; 5; 6; 7; 8; 9; return 0; }

Todas esas expresiones son válidas pero inútiles.

En BASIC , esto no se hizo realmente, porque BASIC consistió en declaraciones (cosas que hicieron algo). Es por eso que i += 1 (una instrucción que incrementa i ) se considera kosher pero i++ (una expresión que no hace nada y que simplemente tiene un efecto secundario que aumenta i ) no lo es. Se podría argumentar que es solo una división semántica del cabello y sin duda los diseñadores de VB sí argumentaron.

Pero el grupo que ganó el día fue el grupo "no necesitamos Apestoso C en nuestro querido lenguaje".

Deberías estar agradecido por las pequeñas misericordias, al menos no tienes que lidiar con COBOL:

ADD 1 TO DD_WS_I.