Bonjour
Comment traduire le mot cléde C# en VB 2010 ?Code:Yield
Merci
Version imprimable
Bonjour
Comment traduire le mot cléde C# en VB 2010 ?Code:Yield
Merci
le mot clé yied en c# est traduit en fonction static (Shared en VB.NET).
l'exemple ci-dessus donne comme résultat: 1,2,3,4,5,6,7,8,9,10
Code:
1
2
3
4
5
6
7
8
9
10
11 Public Shared Function Inc() As Integer() Dim count As Integer = 0 Dim resultats As New List(Of Integer) Dim resultat As Integer = 0 While count <= 10 resultat += 1 resultats.Add(result) count += 1 End While Return resultats.ToArray() End Function
en c#:
Il est disponible en VB.NET 2012, si tu as le 2010, le yeald est inclus dans l'extension Async CTPCode:
1
2
3
4
5
6
7
8
9
10
11 public static IEnumerable<int> Inc() { int count=0; int resultat=0; while (count <= 10) { resultat += 1; count += 1; yield return resultat; } }
Merci pour cette explication.
Si je comprend bien ton exemple, désolé je ne connais pas bien la syntaxe de C#,
permet de renvoyer un array de Int ?Code:yield return resultat;
Je suis aller sur Async CTP.
Dois-je passer en Framework 4.5 ?
Ou dois-je télécharger un patch ?
Merci pour ton aide.
Bernard
Bonsoir
Merci beaucoup pour ton aide précieuse!!
Bernard
De rien, si ça répond à ta question tu peux marquer la discussion comme étant résolue.
Bon dév :ccool:
je ne connais pas trop yield, ne faisant pas de c#
ce mot clé n'est dispo que depuis vs 2012
j'ai récupéré le lien pour le lire à l'occasion
par contre moi ce que j'en pensait c'est que yield retourne un instance d'une collection, à chaque appel d'un for
static/shared n'a rien à voir dans ce fonctionnement
et retourner un tableau ou une collection remplie diffère donc du comportement de yield qui fait que la méthode est exécutée en plusieurs fois avec une sortie à chaque yield
après en vb on a un mot clé static mais qui n'a pas le même fonctionnement qu'en c#
le static de c# est le shared en vb
le static en vb s'utilise à la place d'un dim pour dire que la valeur reste d'un appel à un autre
le lien que tu as donné dit
j'aurais donc tendance à croire comme j'avais cru le comprendre à l'époque que yield fait sortir de la méthodeCitation:
L'expression yield return <expression>; est rencontrée : La valeur de <expression> est affectée à la propriété Current de l'objet énumérateur, et toutes les valeurs des variables locales utilisées par le bloc itérateur sont sauvegardées.
et en plus les variables seraient conservées pour le prochain appel, un peu comme avec du static de vb
et l'article commence par
:DCitation:
ce mécanisme n'est pas seulement troublant
Réessayons d'y voir clair dans out cela,
yield est un sucre syntaxique offert pour simplifier l'écriture, c'est ainsi le compilo qui se charge de transformer le code en une machine à états (réalisant ainsi le pattern iterator) et permet ainsi d'obtenir deux choses:
- une exécution différée
- une évaluation paresseuse
Chose que ne fait absolument pas le code VB.Net fourni.
Par conséquent même si dans ce cas les deux méthodes Inc() donnent à terme les mêmes résultats, elles ne sont pas équivalentes ; et il ne s'agit en aucun cas d'une "traduction de yield"
Si les deux étaient équivalents j'aimerais bien voir la traduction en VB.Net (via cette méthode) des deux suivantes (chacun illustrant les 2 points énoncés plus haut)
En effet l'exécution différée permet de ne rien évaluer tant qu'on ne tente pas d'accéder aux éléments et l'évaluation paresseuse n'évalue que ce qui est nécessaire par élément.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 using System; using System.Collections.Generic; using System.Linq; class Program { static void Main () { var test1 = AlwaysThrowing (); // does not throw until enumeration // foreach (int item in test1) ; // uncomment to see Exception here var test2 = ShouldAccesAtLeastFirst (); Console.WriteLine (test2.First ()); // does not throw because only first item is evaluated (Exception is after) } #pragma warning disable 162 // ignore "unreacheable code" warning for illustrating pupose static IEnumerable<int> AlwaysThrowing () { throw new InvalidOperationException ("should not appear if execution is deferred"); yield return 42; } #pragma warning restore 162 static IEnumerable<int> ShouldAccesAtLeastFirst () { yield return 42; throw new InvalidOperationException ("should not appear if evaluated lazily"); } }
Cordialement !
Bonjour
Je vois que ma question a sucité des débats avec des notions qui me dépassent un peu!
J'ai bien Framework 4 sur mon systeme.
J'ai suivi les conseils de chamamo en téléchageant asunc CTP qui s'est installé sans soucis.
Mais Yield n'est toujours pas reconnu.
Ai-je loupé quelques choses.
Merci pour vos aides.
Bernard
Pour savoir si j'ai compris, voici le code d'origine en C#
que j'ai traduit comme cela:Code:
1
2
3
4
5
6
7
8
9 public IEnumerable<HtmlNode> Ancestors() { HtmlNode node = ParentNode; while (node.ParentNode != null) { yield return node.ParentNode; node = node.ParentNode; } }
1) Est-ce correct ?Code:
1
2
3
4
5
6
7
8
9 Public Function Ancestors() As IEnumerable(Of HtmlNode) Dim node As HtmlNode = ParentNode Dim result As New List(Of HtmlNode)() While node.ParentNode IsNot Nothing result.Add(node.ParentNode) node = node.ParentNode End While Return result End Function
2) Quelle est la signification de () à la fin de
Merci pour votre aide.Code:Dim result As New List(Of HtmlNode)()
Bernard
normalement si tout est bien installé ceci devrait fonctionner (je reprends les exemples présents dans le sujet)
Après si ça ne fonctionne pas il faudra donner plus d'informations (code exact, message d'erreur exact et/ou comportement attendu/obtenu etc.)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Iterator Function Inc() As IEnumerable(Of Integer) For i = 1 To 10 Yield i Next End Function Iterator Function AlwaysThrowing() As IEnumerable(Of Integer) Throw New InvalidOperationException("should not appear if execution is deferred") Yield 42 End Function Iterator Function ShouldAccessAtLeastFirst() As IEnumerable(Of Integer) Yield 42 Throw New InvalidOperationException("should not appear if evaluated lazily") End Function