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

Framework .NET Discussion :

By val et By ref appliquées à des objets de types structurés


Sujet :

Framework .NET

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    975
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 975
    Points : 139
    Points
    139
    Par défaut By val et By ref appliquées à des objets de types structurés
    Bonjour,

    Voici le code suivant en Vb.net qui est des plus simples
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
    TextBox2.Text = "Bonjour"
        End Sub

    L’argument sender est transmis par valeur alors qu’il est de type Objet donc structuré.
    Il en est de même pour l’argument e de type EventArgs
    Pouvez vous m’expliquer pourquoi on n’utilise pas ByRef pour
    les passage des arguments sender et e

    De la même manière lorsque l’on crée un nouveau SqlDataAdapter par exemple avec cette instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ObjDA As SqlDataAdapter
    objDA = New SqlDataAdapter(StrSQLThesaurus1, objConn)
    D’après le constructeur de la classe SqlDataAdapter, l’argument objConn, qui ,à la base, est de type SqlConnection, donc de type structuré, est passé par valeur et non pas par référence
    Pouvez vous m’en expliquer la raison.

    Merci beaucoup à vous.

    Autre et dernière question:
    J'ai crée un dataset objDS qui contient le resultat d'une selection de termes de la table TERMES, comme vous pouvez le comprendre d'après ce code
    On suppose que objConn est une connxion à la BDD déjà initialisée
    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
     
     
    StrSQLThesaurus1 as String
    StrSQLThesaurus1 = "SELECT ID_TERME,LIB_TERME from TERMES;"
     
     
     
            'on ajoute la table THESAURUS_objDS au dataset objDS
            objDA = New SqlDataAdapter(StrSQLThesaurus1, objConn)
     
            objDS = New DataSet
     
            objDA.Fill(objDS, "objDS_THESAURUS")
     
            objConn.Close()
    Pour chaque ligne de la table objDS_THESAURUS du dataset objDS, qui contient donc le contenu des champs ID_TERME et LIB_TERME de la table TERMES, on ajoute un ListViewItem à la ListView appelée List_view_termes et par la fonction Add, on recupère l'adresse du nouveau ListViewItem dans la variable lvi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim lvi as ListViewItem
    For Each ligne_table_termes_objDS In objDS.Tables("THESAURUS_objDS").Rows
     
                    lvi = List_view_termes.Items.Add(ligne_table_termes_objDS("LIB_TERME"))
    Du fait que j'ai mis l'option Strict à ON, je reçois un message qui m'annonce que du fait de cette option Strict à ON, il ne peut y avoir de conversion implicite du type Object vers le type String.

    Pourquoi ligne_table_termes_objDS("LIB_TERME")) est il considéré comme étant de type Object et pas de type dataRow.

    Merci beaucoup encore de votre aide.

    Bien cordialement.

    Nathalie

  2. #2
    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
    Points : 39 753
    Points
    39 753
    Par défaut
    J'ai l'impression que tu mélanges 2 choses :

    - type valeur (Structure) / type référence (Class)

    Un type valeur ne peut pas être null (Nothing en VB), et est toujours copié lors d'une affectation (au lieu de copier une référence vers le même objet, c'est l'objet entier qui est copié). Dans le cas d'une variable locale ou d'un paramètre de méthode, l'objet est alloué sur la pile.

    Un type référence peut être null (Nothing), et est copié par référence : lors d'une affectation de l'objet à une autre variable, l'objet n'est pas copié, mais une nouvelle référence vers la même instance d'objet est créée. Les types référence sont toujours alloués sur le tas.

    - passage de paramètre par valeur / par référence

    Quand un paramètre est passé par valeur, une copie de l'objet (si c'est un type valeur) ou une copie de la référence (si c'est un type référence) est passée à la méthode. La méthode ne peut pas modifier la valeur du paramètre (ou plutôt, elle peut, mais elle ne modifie qu'une copie, ça n'a pas d'impact sur l'appelant)

    Quand un paramètre est passé par référence, une référence vers l'objet est passée à la méthode : la méthode peut modifier le paramètre, et l'appelant récupèrera le paramètre modifié.


    J'ai vu une explication très complète de tout ça récemment, je vais essayer de remettre la main dessus...
    EDIT: voilà, je l'ai retrouvée


    Pour l'autre question :
    Pourquoi ligne_table_termes_objDS("LIB_TERME")) est il considéré comme étant de type Object et pas de type dataRow.
    ligne_table_termes_objDS est de type DataRow, mais ligne_table_termes_objDS("LIB_TERME") accède à un champ donné du DataRow, ça ne renvoie pas un DataRow mais la valeur du champ. C'est donc de type object (vu que les champs peuvent être de n'importe quel type)

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    975
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 975
    Points : 139
    Points
    139
    Par défaut By val, Byref explications
    Bonjour et merci beaucoup de toutes ces explications dont j'avias besoin.
    Le lien vers le sujet expliqué est super.
    Je regrette simplement qu'au niveau di code on ne voie pas ecrit l'appel de la méthode Modifieur

    Voici , selon moi le code exact

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    Public Sub Main()
                Dim val As New MaClasse
                val.membre = "hello"
    Modifieur(val)           
     Console.WriteLine(val)
            End Sub
     
            Private Sub Modifieur(ByVal variable As MaClasse)
                variable.membre = "world"
            End Sub
    Merice encore pour tout.

    Cordialement.

    Nathalie

  4. #4
    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
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par harbonne Voir le message
    Je regrette simplement qu'au niveau di code on ne voie pas ecrit l'appel de la méthode Modifieur
    Effectivement... il est prévu d'intégrer ça dans la FAQ, il faudra qu'on corrige le code avant

Discussions similaires

  1. [Débutant] ref ou pas ref devant des objets ?
    Par oodini dans le forum C#
    Réponses: 9
    Dernier message: 05/07/2011, 11h18
  2. itération sur des objets de types différents ?
    Par jc63 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 07/09/2007, 08h19
  3. Réponses: 1
    Dernier message: 05/06/2007, 17h14
  4. Réponses: 3
    Dernier message: 16/10/2006, 11h06
  5. [Debutant][Conception] visibilité des objets de type conteneur
    Par thebloodyman dans le forum Général Java
    Réponses: 10
    Dernier message: 04/01/2006, 12h44

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