65 votes

Rendement en VB.NET

Le C# dispose d'un mot clé appelé rendement . VB.NET ne dispose pas de ce mot-clé. Comment les programmeurs de Visual Basic ont-ils contourné l'absence de ce mot-clé ? Implémentent-ils leur propre classe d'itérateurs ? Ou bien essaient-ils de coder pour éviter d'avoir besoin d'un itérateur ?

El rendement Le mot-clé oblige le compilateur à faire un peu de codage en coulisse. L'implémentation des itérateurs en C# et ses conséquences (partie 1) en est un bon exemple.

15 votes

"VB.NET n'a pas ce mot-clé." - plus maintenant. Pour tous les googleurs qui trouvent cette page, consultez le cadre Microsoft Async. msdn.microsoft.com/fr/us/vstudio/gg316360 y msdn.microsoft.com/fr/us/vstudio/gg497937

0 votes

@mattmc3 : notez que cela nécessite 2012, et ne fonctionne pas dans VS.2010

0 votes

@mattmc3 : le framework Async (votre premier lien) semble être une solution plus lourde (et plus complexe) que Yield (votre deuxième lien) ? Non pas que cela ait de l'importance puisque Yield est apparu dans VB à la même époque. Je veux juste connaître les tenants et aboutissants des différentes approches. msdn.microsoft.com/fr/us/magazine/hh456402.aspx discute d'Async/Await. UTILISATION DE await est assez facile. Mais l'implémentation de l'autre côté, qui génère le flux d'objets, semble demander beaucoup plus de travail que de simplement dire "Yield".

71voto

Joel Coehoorn Points 190579

Note : Cette réponse est maintenant ancienne. Les blocs d'itérateurs ont depuis été ajoutés à VB.NET

C# traduit le mot-clé yield en une machine d'état au moment de la compilation. VB.NET n'a pas le mot-clé yield, mais il a son propre mécanisme pour intégrer en toute sécurité l'état dans une fonction qui n'est pas facilement disponible en C#.

Le C# static est normalement traduit en Visual Basic à l'aide du mot-clé Shared mot-clé, mais il y a deux endroits où les choses deviennent confuses. L'un d'eux est qu'une classe statique C# est en réalité un module en Visual Basic plutôt qu'une classe partagée (on aurait pu penser qu'ils vous laisseraient coder dans les deux cas en Visual Basic, mais non). L'autre est que VB.NET possède sa propre classe statique C#. Static mot-clé. Cependant, Static a une signification différente en VB.NET.

Vous utilisez le Static en VB.NET pour déclarer une variable à l'intérieur d'une fonction, et lorsque vous le faites, la variable conserve son état entre les appels de fonction. C'est différent de la simple déclaration d'un membre de classe statique privé en C#, car un membre de fonction statique en VB.NET est garanti comme étant également thread-safe, dans la mesure où le compilateur le traduit pour utiliser la classe Monitor au moment de la compilation.

Alors pourquoi écrire tout ça ici ? Eh bien, il devrait être possible de construire un système générique réutilisable. Iterator<T> (ou Iterator(Of T) en VB.NET). Dans cette classe, vous implémenteriez la machine à états utilisée par C#, avec Yield() y Break() qui correspondent aux mots-clés C#. Vous pouvez alors utiliser une instance statique (au sens de VB.NET) dans une fonction afin qu'elle puisse, en fin de compte, faire à peu près le même travail que la méthode C# yield dans à peu près la même quantité de code (sans tenir compte de l'implémentation de la classe elle-même, puisqu'elle serait réutilisable à l'infini).

Je ne me suis pas assez intéressé au Yield pour le tenter moi-même, mais debe être réalisable. Cela dit, c'est également loin d'être trivial, car Eric Lippert, membre de l'équipe C#, qualifie cette situation de " la transformation la plus compliquée du compilateur ."

Depuis que j'ai écrit la première version de ce document il y a plus d'un an, j'en suis venu à penser que ce n'est pas vraiment possible de manière significative avant la sortie de Visual Studio 2010, car il faudrait envoyer plusieurs lambdas à la classe Iterator. .NET 4 La prise en charge des lambdas multi-lignes par l'utilisateur.

21voto

CoderDennis Points 7170

El CTP asynchrone comprend le support pour Yield en VB.NET.

Ver Itérateurs en Visual Basic pour des informations sur l'utilisation.

Et maintenant, il est inclus dans la boîte de Visual Studio 2012 !

15voto

MarkJ Points 21438

Voici le bel article Utiliser les itérateurs en VB maintenant par Bill McCarthy dans Visual Studio Magazine sur l'émulation yield en VB.NET. Vous pouvez aussi attendre la prochaine version de Visual Basic.

1voto

MagicKat Points 5192

Personnellement, je me contente d'écrire ma propre classe d'itérateurs qui hérite de IEnumerator(Of T) . Il faut un certain temps pour y arriver, mais je pense qu'au final, il vaut mieux l'écrire correctement que d'essayer de l'éviter. Une autre méthode que j'ai utilisée est d'écrire une méthode récursive qui renvoie IEnumerable(Of T) et renvoie simplement List(Of T) et utilise .AddRange .

0voto

Konrad Rudolph Points 231505

Espérons que cela appartiendra au passé avec la prochaine version de VB. Étant donné que les itérateurs gagnent en importance avec les nouveaux paradigmes (en particulier LINQ en combinaison avec l'évaluation paresseuse), cette question a une priorité assez élevée, d'après ce que je sais du blog de Paul Vick. Mais Paul n'est plus à la tête de l'équipe VB et je n'ai pas encore eu le temps de regarder les conférences PCD.

Néanmoins, si vous êtes intéressés, vous pouvez les consulter sur le site suivant Le blog de Paul .

0 votes

Je sais qu'il s'agit d'un très ancien article, mais Paul Vick a récemment réinitialisé son blog et supprimé le contenu de VB, de sorte que votre lien est maintenant rompu.

0 votes

@MarkJ Je sais. :-( Malheureusement, il n'y a pas grand-chose que l'on puisse faire à ce sujet. Pour info, Paul est conscient du problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X