Pregunta

Para devolver un valor de una función VB.NET se puede asignar un valor al " Nombre de funciones " o use " valor de retorno. "

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

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

¿Fue útil?

Solución

Probablemente no haya diferencia. IIRC, el compilador generado IL los convierte a ambos en declaraciones de retorno a menos que haya un uso adicional de una variable _returnValue .

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

Otros consejos

¡La diferencia es que HACEN COSAS DIFERENTES!

'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 más código en la función!

'Functionname = value' hace 1 cosa: 1. Establece el valor de retorno de la función en ese punto

Otro código en la función continúa ejecutándose Esto permite una lógica adicional para refinar o anular el valor de retorno de la función

Gran diferencia amigos. Recuerde que no se trata solo de estado, también se trata de flujo.

Echemos un vistazo ... Curiosamente la " functionName = " genera menos IL?

Código:

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


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

IL:

.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 para los desarrolladores Visual Basic 6.0 para portar código fácilmente sobre: ??

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 sintaxis será confusa.

99 de cada 100 veces usaré " valor de retorno " ;.

De vez en cuando tendré una función en la que el otro tipo no solo me permite guardar una declaración de variable, sino que lo hago de una manera que realmente aclara significativamente 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 esa construcción 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 retorno implícitas en mi proyecto actual.

Habiendo leído que la sintaxis del Valor de retorno era la verdadera .NET forma de hacer Cosas que pensé '' OK, lo haremos así ''. Luego escribí una función que sabía, de corazón, SABÍA, devolvió un valor de una declaración de devolución o, alternativamente, una excepción en todas las circunstancias, y todavía recibí un compilador que advierte que la función "no devuelve un valor en todas las rutas" ;.

Afortunadamente me encontré con la pregunta de desbordamiento de pila ¿Cómo puedo hacer que esta función no genere un & # 8220; no devuelve un valor en todos los caminos & # 8221; advertencia? que explica por qué; agregar una asignación de valor predeterminada al nombre del procedimiento en la cabecera de la función también impidió la advertencia en mi caso.

Por consiguiente, aunque continuaré usando la sintaxis de Valor de retorno simplemente por la coherencia de la sintaxis, también asignaré un valor predeterminado al nombre de la función solo para evitar la posibilidad de saturar el proceso de compilación con advertencias falsas.

es bastante útil cuando se trabaja con fábricas de terceros (_hsf), puede evitar declarar variables de retorno

Public Function CreateExtremum(iShape As INFITF.Reference, iDir1 As HybridShapeTypeLib.HybridShapeDirection, iSide1 As Integer, iDir2 As HybridShapeTypeLib.HybridShapeDirection, iSide2 As Integer, iDir3 As HybridShapeTypeLib.HybridShapeDirection, iSide3 As Integer) As HybridShapeTypeLib.HybridShapeExtremum
    CreateExtremum = _hsf.AddNewExtremum(iShape, iDir1, iSide1)
    CreateExtremum.Direction2 = iDir2
    CreateExtremum.ExtremumType2 = iSide2
    CreateExtremum.Direction3 = iDir3
    CreateExtremum.ExtremumType3 = iSide3
    CreateExtremum.Compute()
End Function

Cuando Herramientas / Opciones / Editor de texto / Todos los idiomas / Lente de código está activado, el Recuento de referencias se muestra arriba de cada declaración de Sub, Función o Propiedad.

" Valor de retorno " parece mejor que "asignar un valor al Nombre de funciones". En este último caso, "Lente de código" produce un recuento de referencia inflado.

' Code Lens reports "0 references" here for Sub Rosa().
Public Sub Rosa()
    Diagnostics.Debug.WriteLine(Test())
    Diagnostics.Debug.WriteLine(Test2())
End Sub

' Code Lens reports "2 references" here for Function Test().
Public Function Test() As String
    Test = "Test"       ' Code Lens counts this as a reference.
End Function

' Code Lens reports "1 reference" here for Function Test2().
Public Function Test2() As String
    Dim strTest2 as String = "Test"
    Return strTest2     ' Code Lens does NOT count this as a reference.
End Function
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top