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

C# Discussion :

type valeur et type reference


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 46
    Points : 40
    Points
    40
    Par défaut type valeur et type reference
    Bonjour,
    j'ai trouvé dans un document que la manipulation d'un string revient a la manipulation des référence
    donc j'ai fait ce petit programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    static class Program
        {
            String c1 = "";
            static void Main()
            {
               test(c1);
                MessageBox.Show(c1);===> il affiche chaine vide
            }
            public void test(String c)
            {
                c= "dali";
            }
        }
    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
    18
    19
     
        static class Program
        {
           Class1 c1=new Class1();
            static void Main()
            {
                test(c1);
                MessageBox.Show(c1.S); ===> il affiche bien dali
            }
            public void test(Class1 c)
            {
                c.S = "dali";
            }
     
        }
        public class Class1
        {
            public string S = "";
        }
    pouvez vous l'expliqué la diférence

  2. #2
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    Oui, une classe est passé par référence, un string n'est pas passé par référence par défaut. Tu peux en revanche passer un string par référence (en utilsant 'out' ou 'ref' ça doit normalement fonctionner). La différence est que le mot clé 'out' nécessite une affectation dans la méthode appelé

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 46
    Points : 40
    Points
    40
    Par défaut
    merci pour votre réponse
    pourquoi string n'est pas passé par référence par défaut?c'est un objet de type référence? non?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Citation Envoyé par dalio Voir le message
    merci pour votre réponse
    pourquoi string n'est pas passé par référence par défaut?c'est un objet de type référence? non?
    Oui mais c'est un mauvais exemple. Même si c'est un type référence, il se comporte comme un type valeur. Comme exemple, une simple affectation via "=" change le contenu de la chaîne mais la référence.

  5. #5
    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
    en .net il y a les types par valeurs (int, boolean, date, les structures etc...)
    il ne peuvent pas valoir null, ils ont forcément une valeur par défaut
    avec le mot clé ref, on peut les modifier avec retour de la modification de la valeur à l'appelant

    les types par référence (object, les classes ...) eux ont un pointeur et valent null par défaut
    avec le mot clé ref c'est le pointeur de l'objet qui est passé (alors que sans, c'est une copie du pointeur qui est passé)
    dans les 2 cas les modifications sont visibles par l'appelant, car c'est l'objet pointé qui est modifié
    avec ref, on peut mettre à null et l'appelant voit alors null, sans ref, c'est une copie du pointeur qui est mises à null dans ce cas, et donc l'appelant garde son pointeur

    le string est à cheval entre les 2, il peut etre à null comme les types par références, mais il est traité par la pile comme les types par valeur
    en fait en plus des types par valeur et des types par référence, il y a les les types gérés dans la pile et les types gérés dans le tas
    string est un type par référence géré dans la pile
    les classes sont des types par référence géré dans le tas
    les int et autre sont des types par valeur géré dans la pile
    et le mot ref n'influence pas les types par référence mais les types gérés dans le tas
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 46
    Points : 40
    Points
    40
    Par défaut
    Merci pour la réponse
    la dernière réponse ma permis de faire ca !!

    il se plante?

    plus d'explication merci

    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
    18
    19
    20
     
     static class Program
        {
           Class1 c1=null;
            static void Main()
            {
                test(c1);
                MessageBox.Show(c1.S); ===> plante
            }
            public void test(Class1 c)
            {
                c = new Class1();
                c.S = "dali";
            }
     
        }
        public class Class1
        {
            public string S = "";
        }

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    la dernière réponse ma permis de faire ca !!

    il se plante?
    de quoi parles tu ?

    Dans ton dernier exemple, tu réaffectes une nouvelle référence dans la méthode. C'est ce qui pose problème. Très grossièrement on peut dire que les paramètres passés par référence la conserve cette référence quelque soit ce que tu fait dessus. En réaffectant, tu perds cette référence, mais .Net la conserve et la renvoie.

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    Avec un prototype de méthode comme ça, tu copies la référence (pointant sur les données):
    Citation Envoyé par dalio Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
             public void test(Class1 c)
    En faisant ça, tu écrases la copie de la référence passée, du coup ton "problème" survient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void test(Class1 c)
    {
    c = new Class1();
    }
    Pour que ton code fonctionne, il faudrait ajouter le mot clé ref, pour justement ne plus bosser sur une copie, mais sur la référence originale (ou out si modif):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
             public void test(ref Class1 c)
    Mais le mieux c'est de se documenter, genre ici. C'est important de comprendre ces mécanismes avant d'aller plus loin. Utilises aussi le debugger pour comprendre c'est vachement utile.

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 46
    Points : 40
    Points
    40
    Par défaut
    Merci

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

Discussions similaires

  1. [PHP 5.1] Type valeur input != Type valeur textarea
    Par Federico_muy_bien dans le forum Langage
    Réponses: 9
    Dernier message: 11/08/2010, 14h34
  2. plusieurs select avec valeur du type valeur[indice]
    Par varex dans le forum Struts 1
    Réponses: 4
    Dernier message: 24/11/2008, 17h01
  3. Type polymorphiques et types valeurs
    Par balteo dans le forum C++
    Réponses: 11
    Dernier message: 01/04/2008, 09h22
  4. insérer une valeur de type float dans une abse de données
    Par Stephane_br dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/11/2005, 10h47
  5. [JDBC] Affichage d'une valeur de type CloB
    Par Jihed Amine Maaref dans le forum JDBC
    Réponses: 3
    Dernier message: 07/04/2005, 15h03

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