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 :

Est-il possible d'"auto-détruire" un objet dans son propre constructeur ?


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 346
    Points : 119
    Points
    119
    Par défaut Est-il possible d'"auto-détruire" un objet dans son propre constructeur ?
    Bonjour,

    je débute en C# et je n'ai pas trouvé le moyen de faire cela dans les différentes docs : j'aimerai pouvoir retourner une référence nulle lors de la construction d'un objet si une erreur se produit (et ne pas lever d'erreur).

    L'idée est que si la construction de l'objet echoue, aucune erreur n'est levée mais une reference nulle est retournée. Charge à l'appelant de vérifier que l'objet construit n'est pas nul et de faire ce qu'il veut en fonction de cela.

    En Perl, ce comportement est très courant... est-ce possible d'en faire autant en C# ?


    merci pour toute réponse
    Bonne journée

  2. #2
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    A part lever une exception dans le constructeur je ne vois pas. Et puis l'exception ça te permet de connaitre le type d'erreur, alors que simplement renvoyer null n'est pas très informatif je trouve.

  3. #3
    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
    Dans le constructeur tu ne peux pas, la seule manière c'est de lever une exception. Mais ce n'est pas un problème, il te suffit de faire une méthode statique qui fera ce que tu veux

    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
    public static MaClasse TryCreateInstance()
    {
        MaClasse instance = null;
     
        try
        {
            instance = new MaClasse();
        }
        catch (Exception ex)
        {
            // Traitement de l'erreur éventuellement (log, ...)
        }
     
        return instance;
    }
    Maintenant je suis assez d'accord avec la remarque de The_badger_man.

  4. #4
    Membre expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Points : 3 134
    Points
    3 134
    Par défaut
    Pour faire ce genre de choses proprement, je te conseillerais d'implémenter une Factory, cela t'évitera ce genre de bisareries

    Factory est un design pattern relativement simple, qui consiste à déplacer la construction des instances dans une autre classe. Ta factory construit l'objet et catche les eventuelles exception. En catche, tu fais juste 'return null' dans le reste, return la nouvelle instance.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 346
    Points : 119
    Points
    119
    Par défaut
    Merci pour vos réponses. Je vais m'intéresser à la Factory.

    Pour répondre à The_badger_man, il y a des cas où l'erreur doit absolument être silencieuse et ne pas interférer le déroulement (même pas par un message). Je prévois un traceur qui lui, enregistre les erreurs en détail. Libre à l'appelant d'aller voir ce qui ne va pas dans ce traceur et d'afficher l'erreur.

    C'est comme ça que fonctionnent nombre de modules (orientés objets ou pas) en Perl.

  6. #6
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Etant donné que la plupart des créations d'objets se passe bien, il me semble mieux de retourner systématiquement une référence non nulle et de spécifier les cas d'erreurs par une exception. Sinon, il faudrait faire systématiquement A a = new A() ; if (a != null) { ... }, ce qui me semble lourd. Ca impose de traiter l'erreur au plus bas niveau, alors qu'une exception peut être catchée très haut.

    C'est probablement une question d'habitude Mais j'ai déjà vu des codes bourrés de tests de nullité inutiles, c'est assez traumatisant.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 346
    Points : 119
    Points
    119
    Par défaut
    Je comprend le point de vue.
    J'ai pris l'habitude de faire comme ça, et comme je suis en phase d'apprentissage, je me posais la question pour faire le corrolaire avec des scripts en Perl.

    A l'usage, je ferai peut être différemment. Cela dit, je reste convaincu que dans certains cas, je n'ai pas envie de connaître la cause de l'erreur.

    Lors de la programmation, c'est évidemment indispensable. Mais lors de l'utilisation par le client - toujours dans certains cas spécifiques d'utilisation -, si je sais que le programme n'a pas d'erreurs (bugs, paramétrages), le fonctionnement général du programme n'a pas à prendre en compte le fait que certaines actions n'aient pas abouties.

    Après, ça dépend bien sur de l'objet créé (typiquement, ce n'est pas un objet critique mais une donnée qui sert à alimenter autre chose).

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

Discussions similaires

  1. Est-il possible de tester si un nom existe déjà dans son vecteur
    Par sam14 dans le forum Débuter avec Java
    Réponses: 24
    Dernier message: 16/03/2012, 15h50
  2. Réponses: 4
    Dernier message: 02/03/2010, 09h47
  3. [SQL] Est-il possible d'afficher le résultat d'une requête dans un cadre
    Par dessinateurttuyen dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 18/07/2006, 17h52
  4. Réponses: 4
    Dernier message: 26/01/2006, 17h38

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