Ritorno funzione VB.NET
Domanda
Per restituire un valore da una funzione VB.NET è possibile assegnare un valore al " Nome funzioni " oppure usa " valore di ritorno. "
A volte li vedo mescolati nella stessa funzione. Personalmente, preferisco il ritorno.
La mia domanda è: qual è la differenza interna, se presente, tra i due?
Soluzione
Probabilmente non c'è differenza. IIRC, il compilatore generato da IL li converte entrambi in istruzioni Return a meno che non vi sia un ulteriore utilizzo di una variabile _returnValue .
La leggibilità dell'assegnazione FunctionName è scarsa secondo me, e un esempio di cattiva abitudine VB6. Preferisco anche il metodo variabile _returnValue (NOT RETVAL).
Altri suggerimenti
La differenza è che FANNO DIVERSE COSE!
'Valore restituito' fa 2 cose:
1. Imposta il valore di ritorno della funzione in quel punto
2. Esce immediatamente dalla funzione
Non viene eseguito altro codice nella funzione!
'Functionname = value' fa 1 cosa: 1. Imposta il valore di ritorno della funzione in quel punto
L'altro codice nella funzione continua a essere eseguito Ciò consente alla logica aggiuntiva di perfezionare o sostituire il valore restituito dalla funzione
Gente con enormi differenze. Ricorda che non si tratta solo di stato, ma anche di flusso.
Diamo un'occhiata ... Stranamente il " functionName = " genera meno IL?
Codice:
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
}
Le seguenti operazioni sono fornite solo agli sviluppatori Visual Basic 6.0 per eseguire facilmente il porting del codice sopra:
Public Function MyFunction() As String
MyFunction = "Hello"
End Function
Non consiglierei assolutamente di continuare a farlo se il tuo progetto include qualcuno che non ha lavorato con Visual Basic 6.0, poiché questa sintassi sarà confusa.
99 volte su 100 userò "quot return value".
Ogni tanto avrò una funzione in cui l'altro tipo non solo mi consente di salvare una dichiarazione variabile, ma lo fa in un modo che chiarisce in modo significativo la funzione. Di solito questo accade quando vorrei nominare il valore restituito uguale alla funzione comunque, e spesso queste sono funzioni ricorsive; qualcosa su quel costrutto lo presta alla variabile restituita implicita. Tuttavia, quello scenario è estremamente raro . Non so se ho funzioni che utilizzano variabili di ritorno implicite nel mio progetto attuale.
Dopo aver letto che la sintassi del valore di ritorno era l'unica vera .NET Cose che ho pensato "OK, lo faremo in quel modo". Quindi ho scritto una funzione che sapevo, a memoria, ho restituito un valore da un'istruzione Return o in alternativa un'eccezione in tutte le circostanze, e ho comunque ricevuto un compilatore che avvertiva che la funzione "non restituisce un valore su tutti i percorsi" ;.
Per fortuna mi sono imbattuto nella domanda Stack Overflow Come posso rendere questa funzione non generare un & # 8220; non restituisce un valore su tutti i percorsi & # 8221; avvertimento? che spiega perché; l'aggiunta di un'assegnazione di valore predefinita al nome della procedura all'inizio della funzione ha impedito l'avvertimento anche nel mio caso.
Di conseguenza, anche se continuerò a utilizzare la sintassi del valore restituito semplicemente per motivi di coerenza della sintassi, assegnerò anche un valore predefinito al nome della funzione solo per impedire la possibilità di ingombrare il processo di compilazione con avvisi fasulli.
è abbastanza utile quando si lavora con fabbriche di terze parti (_hsf), è possibile evitare di dichiarare le variabili di ritorno
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
Quando Strumenti / Opzioni / Editor di testo / Tutte le lingue / Lente di codice è attivato, il conteggio dei riferimenti viene visualizzato sopra ogni istruzione Sub, Funzione o Proprietà.
" Valore di ritorno " sembra meglio di "assegnare un valore al nome della funzione". In quest'ultimo caso, "Lente di codice" produce un conteggio di riferimento gonfiato.
' 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