IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Traduire le Yield de C# en VB 2010


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 152
    Points : 57
    Points
    57
    Par défaut Traduire le Yield de C# en VB 2010
    Bonjour

    Comment traduire le mot clé de C# en VB 2010 ?

    Merci

  2. #2
    Membre éclairé Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Points : 735
    Points
    735
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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#:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
        }
    }
    Il est disponible en VB.NET 2012, si tu as le 2010, le yeald est inclus dans l'extension Async CTP

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 152
    Points : 57
    Points
    57
    Par défaut
    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 ?

    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

  4. #4
    Membre éclairé Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Points : 735
    Points
    735
    Par défaut
    Voici un article qui explique le yield en c#

    Lien pour télécharger async CTP

    Il te faut au moins le framework 4.0 car c'est déjà inclus dans le framework 4.5.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 152
    Points : 57
    Points
    57
    Par défaut
    Bonsoir

    Merci beaucoup pour ton aide précieuse!!

    Bernard

  6. #6
    Membre éclairé Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Points : 735
    Points
    735
    Par défaut
    De rien, si ça répond à ta question tu peux marquer la discussion comme étant résolue.

    Bon dév

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par chamamo Voir le message
    le mot clé yied en c# est traduit en fonction static (Shared en VB.NET).
    oser dire ca alors que vous semblez connaitre ce que fait concretement yield ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre éclairé Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Points : 735
    Points
    735
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    oser dire ca alors que vous semblez connaitre ce que fait concretement yield ?
    Il me semble qu'en c# le yield est transformé en un bloc static, pour garder l'état en mémoire avec l'exécution tardive, si tu n'es pas d'accord donne nous ton explication, on est la pour apprendre.

    L'autre approche est d'implémenter le pattern Iterator.

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    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
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre éclairé Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Points : 735
    Points
    735
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    la méthode est exécutée en plusieurs fois avec une sortie à chaque yield
    Je ne suis pas tout à fait d'accord, ce n'est pas la méthode elle même qui est exécutée plusieurs fois, le yield retourne un IEnumerator, le compilateur génère une classe de type IEnumerator, il faudrait peu être faire un exemple et voir ce que ça donne avec Reflector.

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    le lien que tu as donné dit

    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.
    j'aurais donc tendance à croire comme j'avais cru le comprendre à l'époque que yield fait sortir de la méthode
    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
    ce mécanisme n'est pas seulement troublant
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Max
    Max est déconnecté
    Expert éminent sénior

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Points : 14 933
    Points
    14 933
    Par défaut
    Yop.
    Citation Envoyé par Pol63 Voir le message
    je ne connais pas trop yield, ne faisant pas de c#
    ce mot clé n'est dispo que depuis vs 2012
    Si mes souvenirs sont bons, yield est apparu avec le framework 2.0 .

  13. #13
    Membre éclairé Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Points : 735
    Points
    735
    Par défaut
    Citation Envoyé par Max Voir le message

    Si mes souvenirs sont bons, yield est apparu avec le framework 2.0 .
    Tu confonds la version du langage c# et du framework

  14. #14
    Max
    Max est déconnecté
    Expert éminent sénior

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Points : 14 933
    Points
    14 933
    Par défaut
    Citation Envoyé par chamamo Voir le message
    Tu confonds la version du langage c# et du framework
    Exact , mes souvenirs n'étaient donc pas tout à fait bons .

    J'aurais dû dire « c'était disponible bien avant VS 2012 » .

  15. #15
    Membre éclairé Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Points : 735
    Points
    735
    Par défaut
    Citation Envoyé par Max Voir le message
    Exact , mes souvenirs n'étaient donc pas tout à fait bons .

    J'aurais dû dire « c'était disponible bien avant VS 2012 » .
    Pour être exact, c'est disponible pour le VB.NET en VS 2012 et pour le C# depuis VS 2005

  16. #16
    Max
    Max est déconnecté
    Expert éminent sénior

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Points : 14 933
    Points
    14 933
    Par défaut
    Citation Envoyé par chamamo Voir le message
    Pour être exact, c'est disponible pour le VB.NET en VS 2012 et pour le C# depuis VS 2005
    Bon ben j'avais pas pigé que Pol63 faisait référence au yield pour VB .

    J'aurais dû me taire, mea culpa !

  17. #17
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    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:
    1. une exécution différée
    2. 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)

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    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");
        }
    }
    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.

    Cordialement !
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 152
    Points : 57
    Points
    57
    Par défaut
    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

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 152
    Points : 57
    Points
    57
    Par défaut
    Pour savoir si j'ai compris, voici le code d'origine en C#

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
                }
            }
    que j'ai traduit comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    1) Est-ce correct ?
    2) Quelle est la signification de () à la fin de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim result As New List(Of HtmlNode)()
    Merci pour votre aide.

    Bernard

  20. #20
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    normalement si tout est bien installé ceci devrait fonctionner (je reprends les exemples présents dans le sujet)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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.)
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

Discussions similaires

  1. [XL-2010] Traduire fonction excel en VBA dans une macro
    Par Foifoi dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 23/09/2014, 15h31
  2. Traduire code VB 6 en code Vb 2010 express
    Par Garl17 dans le forum VB.NET
    Réponses: 1
    Dernier message: 23/04/2011, 23h27
  3. Obligatoire : lisez les règles du forum : MAJ 06/08/2010
    Par Anomaly dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 0
    Dernier message: 03/07/2008, 13h46
  4. [merise]traduire en sql une association réflexive
    Par omega dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/03/2004, 18h10
  5. Traduire du DSP pour ADSP2181 de Analog Devices en C
    Par Aramis dans le forum Autres architectures
    Réponses: 4
    Dernier message: 14/06/2002, 12h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo