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 :

[C#] Vaut il mieux faire un cast ou créer un nouvel objet?


Sujet :

C#

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Points : 79
    Points
    79
    Par défaut [C#] Vaut il mieux faire un cast ou créer un nouvel objet?
    Bonjour,

    je me pose actuellement une petite question.
    Vaut il mieux caster un objet ou en créer un nouveau en terme de performance?

    Voici un petit bout de code:
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class DatabaseConnection
    {
    	...
    	...
     
    	public IEnumerable<NpgsqlDataReaderEvoluate> Read(NpgsqlDataReader result)
    	{
    		while (result.Read()){
    			yield return new NpgsqlDataReaderEvoluate(result);
    			//Ou vaut il mieux faire yield return new (NpgsqlDataReaderEvoluate) result;
    		}
    	}
    }

    Et ma classe
    Code c# : 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
    public class NpgsqlDataReaderEvoluate
    {
    	private NpgsqlDataReader _Reader { get; set; }
    	public NpgsqlDataReaderEvoluate(NpgsqlDataReader reader)
    	{
    		_Reader = reader;
    	}
     
    	public int GetInt(string fieldValue)
    	{
    		return _Reader.GetInt32(_Reader.GetOrdinal(fieldValue));
    	}
     
    	public string GetString(string fieldValue)
    	{
    		return _Reader.GetString(_Reader.GetOrdinal(fieldValue));
    	}
     
    	....
    	....
    	....
    }

    Le problème c'est que je n'arrive pas à hériter de NpgsqlDataReader ("Cannot access internal constructor 'NpgsqlDataReader' here").

    Bref vaut il mieux hériter (trouver une solution) ou créer un nouvel objet sera aussi performant?

  2. #2
    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
    Bonsoir.

    Un cast est évidemment plus rapide qu'une instanciation. Mais si la classe dont tu voudrais hériter a rendu tous ses constructeurs inaccessibles, cela n'est pas possible.

    Cela ne te laisserait donc que la solution que tu as utilisée et qui équivaut grosso modo au pattern "adaptateur" (adapter).

  3. #3
    Membre actif Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Points : 293
    Points
    293
    Par défaut
    Si ta classe englobante ne diffère que de quelques méthodes n'utilisant rien d'autre que l'objet englobé,
    Tu peux voir à utiliser des méthodes d'extensions.

    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
     
    public static class NpgsqlDataReaderEvoluate
    {
      public static int GetInt(this NpgsqlDataReader reader, string fieldValue)
      {
        return reader.GetInt32(reader.GetOrdinal(fieldValue));
      }
     
      public static string GetString(this NpgsqlDataReader reader, string fieldValue)
     {
        return reader.GetString(reader.GetOrdinal(fieldValue));
      }
     
      ....
      ....
      ....
    }

  4. #4
    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
    Citation Envoyé par brachior Voir le message
    Tu peux voir à utiliser des méthodes d'extensions.
    Absolument

    J'ajoute que l'on a jamais intérêt à dériver les classes d'ADO.Net, parce que la bonne pratique est plutôt de se servir des factories (comme détaillé ici), et que l'on instancie donc aucune classe directement via new.

    J'ajoute aussi que ces méthode d'extension ont intérêt à prendre les interface (ou les classes abstraites) telles que IDataReader, IDataParameter en paramètre, leur code ne dépendant pas du provider utilisé (ici Npgsql, mais ça pourrait être Oracle, SQL server, ...)
    ಠ_ಠ

Discussions similaires

  1. que vaut il mieux faire -sql
    Par kaking dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/04/2009, 09h47
  2. Réponses: 4
    Dernier message: 31/10/2006, 09h12
  3. Vaut-il mieux des petites ou une grosse... fonction ?
    Par laurent_ifips dans le forum C
    Réponses: 2
    Dernier message: 19/12/2005, 12h30
  4. vaut il mieux utiliser ArrayList ou implémenter collection?
    Par irnbru dans le forum Framework .NET
    Réponses: 17
    Dernier message: 05/11/2005, 12h51
  5. Qu est ce qu il vaut mieux faire.
    Par rvzip64 dans le forum Requêtes
    Réponses: 7
    Dernier message: 03/06/2004, 16h04

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