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?
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).
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.
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
}
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.
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.
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
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
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.