p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Rédacteur/Modérateur
    Avatar de jpcheck
    Homme Profil pro
    Consultant technique et formateur freelance
    Inscrit en
    juillet 2007
    Messages
    9 416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant technique et formateur freelance
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2007
    Messages : 9 416
    Points : 18 820
    Points
    18 820

    Par défaut Property ou Function ?

    Hello,

    j'utilise un certain nombre de classes qui ont des propriétés (Readonly) de portée Public.

    Je me pose la question de savoir si
    - les Property d'une classe sont générées dès la création d'une instance ou pas ?
    - l'utilisation de Function au lieu de ReadOnly Property est une optimisation du code ou pas ?

    Merci d'avance

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    février 2007
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : février 2007
    Messages : 598
    Points : 955
    Points
    955

    Par défaut

    Salut,

    Les propriétés sont des encapsulations de champs privés avec deux méthodes Get_NomPropriété et Set_NomPropriété.

    C'est généré lors de la compilation.


    Bref, cela ne sert à rien de se battre dessus jp.

  3. #3
    Invité
    Invité(e)

    Par défaut

    Peut-être la lecture de cet article te permettra d'en apprendre un peu plus sur l'utilité des propriétés. Bonne lecture

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : février 2004
    Messages : 19 560
    Points : 40 131
    Points
    40 131

    Par défaut

    Citation Envoyé par jpcheck Voir le message
    - les Property d'une classe sont générées dès la création d'une instance ou pas ?
    Ca n'a pas vraiment de sens... une propriété est juste une paire de méthodes (voire une seule méthode pour une propriété ReadOnly), elle est générée à la compilation. Le fait de créer une instance ne "génère" pas de propriété.

    Citation Envoyé par jpcheck Voir le message
    - l'utilisation de Function au lieu de ReadOnly Property est une optimisation du code ou pas ?
    Non, ça ne change rien en termes de performances. Un appel à une propriété est un appel de méthodes. D'ailleurs si tu regardes le code IL généré, tu verras que quand tu récupères la valeur d'une propriété Toto, ça appelle en fait une méthode (cachée) get_Toto.

    D'une manière générale, choisis une propriété si la récupération de la valeur est peu couteuse et n'a pas d'effet de bord. Si la valeur doit être calculée par un traitement complexe, il vaut mieux utiliser une fonction.

  5. #5
    Rédacteur/Modérateur
    Avatar de jpcheck
    Homme Profil pro
    Consultant technique et formateur freelance
    Inscrit en
    juillet 2007
    Messages
    9 416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant technique et formateur freelance
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2007
    Messages : 9 416
    Points : 18 820
    Points
    18 820

    Par défaut

    OK,

    et donc dans le cas où le retour est une list de classes, mieux vaut faire appel à une fonction donc ?

    Merci pour la lecture (mermich )

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

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : janvier 2007
    Messages : 6 607
    Points : 13 125
    Points
    13 125

    Par défaut

    Citation Envoyé par jpcheck Voir le message
    et donc dans le cas où le retour est une list de classes, mieux vaut faire appel à une fonction donc ?
    "Ca dépend"

    De manière générale, je considère qu'il y un cas où le choix doit faire pencher la balance de manière absolue : une propriété doit être idempotente en lecture; dit autrement, la lecture n fois de ta propriété ne doit pas changer l'état du système.

    Si c'est le cas, il est aberrant d'un point de vue conceptuel d'utiliser une propriété. (même si techniquement rien ne s'y oppose).

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    février 2007
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : février 2007
    Messages : 598
    Points : 955
    Points
    955

    Par défaut

    Pour le coup j'ai l'exemple ou le getter d'une propriété faisait de nombreux accès à la base de données...

    Dans ton cas je ferai une méthode à part plutôt qu'une liste car tu semble faire du traitement lors de la construction de la liste.

    De plus, on a vite fait d'essayer de modifier une liste directement avec des .add, même si la propriété est en readonly:


    Imaginons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public List<int> Plop
    {
      get
      {
          return new List<int>();
      }
    }
    Même si la propriété est en readonly (il n'y a pas de setter) tu pourra faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonInstance.Plop.Add(3);
    Et je peux te garantir que lorsque le voisin verra ce code pour la première fois il comprendra pas/rigolera/fera les gros yeux.

  8. #8
    Invité
    Invité(e)

    Par défaut

    @mermich,
    C'est cool ton exemple. Sauf que le hic (un peu hors sujet ) est que ta propriété Plop renverra toujours une liste avec zéro élément quoi.
    Il faut faire comme ça :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private List<int> list = null;
    public List<int> Plop
    {
      get
      {
          if(this.list == null) this.list = new List<int>();
          return list;
      }
    }

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

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : janvier 2007
    Messages : 6 607
    Points : 13 125
    Points
    13 125

    Par défaut

    Citation Envoyé par mermich Voir le message
    De plus, on a vite fait d'essayer de modifier une liste directement avec des .add, même si la propriété est en readonly:
    .
    La logique dans ce cas veut qu'on expose des ReadOnlyCollection (méthode "AsReadOnly"), ou éventuellement des listes en readonly (obtenue par héritage de List<T> et overwrite des méthodes "Add" pour lever une exception).

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : février 2004
    Messages : 19 560
    Points : 40 131
    Points
    40 131

    Par défaut

    Citation Envoyé par Bluedeep Voir le message
    ou éventuellement des listes en readonly (obtenue par héritage de List<T> et overwrite des méthodes "Add" pour lever une exception).
    Sauf que les méthodes de List<T> ne sont pas virtuelles
    Mais de toutes façons ReadOnlyCollection<T> fait déjà à peu près ça : elle implémente IList<T> mais les méthodes qui modifient la liste déclenchent une exception.

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

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : janvier 2007
    Messages : 6 607
    Points : 13 125
    Points
    13 125

    Par défaut

    Citation Envoyé par tomlev Voir le message
    Sauf que les méthodes de List<T> ne sont pas virtuelles
    Damned ....

Discussions similaires

  1. [POSTGRESQL] exec function
    Par peuh dans le forum Requêtes
    Réponses: 5
    Dernier message: 23/05/2003, 15h15
  2. Réponses: 8
    Dernier message: 11/04/2003, 17h41
  3. A propos des 'File management Functions' de Windows
    Par znaidi dans le forum Windows
    Réponses: 3
    Dernier message: 01/04/2003, 16h01
  4. [postgreSQL] équivalent de la function 'instr'
    Par Dra_Gun dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2003, 16h09
  5. [Dev c++ 4] implicite declaration of function "int kbhi
    Par Torpedox dans le forum Dev-C++
    Réponses: 5
    Dernier message: 01/01/2003, 13h37

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