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 :

création dynamique d'un objet : avec ou sans pointeur?


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 355
    Points : 0
    Points
    0
    Par défaut création dynamique d'un objet : avec ou sans pointeur?
    bonjour,

    En C# en utilisant l'API de Unity,je crée fréquemment un objet de manière dynamique comme ceci:
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using System;
    
    
    public class script : MonoBehaviour
    {
       int i=0;
        public GameObject obj;
    
       List<GameObject> ObjectList;
        
         
    
     // Use this for initialization
        void Start()
        {
            
           
            ObjectList=new List<GameObject>();     //création dynamique
            ObjectList[0]=obj;
            
            
       }
    
       
    
        // Update is called once per frame
        void Update()
        {    
            
    
            if (Input.GetKeyDown(KeyCode.I))
            {
                i++:
                ObjectList.Add(obj);
                    
               ObjectList[i] = new GameObject("toto");    //création dynamique
    
         }
    
                 
     }
     }
    Pourtant,j'ai lu dans ce tuto pour le C/C++(certes différent du C#)
    https://www.irif.fr/~carton/Enseigne...ides-vaira.pdf
    que la cration dynamique doit passer par un pointeur
    Dans ce script C#,la création dynmique fonctionne sans passer par un pointeur.

    Comment expliquer ceci?


    merci de votre aide

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Dans la majorité des cas, C# gère le pointeur pour toi.

    Petite remarque :
    Puisque tu utilises une liste, tu n'a pas besoin de gérer le compteur, la liste a déjà tout ce qu'il faut.
    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
    21
    22
    23
    24
    public class Script : MonoBehaviour
    {
        List<GameObject> ObjectList;
     
        public Script()
        {
    	ObjectList = List<GameObject>(); 
        }
     
    	// Use this for initialization
        void Start()
        { 
            // Do someting if necessary
        }
     
        // Update is called once per frame
        void Update()
        {    
            if (Input.GetKeyDown(KeyCode.I))
            {
               ObjectList.Add(new GameObject("toto")); 
    	}      
        }
     }

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 355
    Points : 0
    Points
    0
    Par défaut
    Peut-on m'expliciter (tuto) le fait que C# gère le pointeur pour moi ?

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    C'est natif.
    lorsque tu écris "var toto = new Toto()", C# va de lui même créer un pointeur et le gérer à ta place.
    De même lorsque plus rien ne fera référence à toto, C# va de lui-même libérer le pointeur.

    Je ne saurai traduire ça en terme plus profane ni expliquer comment ça fonctionne exactement.
    Mais, en gros tu n'a généralement pas besoin de te soucier de faire des malloc(..), c'est fait en interne.

  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 2 espaces mémoires, la pile (stack) et le tas (heap)
    les variables des types de base et les struct sont instanciées dans la stack, et retirées (dépilées) en sortie de bloc (méthode par exemple)
    pour les variables de type classes, le pointeur est dans la stack (var a => a est dans la stack et est un int32 ou int64 qui ponte vers l'espace mémoire dans la heap)
    pour les classes ayant des propriétés, elles sont dans la heap, pour les propriétés de types classes c'est à nouveau un pointeur vers un autre espace mémoire

    le GC (garbage collector) connait les quelques objets racines de l'exécution et à partir de là peut retrouver tout ce qui est dans la heap et qui n'est plus référencé par quelque chose de "vivant" et donc le supprimer réellement de la mémoire
    le GC passe quand il a envie et on peut le forcer quand on fait des choses un peu ésotériques ^^

    en découle par exemple la gestion des paramètres passés à un membre
    void test (Button b)
    fait que c'est une copie du pointeur qui créée, les 2 pointeurs pointent donc vers la même instance (la modification d'une propriété est visible par l'appelant aussi)
    void test2 (ref Button b)
    fait que le pointeur est passé directement, ainsi si on modifie le contenu de b ici, le contenu est modifié pour l'appelant aussi (la modification d'une propriété est bien sur visible par l'appelant, mais si cette méthode dit b = new Button, l'appelant verra le nouveau Button dans sa variable)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 355
    Points : 0
    Points
    0
    Par défaut
    en répondant à popo,dnas ce document:
    https://www.irif.fr/~carton/Enseigne...ides-vaira.pdf
    rubrique new et delete,il semble qu'en C/C++ new doit utiliser au préalable un pointeur.
    Alors dois-je comprendre que le C# le fait en interne et non le C/C++?

  7. #7
    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
    pourquoi lire un cours de C++ pour apprendre le C# ?
    ton cours n'a pas de date ni de version de C++, les versions récentes C++ permettent d'avoir une gestion automatique de la mémoire
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 355
    Points : 0
    Points
    0
    Par défaut
    qui dit gestion automatique de la mémoire dit pointeur non nécessaire pour new.
    C'est cela?

  9. #9
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Non,
    Comme l'a déjà expliqué Pol63, "new" va créer un pointeur mais c'est C# qui le gère pour toi.

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 355
    Points : 0
    Points
    0
    Par défaut
    enfin,en est-il de même en C/C++ malgré ce tuto pdf daté posté initialement?

  11. #11
    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
    poser une question c/c++ sur le forum concerné, non ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Le C# n'a pas de notion de pointeur1

    Le C# a des types valeurs et des types références.

    Pour une variable de type valeur (int, bool, float, etc...), les allocations mémoires se font à la déclaration de la variable (généralement sur la pile)

    Pour une variable de type référence, l'allocation mémoire se fait dynamiquement en utilisant le mot clé new. Dans ce cas, l'objet est alloué sur le tas et son constructeur appelé.

    On dit souvent qu'une référence en C# c'est la notion de pointeur. Si d'un point de vue technique cela peut se défendre, d'un point de vue conceptuel cela ne peut être plus faux. Une référence et un pointeur sont très différents, notamment :
    - un pointeur, c'est au programmeur de décider s'il faut le détruire et quand il faut le détruire. Une référence, c'est le ramasse-miettes qui s'en charge
    - un pointeur, c'est une zone précise de la mémoire. Une référence peut évoluer. L'objet sur lequel pointe une référence peut être déplacé par le ramasse-miettes et donc ne pas être localisé au même endroit de la mémoire. Dans un programme purement C#, cela ne pose pas de soucis, mais si on fait appel à des dll écrites en C ou C++ par exemple, il faut en tenir compte !
    - l'accès à une référence est sûr, contrairement à l'accès à un pointeur. Avec un pointeur, on peut accéder à n'importe quelle zone mémoire, et on peut utiliser un objet qui a été détruit. Ce n'est pas possible avec une référence.

    Dans les deux cas, pointeur ou référence, on utilise le même mot clé new. Mais ce n'est pas le même langage, donc pas les mêmes notions !

    1) Je sais pertinemment que si, mais dans un contexte unsafe, etc... qui dépasse largement le cadre de cette discussion.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

Discussions similaires

  1. Création dynamique d'un onglet avec template
    Par abraxis dans le forum Ext JS / Sencha
    Réponses: 3
    Dernier message: 09/11/2010, 10h21
  2. Réponses: 0
    Dernier message: 14/11/2009, 15h49
  3. Création dynamique de variables objet
    Par Oliv- dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 19/06/2008, 18h17
  4. création dynamique d'objet, projet win32
    Par noinneh dans le forum MFC
    Réponses: 5
    Dernier message: 03/02/2005, 16h07
  5. [Reflexivite]création dynamique d'objet et Héritage
    Par norkius dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 26/10/2004, 11h37

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