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 :

ByRef, une absurdité?


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 61
    Par défaut ByRef, une absurdité?
    Bonjour,

    Je cherche une justification à l'utilisation du mot clé ByRef. Je vois ca comme étant une très mauvaise pratique de programmation orienté objet.

    Par exemple pour modifier les éléments d'un ListBox, certains programmeurs passe la listbox en référence au lieu d'en valeur.

    À mon avis ça rend le code très difficile à maintenir. Des fois ByVal, des fois ByRef.

    Pour pas polluer la mémoire pour rien? Foutaise. Y'a un garbage collector.

    Y'a-t-il une justification valable?

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    Absurdité ? Je ne sais pas...

    Ce qui est probable, amha, c'est que ce "modificateur" ByRef en VB.NET et ref en C#, est présent dans les deux langages dans un souci de "complétude" sur les sémantiques par valeur/par référence.

    Et de fait, il y a des cas d'utilisation importants où ref (ou ByRef) est utile, même si j'ai le sentiment que cela a plutot tendance a survenir dans des couches "basses" (frameworks, interop, etc) plutot qu'applicatives, dans une conception à objet "naturelle".

    Cependant, amha a nouveau, je pense que C# est plus "propre" en cela qu'il enonce clairement les contrats et possibilités semantiques pour le programmeur, en forçant ce dernier a exprimer clairement ses objectifs ; en resumant :

    C# :

    (rien) => semantique par valeur (mais les entités sur la pile a un instant t sont soit des references d'instances, soit des valeurs.. de type valeur justement... ce qui convient a la tres grande majorité des cas d'invocation de méthodes en programmation à objet "canonique", dirons nous)

    out => semantique par reference où le fournisseur (l'appelé) s'engage à fournir une valeur à l'entité référencée avant de retourner) ; donc, vérifié par le compilateur

    ref => semantique par reference "relachée", où l'appelé ne s'engage pas, à l'inverse de "out", mais où ce sera l'appelant qui aura fourni la valeur par defaut (si l'appelé ne décide d'aucun "effet de bord" avant le retour)

    Dans les trois cas, la syntaxe du langage tant sur les signatures que sur les instructions d'invocation avec parametres effectifs force le programmeur a etre consistant (cohérent) entre l'appelé et l'appelant.

    VB.NET en revanche n'a que "(rien)" (equivalent à ByVal) ou "ByRef" (qui correspond à ref du C#), sans un "out" digne de ce nom, dans le langage au sens strict.

    Je dirais que la syntaxe VB.NET est plus "laxiste" et plus orientée "confort" pour l'appelant, tandis que C# se moque du "confort" (du moins, sur ce sujet) et insiste pour que le programmeur exprime explicitement sa pensée quand la semantique est autre que celle "par défaut" (i.e, par valeur).

    Personnellement, sur ce point (et d'autres en fait...), je préfère le choix C#.

    Mais bon.. les gouts et les couleurs...

    'HTH

  3. #3
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 61
    Par défaut
    Merci pour cette réponse très élaborée et complète.

    Tu as raison de dire que ByRef doit être plus utile dans la programmation en back-end que pour du simple applicatif fonctionnel/interface-utilisateurs.

    Pour ce qui est du goût, moi, j'aime aussi mieu C#. Malheureusement ce choix m'est imposé à mon emploi.

    Je trouve VB.NET un peu trop lyrique, surtout pour ce qui est des fins d'instructions (changement de ligne). Pas de commentaires non plus sur le mot clé "With / End-With".

  4. #4
    Membre chevronné
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Par défaut
    Citation Envoyé par whorian Voir le message
    Je trouve VB.NET un peu trop lyrique, surtout pour ce qui est des fins d'instructions (changement de ligne). Pas de commentaires non plus sur le mot clé "With / End-With".
    Lyrique : "...Ouvrages en vers qui sont faits pour être chantés ou propres à être mis en musique, tels que les cantates, les chansons, les opéras..." (extrait de la définition du Wiktionnaire).

    Perso, j'aurais plutôt utilisé le terme de verbeux

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    En C#, quand on appelle une méthode en lui passant un paramètre par référence, on doit faire précéder le paramètre du mot-clé ref : cela permet d'être sûr que le développeur est conscient que la méthode peut modifier la valeur du paramètre.

    En VB.NET, le mot clé ByRef n'est indiqué que dans la déclaration ; lors de l'appel de la méthode, c'est implicite. Si bien qu'on peut très bien appeler la méthode sans avoir réalisé qu'elle peut modifier le paramètre... ce qui peut causer de longues heures de débogage et d'arrachage de cheveux à mon avis

    Pour moi, ByRef est juste un héritage de VB6 et antérieur, qui a été mal transcrit en VB.NET. La syntaxe de C# sur ce point est beaucoup plus rigoureuse et explicite... mais bon, on va pas transformer cette discussion en débat sur les qualités et défauts des 2 langages, sinon on en finira pas

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    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 198
    Par défaut
    impressionnant ce qu'on lit ici

    en vb c'est byval par défaut, donc quand on mets byref c'est volontaire

    quand on appelle une sub (ou autre) avec du byref, l'infobulle le précise

    de plus on peut mettre une aide xml qui le précise

    byref est utile dans certains cas (c'est le seul moyen de remettre une variable distante à nothing)


    enfin je ne crois pas qu'il y ait lieu de s'acharner sur lui (byref) ! en tout cas ce n'est pas une absurdité pour moi et loin de là ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 533
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 533
    Par défaut
    Citation Envoyé par whorian Voir le message
    Je trouve VB.NET un peu trop lyrique, surtout pour ce qui est des fins d'instructions (changement de ligne). Pas de commentaires non plus sur le mot clé "With / End-With".
    Je ne savais pas que Microsoft et les équipes de Visual Studio étaient infuencés par la Callas et Puccini

    le mot ByRef je pense ( à vérifier ) a peut-être son sens et utilité si tu utilises du code unmanaged ou si tu passes à une fonction un paramêtre unmanaged c.a.d une valeur qui fait référence à du code natif.
    Si tu appelles une dll système qui renferme des API win32 comme par exemple pour les Hook clavier/souris tu seras obligé d'appeler ByRef ou ByVal selon les cas.

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    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 198
    Par défaut
    byref offre des possibilités, et le but d'un langage de programmation est d'offir le plus de possibilités
    aux développeurs ensuite de choisir ce qu'ils ont besoin
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    byref offre des possibilités
    Par exemple, celle pour une fonction de recherche dans des listes d'objets de retourner 2 objets, par exemple avec le "numéro d'immatriculation" retourner l'objet "véhicule" et l'objet "contrat d'assurance".

Discussions similaires

  1. [Débutant] Byref dans une SUB
    Par jolona dans le forum VB.NET
    Réponses: 7
    Dernier message: 29/08/2013, 10h29
  2. Passage d'objets en Byref d'une appli VB6 à une dll C++
    Par Illmess dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 15/07/2012, 05h29
  3. ByRef ou ByVal le return d'une fonction?
    Par tribaleur dans le forum Framework .NET
    Réponses: 4
    Dernier message: 01/09/2011, 16h39
  4. Byref indésirable dans une boucle
    Par Pito18 dans le forum VB.NET
    Réponses: 4
    Dernier message: 12/08/2010, 14h57
  5. Paramètre Byref à une fonction de dll
    Par samware dans le forum Débuter
    Réponses: 3
    Dernier message: 04/02/2009, 10h04

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