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 :

NullReferenceException sur types non primitifs


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Points : 55
    Points
    55
    Par défaut NullReferenceException sur types non primitifs
    Bonjour,

    Je débute en C#, j'ai une classe avec un attribut de type Int32[].

    Quand j'essaie, dans une méthode de ma classe, d'ajouter quelque chose dans ce tableau, j'ai une erreur :

    Type : System.NullReferenceException
    Message : La référence d'objet n'est pas définie à une instance d'un objet.
    J'ai testé ensuite avec un attribut de type primitif (Int32), et là ça marche. Donc je suppose que c'est un problème de passage par référence/par valeur ?

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public partial class Form1 : Form
    {
    	private Int32[,] tableauTest;
    	private Int32[]  tableauTest_single;
    	private Int32    Test;
     
    	private void buttonTest_Click(object sender, EventArgs e)
    	{
    		this.tableauTest[0, 0] = 5;     // Erreur
    		this.tableauTest_single[0] = 5; // Erreur
    		this.Test = 5;                  // Fonctionne
    	}
    }
    Comment faire pour pouvoir modifier un attribut tableau dans une méthode ?

    Merci

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    En instanciant ton tableau, opération de base sur tout type non primitif dans un langage orienté objet. Donc commence par lire quelques tuto/cours
    Pas de questions techniques par MP

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    Si ton this.Test = 5; fonctionne, c'est parceque le compilateur le transforme automatiquement en this.Test = new Int32(5);

    En revanche pour les tableau, le compilateur ne peut pas deviner quelle taille tu veux leur donner (car a tableau a une taille fixe, sinon on passe par une collection).

    Comme le dit StormimOn, tu ne peux pas t'attaquer comme ca à du code sans avoir fait une approche minimum. C'est désagréable, demande du temps sans etre productif, mais c'est malheureusement indispensable. La récompense sera à la hauteur rassure toi.

  4. #4
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Citation Envoyé par giova_fr Voir le message
    En revanche pour les tableau, le compilateur ne peut pas deviner quelle taille tu veux leur donner (car a tableau a une taille fixe, sinon on passe par une collection).
    C'est un peu trop simplifié... une collection, aussi, doit être instanciée et on ne défini pas sa taille (dans ce cas, c'est la machine qui réserve un certain espace mémoire pour la collection).

    Je vais faire dans la métaphore :
    Image une voiture, c'est un concept (= classe). Elle n'exista pas.
    Essaie d'ouvrir sa portière, dans la réalité... Tu ne peux pas, car il N'y a PAS de voiture. (NullReferenceException)
    Maintenant tu as effectivement une voiture devant toi (en code tu as fait un New Voiture, tu as donc utilisé un constructeur - qui, comme son nom l'indique, construit ton instance). Maintenant tu peux ouvrir la portière.
    En gros, c'est ça la création d'instance. Biensûr, j'ai fais un gros racourci pour que tu puisses comprendre la notion d'instance... Bien évidemment, si tu ne connais pas ces bases, tu auras du mal à faire de la POO. Donc il te faut lire des cours/tuto.
    En informatique, le problème se situe toujours entre le clavier et l'écran !
    Il y a deux chemins entre le clavier et l'écran : Par l'UC et par l'utilisateur.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Points : 55
    Points
    55
    Par défaut
    Ok, ça marche maintenant.

    En fait je croyais qu'il n'y avait pas besoin de fixer une taille pour mon tableau, en le déclarant de type Int32[] au lieu de Int32[4] par exemple.

    Il ne fait pas l'allocation dynamique.

    Faut dire que je viens de PHP, pas de déclaration, pas de typage explicite, il se charge tout seul de l'allocation dynamique, une structure array unique et polyvalente, création de classes à la volée avec stdClass... super facile !

    EDIT :
    Est-ce que vous avez une URL qui présente les différentes structures de données en C# ?

    Apparemment il y a au moins les tableaux single ou multi-dimension, les listes, les collections, les hashtables... y'a de la faune quoi !

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Galdon Voir le message
    Ok, ça marche maintenant.

    En fait je croyais qu'il n'y avait pas besoin de fixer une taille pour mon tableau, en le déclarant de type Int32[] au lieu de Int32[4] par exemple.

    Il ne fait pas l'allocation dynamique.
    Si on veut gérer des ensembles en allocation dynamique on dispose de toute la panopile des List, Queue, Stack, Dictionnary, etc ..... donc on ne voit pas bien l'interêt de disposer de cette faculté sur les tableaux (qui sont de fait très peu utilisés, d'ailleurs).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  7. #7
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Citation Envoyé par Galdon Voir le message
    Ok, ça marche maintenant.

    En fait je croyais qu'il n'y avait pas besoin de fixer une taille pour mon tableau, en le déclarant de type Int32[] au lieu de Int32[4] par exemple.

    Il ne fait pas l'allocation dynamique.

    Faut dire que je viens de PHP, pas de déclaration, pas de typage explicite, il se charge tout seul de l'allocation dynamique, une structure array unique et polyvalente, création de classes à la volée avec stdClass... super facile !
    Mais cette facilité a des revers.
    * Les performances ! Entre php et un langage comme C#, il y a un monde. Pour faire grandir un tableau, il faut en fait en recréer un autre plus grand, copier l'intégralité du tableau original et assigner ce nouveau tableau à la place de l'ancien. Et les tableaux de php sont en fait pire, ce sont des structures évoluées et, à chaque addition d'un élément, ce sont des centaines voire un millier d'instruction qui sont exécutées. En C#, on est dans la dizaine d'instructions dans le pire des cas. Et puis, avec un langage lent, chaque nouvelle ligne de code est un poids, chaque ajout d'un niveau d'indirection un boulet de plus dans la face de ton GoogleRank. Et ne parlons pas des includes de 10k lignes pour en exécuter 5.
    * La propreté ! Si tu as un langage rapide, tu peux te permettre d'écrire un code avant tout propre et lisible, d'utiliser toutes les subtilités du langage que tu désires et, la plupart du temps, tu n'auras jamais à te préoccuper des perfs ou seulement via un léger polissage à la fin. Impossible aussi de faire du refactoring auto, il faut le faire à la main, avec toutes les chances de rater une occurence à modifier.
    * Les bugs ! Php, c'est facile, tout a toujours un sens, même quand ça ne devrait pas. Et, du coup, rien de plus facile que d'ajouter insidieusement un bug sans s'en rendre compte. Voir aussi ce que je disais sur le refactoring.

    Les langages comme Php ont leur intérêt mais, tu verras, une fois que tu te seras fait à un bon vieux langage rigide (typage fort, etc) et rapide, il se pourrait bien que tu frétilles de bonheur. Surtout un langage comme C# qui est assez fabuleux et fait tout pour t'éviter d'avoir à être verbeux, le revers habituel des langages rigides.

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    +1 Donquiche : j'ai débuté en PHP (enfin basic en fait...) et maintenant je deteste tous ces languages non typés, c'est l'enfer à débuger, on ne voit rien de ce qui se passe, c'est la porte ouverte à toutes les erreurs possibles...

    les tableaux (qui sont de fait très peu utilisés, d'ailleurs).
    Perso je ne m'en sert que pour exposer des copies de collections privées, histoire de sortir quelque chose de plus ou moins vérouillé (on ne peut ajouter ou supprimer d'ellement).

    L'autre interret (relatif) que je vois, c'est qu'ils sont plus rapide à manipuler, on peut acceder directement aux ellements du tableau sans passer par enumérateur...

  9. #9
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par giova_fr Voir le message
    Perso je ne m'en sert que pour exposer des copies de collections privées, histoire de sortir quelque chose de plus ou moins vérouillé (on ne peut ajouter ou supprimer d'ellement).
    C'est pas mal comme pratique, mais il y a les ReadOnlyCollections qui font cela aussi.

    L'autre interret (relatif) que je vois, c'est qu'ils sont plus rapide à manipuler, on peut acceder directement aux ellements du tableau sans passer par enumérateur...
    C'est le cas des List aussi.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    ce ne sont pas des listes chainées?

    Sinon ReadOnlyCollection ne s'applique pas vraiment dans mon cas, car en interne de la classe, celle ci peut ajouter ou retirer des ellements.

  11. #11
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par giova_fr Voir le message
    ce ne sont pas des listes chainées?
    Non, il existe aussi des listes chainées en .Net, c'est la classe générique LinkedList<T>.

    Sinon ReadOnlyCollection ne s'applique pas vraiment dans mon cas, car en interne de la classe, celle ci peut ajouter ou retirer des ellements.
    Pas compris. Mais une ReadOnlyCollection<T> se construit à partir de n'importe quel objet implémentant l'interface générique IList<T>, en le passant au constructeur de la ReadOnlyCollection.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  12. #12
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Sur les ReadOnlyCollection, typiquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class MyClass
    {
       private List<int> m_someList;
     
       // Renvoie un wrapper en lecture seule autour de la collection d'origine 
       // qui, elle, reste accessible en écriture depuis l'intérieur de MyClass.
       public IList<int> SomeList
       {
          get { return m_someList.AsReadOnly(); }
       }
    }

  13. #13
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    Merci pour l'info, moi qui me prennais la tete à construire un tableau, j'avais meme fait un snippet pour ca

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/07/2014, 22h07
  2. Deux attributs d'un même type non primitifs
    Par Isindra dans le forum Diagrammes de Classes
    Réponses: 2
    Dernier message: 04/05/2012, 17h21
  3. [SOAP] Question sur la déclaration des types non primitifs
    Par TekP@f dans le forum Services Web
    Réponses: 0
    Dernier message: 19/03/2010, 15h46
  4. Changer le type non-primitif d'une variable/pointeur
    Par ttone dans le forum Débuter
    Réponses: 12
    Dernier message: 10/10/2008, 17h16
  5. Sous VB.Net/Crystal report, Types non-primitifs
    Par 19cmos83 dans le forum SDK
    Réponses: 0
    Dernier message: 10/12/2007, 16h44

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