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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top