web-dev-qa-db-fra.com

Retour de fonction VB.NET

Afin de renvoyer une valeur à partir d'une fonction VB.NET, on peut attribuer une valeur au "Nom des fonctions" ou utiliser "valeur de retour".

Je vois parfois ces mixtes dans la même fonction. Personnellement, je préfère le retour.

Ma question est, quelle est la différence interne, le cas échéant, entre les deux?

25
user50612

Il n'y a probablement aucune différence. IIRC, le compilateur généré IL les convertit tous les deux en instructions Return sauf s'il existe une utilisation supplémentaire d'une variable _returnValue.

La lisibilité de l'affectation FunctionName est médiocre à mon avis, et un exemple d'une mauvaise habitude VB6. Je préfère également la méthode de variable _returnValue (NOT RETVAL).

14
StingyJack

La différence est qu'ils font des choses différentes!

La "valeur de retour" fait 2 choses:
1. Il définit la valeur de retour de la fonction à ce point 2. Il quitte immédiatement la fonction

Aucun autre code dans la fonction ne s'exécute!

'Functionname = value' fait 1 chose: 1. Il définit la valeur de retour de la fonction à ce point

L'autre code de la fonction continue de s'exécuter Cela permet à une logique supplémentaire d'affiner ou de remplacer la valeur de retour de la fonction

Énormes gens de différence. N'oubliez pas que ce n'est pas seulement une question d'état, mais aussi de flux.

52
noeldp

Jetons un coup d'œil ... Curieusement, le "functionName =" génère moins d'IL?

Code:

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 
}
17
TGnat

Procéder comme suit est uniquement fourni aux développeurs Visual Basic 6. pour porter facilement le code sur:

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

Je ne recommanderais certainement pas de continuer à le faire si votre projet inclut quelqu'un qui n'a pas travaillé avec Visual Basic 6.0, car cette syntaxe sera source de confusion.

6
Tom Anderson

99 fois sur 100, j'utiliserai "valeur de retour".

De temps en temps, j'ai une fonction où l'autre type me permet non seulement d'enregistrer une déclaration de variable, mais de le faire d'une manière qui clarifie considérablement la fonction. Habituellement, cela se produit lorsque je voudrais nommer la valeur de retour de la même manière que la fonction, et ce sont souvent des fonctions récursives; quelque chose à propos de cette construction la prête à la variable de retour implicite. Cependant, ce scénario est extrêmement rare. Je ne sais pas si j'ai des fonctions utilisant des variables de retour implicites du tout dans mon projet actuel.

1
Joel Coehoorn

son assez pratique lorsque vous travaillez avec des usines tierces (_hsf), vous pouvez éviter de déclarer des variables de retour

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
0
tsolina

Lorsque Outils/Options/Éditeur de texte/Toutes les langues/Lentille de code est activé, le décompte de références s'affiche au-dessus de chaque instruction Sub, Function ou Property.

"Valeur de retour" semble préférable à "attribuer une valeur au nom des fonctions". Dans ce dernier cas, "Code Lens" produit un compte de référence gonflé.

' 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
0
Paul Margus

Après avoir lu que la syntaxe de la valeur de retour était la seule façon vraie . NET de faire les choses, j'ai pensé "OK, nous le ferons alors". Ensuite, j'ai écrit une fonction que je connaissais, la main sur le cœur savait, renvoyé soit une valeur d'une instruction Return, soit une exception dans toutes les circonstances, et j'ai quand même reçu un avertissement du compilateur que la fonction "ne renvoie pas de valeur sur tous les chemins" .

Heureusement, je suis tombé sur la question Stack Overflow Comment puis-je faire en sorte que cette fonction ne génère pas un avertissement "ne renvoie pas de valeur sur tous les chemins"? qui a expliqué pourquoi; l'ajout d'une affectation de valeur par défaut au nom de la procédure en tête de la fonction a également empêché l'avertissement dans mon cas.

Par conséquent, même si je continue à utiliser la syntaxe de la valeur de retour simplement pour des raisons de cohérence syntaxique, je vais également attribuer une valeur par défaut au nom de la fonction juste pour éviter la possibilité d'encombrer le processus de compilation avec de faux avertissements.

0
Alan K