2011-07-19 3 views
9

VB.NET n'a pas de paramètres out, mais vous pouvez spécifier <Out()> ByRef sur les méthodes COM et P/Invoke pour obtenir le même effet pour les méthodes externes. La spécification de la même chose sur les méthodes internes (c'est-à-dire les méthodes appelées uniquement par le code .NET) aide-t-elle réellement le Jitter (ou le compilateur VB.NET)? Ou est-il actuellement seulement utile comme note de programmeur.Est-ce que la spécification des méthodes internes OutAttribute sur ByRef fait quoi que ce soit?

Est-il possible qu'il puisse être utilisé dans une future gigue, ou cet attribut est-il perdu lors de la compilation?

Répondre

9

J'ai confirmé qu'un VB.NET <Out()> provoque un client C# pour exiger out arguments, donc il semble être effectivement le même.

Un client C# transmet également ses arguments avec des valeurs courantes dans la méthode, mais ce n'est pas surprenant car, contrairement aux cas COM ou P/Invoke, il n'y a pas de marshalling à faire. (Et C# ne permettra pas qu'une propriété soit définie directement par un argument out, donc il ne semble pas y avoir un moyen de voir si C# permettrait d'optimiser une affectation précédente non nécessaire.)

Donc, il semble que la réponse est-ce que cela aide les futurs clients C# à utiliser le code, et si la gigue ajuste l'équivalent C#, il ferait la même chose ici. Bien que des langages comme VB existent, ils ne peuvent pas faire grand-chose parce qu'ils ne respectent pas les Out attribute eux-mêmes.

+1

Oui, c'est * exactement * la même chose. Le mot clé C# 'out' compile jusqu'au code IL qui contient l'attribut' '. VB.NET n'a tout simplement pas le mot-clé. Vous pouvez le vérifier vous-même en compilant deux projets de test et en utilisant ILdasm pour les comparer. –

+0

Je suppose que cela fait référence à l'attribut Out dans l'espace de noms System.Runtime.InteropServices. Est-ce le cas? – jswolf19

+0

@ jswolf19 Oui, modifié, également dans mes réponses aux questions liées. –

1

J'ai sous-classé MembershipProvider avec une classe VB, nous l'appellerons A, puis sous-classé A avec une classe C# nous appellerons B. Le code C#, B, ne reconnaissait pas le fait que les méthodes abstraites dans le MembershipProvider avait déjà été implémenté dans la sous-classe VB, A, jusqu'à ce que j'applique OutAttribute dans la classe VB pour les paramètres qui étaient spécifiés comme out dans les méthodes abstraites de classe de base MembershipProvider. Cela a un impact au-delà de COM ou P/Invoke.

Questions connexes