Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 11 sur 11
  1. #1
    Rédacteur/Modérateur
    Avatar de jpcheck
    Homme Profil pro Jean-Philippe ANDRÉ
    Consultant technique et formateur freelance
    Inscrit en
    juillet 2007
    Messages
    9 191
    Détails du profil
    Informations personnelles :
    Nom : Homme Jean-Philippe ANDRÉ
    Âge : 30
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : juillet 2007
    Messages : 9 191
    Points : 18 069
    Points
    18 069

    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 chevronné
    Homme Profil pro Etienne Mermillod
    Inscrit en
    février 2007
    Messages
    459
    Détails du profil
    Informations personnelles :
    Nom : Homme Etienne Mermillod
    Âge : 30

    Informations forums :
    Inscription : février 2007
    Messages : 459
    Points : 667
    Points
    667

    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 Thomas Levesque
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 289
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Levesque
    Â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 289
    Points : 39 070
    Points
    39 070

    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 Jean-Philippe ANDRÉ
    Consultant technique et formateur freelance
    Inscrit en
    juillet 2007
    Messages
    9 191
    Détails du profil
    Informations personnelles :
    Nom : Homme Jean-Philippe ANDRÉ
    Âge : 30
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : juillet 2007
    Messages : 9 191
    Points : 18 069
    Points
    18 069

    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 François
    Chef de projet NTIC
    Inscrit en
    janvier 2007
    Messages
    6 608
    Détails du profil
    Informations personnelles :
    Nom : Homme François
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : janvier 2007
    Messages : 6 608
    Points : 13 112
    Points
    13 112

    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 chevronné
    Homme Profil pro Etienne Mermillod
    Inscrit en
    février 2007
    Messages
    459
    Détails du profil
    Informations personnelles :
    Nom : Homme Etienne Mermillod
    Âge : 30

    Informations forums :
    Inscription : février 2007
    Messages : 459
    Points : 667
    Points
    667

    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 :
    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 :
    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# :
    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 François
    Chef de projet NTIC
    Inscrit en
    janvier 2007
    Messages
    6 608
    Détails du profil
    Informations personnelles :
    Nom : Homme François
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : janvier 2007
    Messages : 6 608
    Points : 13 112
    Points
    13 112

    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 Thomas Levesque
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 289
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Levesque
    Â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 289
    Points : 39 070
    Points
    39 070

    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 François
    Chef de projet NTIC
    Inscrit en
    janvier 2007
    Messages
    6 608
    Détails du profil
    Informations personnelles :
    Nom : Homme François
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : janvier 2007
    Messages : 6 608
    Points : 13 112
    Points
    13 112

    Par défaut

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •