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 :

[1.1] Quelle est la différence entre un Type et une Classe ?


Sujet :

C#

  1. #1
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut [1.1] Quelle est la différence entre un Type et une Classe ?
    .NET 1.1

    Bonjour,
    j'aimerais savoir ce qui différencie un TYPE d'une CLASSE sous .NET si tout est considéré comme Objet ?
    Est-ce la localisation de l'allocation mémoire ( Pile ou tas ) ?
    Existe-t-il une régle qui détermine si l'allocation se fait sur la pile ou sur le tas ou est-ce le contexte d'utilisation ?

    Merci

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    un type, c'est int, booleen, string, etc....

    une classe, c'est un "type" personnalisé (si l'on peut dire )

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par Morpheus
    une classe, c'est un "type" personnalisé (si l'on peut dire :) )
    On peut aussi dire que "type" regroupe tout, que "classe" est un type référence -> stocké sur le tas, et que "structure" est un type valeur -> stocké sur la pile :)

  4. #4
    Membre éclairé
    Avatar de Emerica
    Profil pro
    Consultant
    Inscrit en
    Juillet 2003
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2003
    Messages : 190
    Points : 724
    Points
    724
    Par défaut
    Dur dur de trouver une différence concrète...

    Un type est un objet, mais une instance de classe est un objet, et non la classe elle-même. L'allocation mémoire varie, comme l'a dit Maniak, selon si c'est un type de référence ou un type de valeur. Les types de valeur comme Boolean, Int32, Double (etc...) sont stockés sur la pile tandis que les types références comme Object, StreamReader ou HttpChannel sont stockés sur le tas managé (managed heap). Seule une référence vers la zone mémoire ou l'objet est stocké est mise sur la pile.

    Cette image est assez parlante :


    Considère que chaque rectangle du schéma est un type, avec Object comme type de base commun.

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Emerica
    Cette image est assez parlante :
    merci.
    ça calme les méninges

    Si j'ai bien compris le type ( value ou reference ) est figé tout au long de la vie d'une instance ?

    Par contre si j'ai un struct de taille importante disons 100Ko dans ce cas le CLR/Gestionnaire mémoire utilise-t-il toujours la pile ou cela peut varier ?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par Laurent Dardenne
    Si j'ai bien compris le type ( value ou reference ) est figé tout au long de la vie d'une instance ?
    Yup.

    Citation Envoyé par Laurent Dardenne
    Par contre si j'ai un struct de taille importante disons 100Ko dans ce cas le CLR/Gestionnaire mémoire utilise-t-il toujours la pile ou cela peut varier ?
    struct -> pile. Et copie intégrale de son contenu à chaque fois qu'elle doit être passée en paramètre. Donc, les structures de grande taille sont à éviter, pour peu qu'elles aient besoin d'être passée à ne serait-ce qu'une seule méthode :)

  7. #7
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par Maniak
    ... Donc, les structures de grande taille sont à éviter, pour peu qu'elles aient besoin d'être passée à ne serait-ce qu'une seule méthode
    sauf si elles sont passées à ta méthode par reference et non par valeur (mot clé ref) (je complique encore tout moi)

  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Merci pour vos réponses, remerciements tardifs mais dû à un petit pb de notification je pense.

    Citation Envoyé par abelman
    sauf si elles sont passées à ta méthode par reference et non par valeur (mot clé ref) (je complique encore tout moi)
    Non pas du tout, au contraire.

    Dans le cas où je passe un type value par référence, est-ce qu'il y a une opération de boxing/unboxing en entrée de procédure ?

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par Laurent Dardenne
    Dans le cas où je passe un type value par référence, est-ce qu'il y a une opération de boxing/unboxing en entrée de procédure ?
    D'après tout ce que j'ai vu jusque là, non.

    Mais il reste qu'utiliser ref et out doit être limité aux cas où il n'y a *vraiment* pas d'autres solutions. Et en général il y en a d'autres.

  10. #10
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Maniak
    Citation Envoyé par Laurent Dardenne
    Mais il reste qu'utiliser ref et out doit être limité aux cas où il n'y a *vraiment* pas d'autres solutions. Et en général il y en a d'autres.
    D'accord, mais je dois que ta derniére phrase a piquée ma curiosité :
    Citation Envoyé par Maniak
    Et en général il y en a d'autres.
    ...

    Mais pour l'instant et pour terminer sur ce point, dans le cas où j'ai une classe C déclarant un membre A de type struct, la construction suivante C.A est elle un type value ou un type référence ?

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par Laurent Dardenne
    D'accord, mais je dois que ta derniére phrase a piquée ma curiosité
    C'est une question de design là, ça dépend du code.

    Par exemple un cas fréquent où on a tendance à vouloir passer des paramètres via ref, c'est si on a une méthode qui 'renvoit' plusieurs paramètres. Ça, ça se règle souvent en ajoutant une classe qui fait l'intermédiaire.

    Si on passe une structure et qu'on veut que son contenu soit modifié en retour, on peut plutôt faire en sorte que la méthode renvoit une version modifiée de l'objet, plutôt que de passer par ref. Ou se demander si une structure est vraiment appropriée et s'il ne serait pas mieux d'en faire une classe.

    C'est du cas par cas, mais de manière générale, ref et out obscurcissent le sens du code. Et c'est pas une bonne chose :)
    (un cas où on n'a pas le choix, c'est pour le code qui appelle des composants COM. là, ref et out courent les rues)

    Citation Envoyé par Laurent Dardenne
    Mais pour l'instant et pour terminer sur ce point, dans le cas où j'ai une classe C déclarant un membre A de type struct, la construction suivante C.A est elle un type value ou un type référence ?
    Le "chemin d'accès" à un objet n'a aucune importance. C'est une structure, donc type valeur.

    La distinction est vraiment basique :
    structure -> valeur
    classe -> référence

    Y a pas à chercher plus loin pour ça.

  12. #12
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Merci pour tes explications
    Citation Envoyé par Maniak
    Y a pas à chercher plus loin pour ça.
    Je le pense aussi, je tourne la page

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 01/06/2010, 16h57
  2. quelle est la différence entre un type défini et prédéfini
    Par 159753 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 19/03/2009, 14h47
  3. Réponses: 2
    Dernier message: 25/05/2005, 21h34
  4. Réponses: 5
    Dernier message: 03/05/2005, 18h22
  5. Quelle est la différence entre le float et le real ?
    Par Manson dans le forum Débuter
    Réponses: 3
    Dernier message: 10/08/2004, 17h26

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