web-dev-qa-db-fra.com

Existe-t-il un équivalent VB.NET des paramètres de sortie C #?

VB.NET a-t-il un équivalent direct des paramètres de la fonction C # out, où la variable transmise à une fonction n'a pas besoin d'être initialisée?

77
cspolton

Non, il n'y a pas d'équivalent du mot clé out en VB.

Cependant, VB initialise automatiquement toutes les variables locales d'une méthode. Vous pouvez donc utiliser ByRef sans avoir à initialiser explicitement la variable.

Exemple:

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

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

(Si vous examinez le code dans la structure (par exemple, Double.TryParse ), le <OutAttribute> sera ajouté aux paramètres, mais cela ne fera une différence que lorsque l'appel sera organisé pour un appel interop ou de plate-forme.

85
Guffa

Non, il n'y a pas de construction équivalente permettant à une variable non initialisée d'être passée à une méthode sans avertissement, mais, comme indiqué dans mon question et réponse spécifiant un attribut <Out()> sur une définition de paramètre ByRef , bien que VB l'ignore, est traité par C # comme un paramètre out.

Je voudrais donc pré-initialiser les variables de référence sur Nothinget spécifier <Out()> ByRef pour indiquer l'intention (cela fonctionnera si les utilisateurs de C # accèdent à vos méthodes).

Si vous pensez savoir quand vous avez l'intention d'accéder à la variable Nothing par défaut dans des variables de référence non affectées, vous pouvez définir la "Configuration de l'avertissement" "Utilisation de la variable avant l'affectation" sur "Aucune" au niveau du projet. (Propriétés du projet> Compiler, et vous voudrez probablement définir Configuration sur "Toutes les configurations" avant de modifier ce paramètre) ou, dans VS2015 (VB.NET 14), vous pouvez utiliser #Disable Warning BC42030.

29
Mark Hurd

Version C #

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

Version vb.net

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

Vous avez trouvé la réponse ici

Mettre à jour

Comme indiqué dans le commentaire, n'oubliez pas d'initialiser votre paramètre qui sera utilisé dans le slot out

7
David

J'ai eu le problème dans VB.NET que j'ai appelé une fonction "par référence" qui a renvoyé un tableau.

Même si le compilateur l'a signalé comme un avertissement, tout allait bien. Le correctif est super simple et probablement une bonne pratique de programmation.

J'ai changé

Dim m_arr_values() as Integer

fnRetArray(m_arr_values)

à

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

fnRetArray(m_arr_values)

Cela aide également lors du codage si les noms de variables sont descriptifs ...

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

VB a l'attribut qui devrait être identique à C # out mais aujourd'hui, vous recevez toujours un avertissement même si vous l'utilisez. Il y a des détails sur la réparation dans la zone vblang de github. https://github.com/dotnet/vblang/issues/67 .

0
Paul Cohen

Vous pouvez utiliser la méthode pass par référence dans VB.NET.

Vous avez besoin du mécanisme de paramètre Out en C #, car il ne vous permet d'utiliser aucune variable sans l'initialiser.

VB.NET n'a pas besoin d'un mot clé spécial, car il le fait automatiquement.

Il suffit d'utiliser ByRef.

0
Josh