VB.NET a-t-il un équivalent direct aux outparamètres de fonction C # , où la variable passée dans une fonction n'a pas besoin d'être initialisée?
Réponses:
Non, il n'y a pas d'équivalent du outmot - clé dans VB.
Cependant, VB initialise automatiquement toutes les variables locales dans une méthode, vous pouvez donc utiliser ByRefsans avoir à initialiser explicitement la variable au préalable.
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 le framework (par exemple Double.TryParse ), vous pouvez voir les <OutAttribute>paramètres ajoutés à, mais cela ne fait une différence que lorsque l'appel est organisé pour l'interopérabilité COM ou l'appel de plate-forme.)
ByRefparamètres. (Cela ne se produit pas avec les paramètres de type valeur.)
Nothingéliminera l'avertissement même si cela ne change pas le résultat.
Nothingjusqu'à présent. Cela prend juste du temps car je dois le faire des centaines de fois dans un grand site Web hérité. Merci d'avoir enquêté.
Outattribut n'est pas équivalent au outmot-clé C # .
Non, il n'y a pas de construction équivalente qui permet à une variable non initialisée d'être passée à une méthode sans avertissement, mais, comme mentionné dans ma question et réponse spécifiant un <Out()>attribut sur une ByRefdéfinition de paramètre, bien que VB l'ignore, est traité par C # comme outparamètre.
Donc, je pré-initialiserais les variables de référence Nothing et spécifierais<Out()> ByRef pour signifier l'intention (cela fonctionnera si les utilisateurs C # accèdent à vos méthodes).
Si vous pensez savoir quand vous avez l'intention d'accéder à la valeur Nothingpar défaut dans des variables de référence autrement non attribuées, vous pouvez définir la "Configuration d'avertissement" "Utilisation de la variable avant l'affectation" sur "Aucune" au niveau du projet (Propriétés du projet> Compiler, et vous souhaitez 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.
Version C #
void TestFunc(int x, ref int y, out int z) {
x++;
y++;
z = 5;
}
Version de Vb.net
Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)
x += 1
y += 1
z = 5
End Sub
Mettre à jour
Comme indiqué dans le commentaire, n'oubliez pas d'initialiser votre paramètre qui sera utilisé dans le slot de sortie
J'ai eu le problème dans VB.NET que j'ai appelé une fonction "par ref" 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
Vous pouvez utiliser la méthode de passage par référence dans VB.NET.
Vous avez besoin du mécanisme de paramètre Out en C #, car il ne vous permet pas d'utiliser une variable sans l'initialiser.
VB.NET n'a pas besoin d'un mot clé spécial car il le fait automatiquement par lui-même.
Utilisez simplement ByRef.
VB a l'attribut qui devrait être le même que C # out mais aujourd'hui, vous recevez toujours un avertissement même si vous l'utilisez. Il y a des détails sur la façon de le réparer dans la zone vblang de github. https://github.com/dotnet/vblang/issues/67 .
Object, donc elle ne peut pas être utilisée pour unByRef x As Integerparamètre).