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 :

Delegate et méthode anonyme


Sujet :

VB.NET

  1. #1
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut Delegate et méthode anonyme
    Bonjour à tous

    J'ai un doute sur un bout de code que j'ai. Je déclare un delegate

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Delegate Sub ChangeLog(ByVal Valeur As String)
    et ensuite je le définie comm ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Public Sub AddValueLog(ByVal Valeur As String)
            Invoke(New ChangeLog(AddressOf AddLog), Valeur)
    End Sub
     
    Private Sub AddLog(ByVal Valeur As String)
            txtLog.AppendText(Valeur)
    End Sub
    N'y aurait-il pas une solution de réduire tout ça ?
    Etant pas expert en vb, merci d'avance de vos avis !!

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    je ne vois pas trop ce que tu cherche à faire...

    tu est dans le code d'une FORM et tu veux que le code appelant soit toujours synchrone avec le thread UI (pour éviter les problèmes de cross-threading) ?

    dans un autre contexte que la synchronisation ton code est strictement inutile, si c'est bien dans le cadre de la synchronisation et éviter ainsi les Cross Threading Exceptions, alors ton code et correct et ne peut pas vraiment être amélioré en VB.NET.

    Les méthodes anonymes n'existes pas en VB.NET, seules les lambda-expressions existent et leur écriture est largement plus restrictives qu'en C#.

  3. #3
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    merci de ta réponse...
    en fait oui je cherchais quelques chose pour diminuer les lignes de code comme je l'aurais fais en c#

    apparament, vb ne le permet pas...

    bon ben je vais faire avec alors

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    VB est un langage fortement, (trop à mon gout) verbeux.

    Dans cette logique, la diminution de code n'est pas cohérente avec ce postulat de départ, donc tout ce qui permet de réduire le code est proscrit

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    la diminution du nombre de lignes est cohérente avec tout programme qu'on veut rendre plus maintenable, donc je ne vois pas en quoi ca ne serait pas compatible avec vb.net
    j'ajouterais qu'en vb.net il y a des mots au lieu des symboles, pas forcément des lignes en plus (je réitère mon exemple dans lequel je pense que if A orelse B est plus intuitif que if A || B)

    pour le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    invoke(new action(of string)(addressof AddLof), valeur)
    sur la version 2010 il y a très peu de choses qui peuvent se faire dans un langage et pas dans un autre (nous avons enfin le mot clé sub pour les méthodes anonymes)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Heu Pol63, ton extrait de code , ça donne quoi en partant de mon cas ??
    car je t'avouerais que j'ai du mal à traduire...

    pour ce qui est de VB ou C#, je ne sais pas lequel est le plus performant par rapport à la syntaxe..
    c'est juste que étant habitué à l'un, le codage dans l'autre manque d'habitude et de réflexe....

    cependant je préfére c# quand même

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    ca donne ce que j'ai écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        Public Sub AddValueLog(ByVal Valeur As String)
            Invoke(New Action(Of String)(AddressOf AddLog), Valeur)
        End Sub
     
        Private Sub AddLog(ByVal Valeur As String)
            txtLog.AppendText(Valeur)
        End Sub
    la classe action existe depuis le framework 3.5 je crois (donc vs 2008)

    c# est vb.net sont aussi performant étant tous les deux compilés dans le même code intermédiaire

    et si tu préfères le c# pourquoi fais tu du vb.net ? ^^ parce que c'est vrai que passer de l'un à l'autre c'est chiant au début
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    et si tu préfères le c# pourquoi fais tu du vb.net ? ^^ parce que c'est vrai que passer de l'un à l'autre c'est chiant au début
    pour ton code

    et pourquoi je fais du vb, ben parce qu'on me le demande pour une mission
    et que comme vb = c# pour certains me voilà dans la m****

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    tu peux toujours coder en c# et utilisé la dll en vb.net avec moins de code à mettre
    ou encore coder en c# et traduire en vb.net
    http://www.developerfusion.com/tools.../csharp-to-vb/ (ou autre convertisseur, certains doivent être mieux que d'autres)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    bien sympa ton lien...
    sauf que le client étant roi et le client utilisait aussi les mêmes codes sources, me voilà obligé d'utiliser le vb

    j'arrive plus ou moins à m'y faire, c'est juste la syntaxe qui parfois me fait perdre un poil de temps

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    avec le convertisseur tu peux taper ta ligne en c# et savoir comment ca s'écrit en vb.net
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    c'est pour ca que je disais bien sympa ton lien ...

    mais bon à force d'en faire, ca va finir par rentrer !!!

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    disons que l'essentiel du problème avec vb... c'est pas tellement ce qu'on ne peut pas faire...
    c'est plutôt l'intellisense vb qu'est pas tip top face à celui de C# lol

    ah il y a quand même quelques différences notables, avec les lambda-expressions entre autre.

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    x => {
      var a = x.ID;
      // Traitement sur a
      ...
      return a;
    }

    voilà, ce genre de lambda à coucher dehors, n'est pas reproductible en VB.NET... la trop grande verbosité est parfois un frein...


    sinon en ce qui concerne les convertisseurs de code, il faut faire gaffe, ils ont une facheuse tendance à se planter méchamment sur les boucles, et tout particulièrement les "foreach / For Each"

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

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Bonjour,

    Bizarre, ceci fonctionne pourtant très bien chez moi:
    Code VB.Net : 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
     
    Class MyType
        Property ID As Integer
    End Class
     
    Sub Test()
        Dim liste As New List(Of MyType) From
            {
                New MyType With {.ID = 1},
                New MyType With {.ID = 2}
            }
     
        Dim truc = liste.Select(Function(x)
                                    Dim a = x.ID
                                    ' traitement sur a
                                    Return a
                                End Function)
    End Sub
    Après la syntaxe est plus lourde qu'en C# (encore que c'est subjectif) donc je dirais surtout que c'est une histoire de goût

    Cordialement !

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    Citation Envoyé par cinemania Voir le message
    (...)
    c'est plutôt l'intellisense vb qu'est pas tip top face à celui de C# lol

    ca fait quand meme 2x sur le meme topic que tu dis que quelque que chose n'est pas faisable en vb.net alors que ca l'est
    donc merci ne pas induire en erreur les gens sous prétexte de ton dégout du vb.net, un peu de respect ca ne fait jamais de mal

    et puis l'intellisense je vois pas en quoi elle serait différente non plus ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  16. #16
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Citation Envoyé par cinemania Voir le message
    disons que l'essentiel du problème avec vb... c'est pas tellement ce qu'on ne peut pas faire...
    c'est plutôt l'intellisense vb qu'est pas tip top face à celui de C# lol
    là par contre, je ne vois pas de quoi tu parles ?
    pas eu de soucis de ce côté lors de ma migration

    Citation Envoyé par cinemania Voir le message
    sinon en ce qui concerne les convertisseurs de code, il faut faire gaffe, ils ont une facheuse tendance à se planter méchamment sur les boucles, et tout particulièrement les "foreach / For Each"
    pas trop testé, cependant je ne prend pas le convertisseur comme référence, juste du moins pour me donner une idée de comment faire

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

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Pour revenir sur le propos du sujet initial, si jamais ta méthode AddLog ne sert qu'à être utilisée par l'invocation dans AddValueLog (et que tu es en Framework 4) alors tu peux simplifier un peu comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Sub AddValueLog(ByVal Valeur As String)
        Invoke(Sub() txtLog.AppendText(Valeur))
    End Sub
    Après je ne sais pas (faute de tests poussés ) si c'est plus judicieux que la méthode proposée par Pol63.

    Cordialement !

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    une fois compilé ca doit être la même chose
    mais le but est en effet de simplifier le code, donc bien souvent d'en réduire le nombre de ligne
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  19. #19
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    Pol63 et bien les constructions syntaxiques désolés mais tu admettra que jusqu'à récemment... elles n'étaient pas supportées.

    je ne sais pas si tu trouve cohérent qu'il ait fallut finalement attendre dotnet4 pour que vb intègre une fonctionnalité C# 2.0 comme les méthodes anonymes jusqu'ici impossible ou de pouvoir faire des lambda séquentielles...
    alors je me suis peut être avancé trop vite, mais vous avouerez qu'il y a de quoi car la dernière fois que j'ai testé je me suis fait jeté, maintenant c'est vrai j'ai pas vraiment eu l'occasion de rester et surtout ré approfondir depuis VS2010. Alors méa culpa, mais microsoft est pas mal responsable de cela.

    quand à l'intellisense... bien disons que sur 2010 il y a des améliorations, mais également des régressions...
    installé toutes les versions de 2010 msdn dispo, sur différentes machines, et sur toute j'ai le même résultat, avec et sans extensions...
    sous 2008 quand tu tape Property .... () automatiquement il clos la propriété avec le End property qui va bien en te mettant au passage le getter et le setter qui vont bien s'il n'y a pas de readonly ou writeonly...
    depuis 2010 oh miracle... il ne le fait plus... il ne le fera que si tu commence à taper get et valide. J'appelle cela une régression.

    ce langage est déjà trop verbeux parfois, alors si en plus l'intellisense ne fait même plus le béaba pourtant bien utile pour compenser cette verbosité...

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    il y a aussi des choses qui existent depuis vb8 (vs2005) et qui viennent seulement d'arriver sur c#4 (bon certes pas d'une grande utilité ^^)

    quand à l'intellisense de 2010 et le property, ce n'est pas une régression, au contraire c'est bien pratique, en tapant un property il créé la variable privée préfixée de _ (accessible d'ailleurs)
    si tu veux mettre du code dedans, alors tu mets le set
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Méthodes anonymes
    Par NLS le pingouin dans le forum Langage
    Réponses: 2
    Dernier message: 31/05/2012, 07h05
  2. Conversion de C# à vb: méthodes anonymes
    Par AP dans le forum Framework .NET
    Réponses: 1
    Dernier message: 25/11/2008, 20h45
  3. Réponses: 2
    Dernier message: 31/12/2007, 13h50

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