Rendimiento de la función VB.NET

Para devolver un valor desde una función VB.NET, se puede asignar un valor al “Nombre de las funciones” o usar “valor de retorno”.

A veces los veo mezclados en la misma función. Personalmente, prefiero el regreso.

Mi pregunta es, ¿cuál es la diferencia interna, si hay alguna, entre los dos?

Probablemente no haya diferencia. IIRC, el comstackdor generado IL convierte ambos en declaraciones de devolución a menos que haya un uso adicional de una variable _returnValue.

La legibilidad de la asignación FunctionName es pobre en mi opinión, y un ejemplo de un mal hábito VB6. Prefiero el método de variable _returnValue (NOT RETVAL) también.

¡La diferencia es que HACEN DIFERENTES COSAS!

‘Valor de retorno’ hace 2 cosas:
1. Establece el valor de retorno de la función en ese punto 2. Sale inmediatamente de la función

¡No se ejecuta ningún otro código en la función!

‘Nombre de función = valor’ hace 1 cosa: 1. Establece el valor de retorno de la función en ese punto

Se continúa ejecutando otro código en la función Esto habilita la lógica adicional para refinar o anular el valor de retorno de la función

Enorme diferencia gente. Recuerde que no se trata solo de estado, también se trata de flujo.

Echemos un vistazo … Curiosamente, el “functionName =” genera menos IL?

Código:

Public Function Test() As String Test = "Test" End Function Public Function Test2() As String Return "Test" End Function 

ILLINOIS:

 .method public static string Test() cil managed { .maxstack 1 .locals init ( [0] string Test) L_0000: nop L_0001: ldstr "Test" L_0006: stloc.0 L_0007: ldloc.0 L_0008: ret } .method public static string Test2() cil managed { .maxstack 1 .locals init ( [0] string Test2) L_0000: nop L_0001: ldstr "Test" L_0006: stloc.0 L_0007: br.s L_0009 L_0009: ldloc.0 L_000a: ret } 

Hacer lo siguiente solo se proporciona a los desarrolladores de Visual Basic 6.0 para codificar el puerto fácilmente:

 Public Function MyFunction() As String MyFunction = "Hello" End Function 

Definitivamente no recomendaría seguir haciéndolo si su proyecto incluye a alguien que no haya trabajado con Visual Basic 6.0, ya que esta syntax será confusa.

99 veces de cada 100 usaré el “valor de retorno”.

De vez en cuando tendré una función en la que el otro tipo no solo me permite guardar una statement de variable, sino que lo hago de una manera que realmente aclara de manera significativa la función. Por lo general, esto sucede cuando quisiera nombrar el valor de retorno igual que la función de todos modos, y a menudo estas son funciones recursivas; algo sobre ese constructo lo presta a la variable de retorno implícito. Sin embargo, ese escenario es extremadamente raro . No sé si tengo alguna función que use variables de devolución implícitas en mi proyecto actual.

Después de leer que la syntax de Return Value era One True .NET Way of Doing Things, pensé “OK, lo haremos de esa manera”. Luego escribí una función que sabía, hand to heart KNEW, devolvía un valor de una instrucción Return o alternativamente una excepción bajo todas las circunstancias, y aún recibí un comstackdor advirtiendo que la función “no devuelve un valor en todas las rutas” .

Afortunadamente encontré la pregunta sobre el desbordamiento de la stack. ¿ Cómo puedo hacer que esta función no genere una advertencia de “no devuelve ningún valor en todas las rutas”? que explica por qué; agregar una asignación de valor predeterminada al nombre del procedimiento en el encabezado de la función también evitó la advertencia en mi caso.

En consecuencia, aunque continuaré usando la syntax del valor devuelto simplemente por la coherencia de la syntax, también asignaré un valor predeterminado al nombre de la función solo para evitar la posibilidad de complicar el proceso de comstackción con advertencias falsas.