Esiste un equivalente VB.NET dei parametri out di C #?


95

VB.NET ha un equivalente diretto ai outparametri della funzione C # , dove non è necessario inizializzare la variabile passata in una funzione?

Risposte:


98

No, non esiste un equivalente della outparola chiave in VB.

Tuttavia, VB inizializza automaticamente tutte le variabili locali in un metodo, quindi è possibile utilizzarlo ByRefsenza dover prima inizializzare esplicitamente la variabile.

Esempio:

Sub Main()
  Dim y As Integer
  Test(y)
End Sub

Sub Test(ByRef x As Integer)
  x = 42
End Sub

(Se si esamina il codice nel framework (ad esempio Double.TryParse ), è possibile che vengano visualizzati i <OutAttribute>parametri aggiunti ai parametri, ma ciò fa la differenza solo quando viene eseguito il marshalling della chiamata per l'interoperabilità COM o l'invocazione della piattaforma.)


2
@Spolto: se stai traducendo VBScript in VB, assicurati di impostare la modalità Explicit e Strict. Riceverai più messaggi di errore, ma la maggior parte punterà alla fonte dei problemi (ad es. Variabile dichiarata senza tipo) piuttosto che a problemi secondari (ad es. La variabile dichiarata senza tipo diventa Object, quindi non può essere utilizzata per un ByRef x As Integerparametro).
Guffa

4
@ Guffa: non so se è una questione di versione, ma anch'io ricevo avvisi del compilatore quando passo variabili di tipo di riferimento non inizializzate come ByRefparametri. (Non succede con i parametri del tipo di valore.)
Dan Tao

4
@ Dan Tao, Spolto: Questa sembra essere la differenza, ricevo anche un avviso con i tipi di riferimento. L'impossibilità di specificare i parametri di uscita è una limitazione nella lingua e devi solo inizializzare le variabili per eliminare gli avvisi. Anche l'assegnazione Nothinga loro eliminerà l'avviso anche se non cambia il risultato.
Guffa

1
@ Guffa: Sì, finora Nothingli ho assegnati . È solo dispendioso in termini di tempo poiché devo farlo centinaia di volte in un grande sito Web legacy. Grazie per aver indagato.
cspolton

3
@ MarkHurd: Quindi il downvote è ingiusto, perché ho già spiegato che l' Outattributo non è equivalente alla outparola chiave C # .
Guffa

32

No, non esiste un costrutto equivalente che consenta di passare una variabile non inizializzata a un metodo senza un avviso, ma, come menzionato nella mia domanda e risposta che specifica un <Out()>attributo sulla ByRefdefinizione di un parametro, sebbene VB lo ignori, viene trattato da C # come outparametro.

Quindi, pre-inizializzo le variabili di riferimento Nothing e le specificherei <Out()> ByRefper indicare l'intenzione (funzionerà se gli utenti C # accedessero ai tuoi metodi).

Se ritieni di sapere quando intendi accedere al valore predefinito Nothingin variabili di riferimento altrimenti non assegnate, puoi impostare la "Configurazione avvertenza" "Uso della variabile prima dell'assegnazione" su "Nessuno" a livello di progetto (Proprietà progetto> Compila, e probabilmente tu si desidera impostare la configurazione su "Tutte le configurazioni" prima di modificare questa impostazione) oppure, in VS2015 (VB.NET 14), è possibile utilizzare #Disable Warning BC42030.


3
Questo è significativo. Avevo una sottoclasse VB di MembershipProvider e poi una sottoclasse C # della sottoclasse VB. Il codice C # non riconosceva il fatto che i metodi astratti in MembershipProvider erano già stati implementati fino a quando non ho applicato l'attributo nella classe VB per i parametri specificati come nella classe base MembershipProvider.
Richard Collette

@RichardCollette Probabilmente vale la pena rispondere alla mia domanda collegata!
Mark Hurd

9

Versione C #

  void TestFunc(int x, ref int y, out int z) {
  x++;  
  y++;
  z = 5;
}

Versione Vb.net

    Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)
  x += 1
  y += 1 
  z = 5 
End Sub

Ho trovato la risposta qui

Aggiornare

Come indicato nel commento, non dimenticare di inizializzare il parametro che verrà utilizzato nello slot di uscita


In generale, sono d'accordo che ByRef è la cosa più vicina al fuori . Tuttavia, ByRef lancerà comunque un avviso se si passa una variabile non inizializzata, come richiesto dalla domanda.
Richard il

Il mio voto negativo risale a molto tempo fa: il sito web a cui sei collegato è molto generico; non elenca problemi specifici, differenze e tecnicismi. Inoltre la tua risposta continua a non rispondere alla domanda.
Mark Hurd

1

Ho avuto il problema in VB.NET che ho chiamato una funzione "per ref" che ha restituito un array.

Anche se il compilatore lo ha contrassegnato come un avvertimento, è andato tutto bene. La soluzione è semplicissima e probabilmente una buona pratica di programmazione.

Ho cambiato

Dim m_arr_values() as Integer

fnRetArray(m_arr_values)

per

' Even though 'Nothing' is the default value, setting it
' stops the compiler complaining.
Dim m_arr_values() as Integer = Nothing

fnRetArray(m_arr_values)

Aiuta anche durante la codifica se i nomi delle variabili sono descrittivi ...

Sub fnCreatePalette(ByRef arr_in_pal() As color, ByRef arr_out_pal() as uinteger)
    ...
End Sub

3
La notazione ungherese è contro le linee guida di progettazione del framework .NET.
Gqqnbig

0

È possibile utilizzare il metodo passaggio per riferimento in VB.NET.

È necessario il meccanismo del parametro Out in C #, perché non consente di utilizzare alcuna variabile senza inizializzarla.

VB.NET non necessita di una parola chiave speciale poiché lo fa automaticamente da solo.

Basta usare ByRef.


3
Questo non risponde alla domanda ed è sbagliato rispetto a C #.
cspolton

Il byref ti permette di non inizializzare e ti permette di cambiare il valore dei parametri. Ma, al contrario del parametro C # out, TI PERMETTE di inizializzare il parametro con un valore e usarlo nella funzione, mentre in C # la parola chiave out ti costringe a usarlo SOLO come parametro out e NON come input per la funzione. Inoltre, se non si modifica o si imposta un valore su questo parametro all'interno della funzione, il compilatore non lo rileverà come errore, a differenza del C # in cui verrà emesso un errore di compilazione.
pashute


-5

Usa la parola chiave ByRef prima della variabile.


4
ByRefè equivalente ai refparametri in C #, che devono essere inizializzati prima di essere passati a una funzione.
cspolton
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.