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 :

erreur: référence à l'object est exigée pour non-static field


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Février 2021
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2021
    Messages : 77
    Points : 51
    Points
    51
    Par défaut erreur: référence à l'object est exigée pour non-static field
    Bonjour
    J'expérimente avec l'instantiation d'une classe. En principe, je la place dans le Main, mais je voulais essayer de la mettre dans le constructeur comme ceci:
    using System;
    class Car
    {
    string model="bmw";
    Car auto;

    public Car()
    { auto = new Car(); }

    static void Main()
    {
    new Car();
    Console.Write(auto.model);
    }
    }
    Mais ça donne une erreur (référence à l'object est exigée pour non-static field) à auto.model.
    Merci
    R.

  2. #2
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 639
    Points : 2 148
    Points
    2 148
    Par défaut
    Bonjour,

    Je ne sais pas quelle sorte d'expérimentation tu essayes de faire mais pour ton erreur c'est très simple, auto n'est pas déclaré en static.

    Lorsque tu utilises une méthode statique d'une classe, tu ne peux faire appel à des variables ou des méthodes qui nécessitent un objet instanciée de cette classe.

  3. #3
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Février 2021
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2021
    Messages : 77
    Points : 51
    Points
    51
    Par défaut
    Rebonjour

    C'est en effet ce que dit l'erreur. Pourtant, on pourrait croire que auto est connu par Main, vu qu'il est dans le constructeur et que celui-ci est appelé par Main.

  4. #4
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 639
    Points : 2 148
    Points
    2 148
    Par défaut
    Ca ne change strictement rien, tu as l'air de parler d'un soucis de scope, là c'est un problème d'accessibilité. L'erreur est assez explicite. On dirait que tu essayes de créer un Singleton ou quelque chose dans le genre.

    Et je ne sais pas si c'est fait exprès ou mal copier / coller mais fais attention, ta méthode Main est imbriquée dans ta classe Car.

  5. #5
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    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 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    On dirait effectivement un essai de mise en place d'un singleton. Le singleton est simple sur le principe, compliqué à mettre en oeuvre correctement.

    Première erreur : l'attribut auto n'est pas statique, et n'est donc pas accessible aux membres statiques.
    Deuxième erreur : on a une belle récursivité infinie : la classe Car, lors de la construction d'un objet, construit un objet de la classe Car, qui construit un objet de la classe Car, qui construit un objet de la classe Car, qui construit un objet de la classe Car, ...

    Si l'objectif est un singleton, voici quelque chose de beaucoup plus propre (et safe !)
    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
     
    using System;
    class Car
    {
      string model="bmw";
      static readonly Car auto;
     
      static Car()
      { auto = new Car(); }
     
      static void Main()
      {
        Console.Write(auto.model);
      }
    }
    Il faut noter :
    • le static devant la variable auto, pour la rendre static
    • le readonly, pour empêcher tout changement de la valeur de la variable en dehors d'un constructeur
    • le constructeur est static ! C'est possible en C#. Le constructeur est appelé lorsque le type Car est utilisé la première fois
    • plus besoin d'instancier explicitement un Car dans la méthode Main, cela sera fait automatiquement du fait d'utiliser une méthode de la classe Car


    Le code est encore bien améliorable, mais pour l'instant, c'est déjà pas mal
    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

  6. #6
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Février 2021
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2021
    Messages : 77
    Points : 51
    Points
    51
    Par défaut
    Ok, merci.

  7. #7
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 896
    Points : 1 912
    Points
    1 912
    Par défaut
    Ce n'est pas techniquement faux, rien n'oblige à ce que la fameuse fonction Main soit dans une classe Program, par contre ce n'est effectivement pas vraiment pertinent. De façon générale l'auteur du post ne me donne pas l'impression de bien savoir ce qu'il fait, je pense que les bases ne sont pas acquises.

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/06/2017, 11h10
  2. Réponses: 0
    Dernier message: 26/04/2017, 11h31
  3. Réponses: 3
    Dernier message: 29/05/2016, 13h29
  4. [Débutant] problème référence d'objet est requise pour NavigationService
    Par Veidt dans le forum Windows Phone
    Réponses: 2
    Dernier message: 11/08/2012, 00h13
  5. Réponses: 2
    Dernier message: 26/01/2012, 14h53

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