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 :

Les variables par Valeur ou par Référence [Débutant]


Sujet :

VB.NET

  1. #1
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut Les variables par Valeur ou par Référence
    Bonsoir à vous.
    extrait du tuto de Plasserre:
    Nom : ecqf.jpg
Affichages : 335
Taille : 34,9 Ko

    J'ai essayé cet exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Public Class Class1
        Public age As Integer
        Public Sub New()
        End Sub
     
    End Class
    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
    16
    17
     
    Module Module1
     
        Sub Main()
            Dim c1 As New Class1
            Dim c2 As New Class1
            c2.age = 40
            c1.age = c2.age
            c1.age = 50
     
            Console.WriteLine(c1.age)
            Console.WriteLine(c2.age) 'donne 40, alors que je m'attends à 50
            Console.ReadKey()
     
        End Sub
     
    End Module
    D'après le Tuto si je change C1.age, C2.age devrait changer, n'est ce pas?
    J'apprends la programmation pour le plaisir

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Il faut affecter les instances (objets) pas les propriétés
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  3. #3
    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
    Citation Envoyé par stracoma Voir le message
    D'après le Tuto si je change C1.age, C2.age devrait changer, n'est ce pas?
    Non, d'après le tuto si tu changes C1 par C2 (l'objet entier) alors la modification de l'age de l'un sera répercutée sur l'autre
    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
    16
    Module Module1
     
        Sub Main()
            Dim p1, p2 As Person
            p1 = New Person
            Console.WriteLine(p1.Age) ' 0
            p2 = p1
            p2.Age = 42
            Console.WriteLine(p1.Age) ' 42
        End Sub
     
    End Module
     
    Class Person
        Public Property Age As Integer
    End Class
    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.

  4. #4
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Sauf erreur de ma part, la notion de passage par valeur ou de passage par référence n'intervient que quand une procédure transmet des valeurs à une autre.

    Supposons que par esprit de faire du zèle tu aies quelque chose de ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sub LesCalculs()
       dim nombre as double = 2
       LaRacineCarrée(Nombre)
    end sub
    Version 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub LaRacineCarrée(ByVal Nombre as double)
         Nombre = Nombre +1
         dim Réponse as double = sqr(Nombre)
    end sub
    Version 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub LaRacineCarrée(ByRef Nombre as double)
       Nombre = Nombre +1
       dim Réponse as double = sqr(Nombre)
    end sub
    Dans le cas de la version 1, avec un passage par valeur la valeur de nombre dans LesCalculs est toujours à 2, peu importe ce qui se passe avec le "Nombre" dans LaRacineCarrée.

    Dans le cas de la version 2, avec un passage par référence, la valeur de nombre dans LesCalculs deviens 3, parce que, "Nombre" dans LaRacineCarrée est devenu 3.

    Cependant, cela vaut la peine de signaler en complément que, dans VB.net, le passage se fait par valeur, par défaut, alors qu'en VB6 - VBA, le passage se fait par référence, par défaut. Donc, toute personne qui fait un Copier-Coller dans VB.net d'une procédure ramassée sur un site consacré à VB6 ou à VBA, doit être très prudent, dans son passage de paramètres.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  5. #5
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut
    Ok, je vois ma faute. (affecter les objets et non leurs paramètres)
    Merci
    J'apprends la programmation pour le plaisir

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par clementmarcotte Voir le message
    la notion de passage par valeur ou de passage par référence n'intervient que quand une procédure transmet des valeurs à une autre.
    Ce n'est pas le sujet de la question.
    La question porte sur les types des variables, valeur ou référence.
    L'instance d'une classe est référencée par une variable de type référence.
    Un boolean, un entier, une structure sont des variables de type valeur (contiennent une valeur).
    Voir dans ma signature La mémoire en .NET - Qu'est-ce qui va où ?

    VB est permissif à ce sujet
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  7. #7
    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
    Citation Envoyé par rv26t Voir le message
    VB est permissif à ce sujet
    On peut avoir plus d'infos sur ce point précis ?
    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.

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    VB accepte (je suis en version 2010)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Option Explicit On
    Option Strict On ' idem si défini dans projet
    Public Class Form1
        Dim b As Boolean = Nothing
    End Class
    Alors que C# en écrivant ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            private void Form1_Load(object sender, EventArgs e)
            {
                Bool b = null;
            }
    indique immédiatement un message d'erreur
    Impossible de convertir Bool en null, car il s'agit d'un type valeur qui n'autorise pas les valeurs null
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  9. #9
    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
    Oui et c'est tout à fait normal ; Nothing n'a jamais vraiment été l'équivalent de null mais plutôt quelque chose s'approchant de default(type)voir documentation de Nothing dont la première ligne dit bien (pour ceux qui auraient la flemme d'ouvrir le lien )
    Citation Envoyé par MSDN
    Représente la valeur par défaut d'un type de données. Pour les types référence, la valeur par défaut est la référence d' null . Pour les types valeur, la valeur par défaut varie selon que le type valeur est nullable.
    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.

  10. #10
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Oui, c'est vrai. Il faut le déclarer Dim bn As Nullable(Of Boolean) pour qu'il permette l'équivalent de null, valeur non définie . Merci d'avoir repréciser.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Manipuler objet par valeur et par référence
    Par scar63 dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 23/04/2012, 00h41
  2. Passer un objet par valeur et non référence
    Par Pynouz dans le forum C#
    Réponses: 2
    Dernier message: 14/01/2011, 09h42
  3. Réponses: 36
    Dernier message: 06/03/2009, 11h00
  4. Réponses: 2
    Dernier message: 05/06/2006, 17h51
  5. Réponses: 3
    Dernier message: 12/09/2005, 16h38

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