[C#] Différence entre une structure et une classe ?

Différence entre une structure et une classe ? [C#] - C#/.NET managed - Programmation

Marsh Posté le 14-01-2004 à 10:53:08    

Salut
 
J'aimerai connaître les différences entre une structure et une classe.
Par exemple je suis en train de coder un ray-tracer. Et jusqu'ici j'utilisais une classe pour définir mes pixels. On m'a fait remarqué qu'une structure serait peut-etre plus adaptée...
Au niveaux des performances, ca donne quoi ?
 
Merci


Message édité par Imhotep le 14-01-2004 à 10:55:03

---------------
Qui avale une noix de coco fait confiance à son anus...
Reply

Marsh Posté le 14-01-2004 à 10:53:08   

Reply

Marsh Posté le 14-01-2004 à 15:05:26    

les perfomances, c'est pas vraiment le problème. Seulement les classes c'est de la POO, et ça n'a rien à voir.
 
Si c'est pour un petit problème, fait une structure, c'est plus simple à gérer.

Reply

Marsh Posté le 14-01-2004 à 19:35:51    

JagStang a écrit :

les perfomances, c'est pas vraiment le problème. Seulement les classes c'est de la POO, et ça n'a rien à voir.  


Ben j'ai pu voir qu'avec les structures en C#, on pouvait faire des méthodes et même des constructeurs...  
De plus avec Purify, j'ai pus voir que la mémoire n'est pas du tout gérer de la même manière avec une structure.
 
J'ai pus lire que les structures étaient stockées sur la pile et les classes sur le tas. Maintenant ce que cela change, j'en sais rien...


---------------
Qui avale une noix de coco fait confiance à son anus...
Reply

Marsh Posté le 14-01-2004 à 23:13:54    

c'est quoi cette histoire de structure avec constructeurs et méthodes... Sais-tu vraiment de quoi tu parles ?`
 
si tu as besoin de méthodes, utilise des classes et c'est tout.

Reply

Marsh Posté le 14-01-2004 à 23:30:14    

si si les struct ont un constructeur et des methodes.
 
La différence avec les classes est qu'ils sont systematiquement passés par valeur ce qui les reserve aux objets lightweight.
 
Donc pour la question d'origine la réponse est "ça dépend" bien évidemment..
 
LeGreg

Reply

Marsh Posté le 14-01-2004 à 23:54:03    

jagstang a écrit :

c'est quoi cette histoire de structure avec constructeurs et méthodes... Sais-tu vraiment de quoi tu parles ?`


 
Oui oui... En C# les structures peuvent avoir des méthodes et des constructeurs.
http://www.c-sharpcorner.com/Langu [...] nCSRVS.asp
 
LeGreg > ok


---------------
Qui avale une noix de coco fait confiance à son anus...
Reply

Marsh Posté le 15-01-2004 à 12:59:04    

c'est bien n'importe quoi ce C#.  
 
J'ai bossé 4 mois dessus et je peux t'assurer que j'ai vu personne utiliser ça...

Reply

Marsh Posté le 15-01-2004 à 13:24:56    

jagstang a écrit :

c'est bien n'importe quoi ce C#.  
 
J'ai bossé 4 mois dessus et je peux t'assurer que j'ai vu personne utiliser ça...


c'est pas parce que les structures en C# sont sensiblement identiques aux classes que le langage est bidon :sarcastic:
 
une discussion ici sur l'utilité/inutilité des structures en C#
 
http://groups.google.fr/groups?hl= [...] 583&rnum=1
 
on retiendra ceci :

Citation :


Think about how the built-in types work in
Java.  Then think about why Java has defined
class wrappers for each (or most of) those
built-in types.  Think about how much fun it
is in Java to pass built-in types as in/out
parameters, to get them modified by calling
a function.  Now imagine that you can simply
pass them by reference.  Suddenly, they are
a lot more useful.  Once they are so useful,
you really wish there was not a hard barrier
between what you can do with built-in types
and types you get to define.  Now imagine
lifting that barrier.  You get to define
types that behave like the built-in types,
but which are composed from other types.
What you have is essentially a C# struct.
 
The struct is useful for its performance
characteristics, sometimes.  Imagine doing
a complex arithmetic package in Java.  If
it was used in a numerically intensive
application, the object allocation system
would get quite a workout.  But if your
complex type could just act like Java's
double, the application would get to
spend most of its time doing arithmetic
and result/operand movement rather than
creating and cleaning up objects.  Again,
the C# struct can be a good solution.


Message édité par Harkonnen le 15-01-2004 à 13:26:07

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-01-2004 à 13:44:17    

je reste sceptique. y'a-t'il d'autres langages qui permettent ça ?


Message édité par jagstang le 15-01-2004 à 13:44:53
Reply

Marsh Posté le 15-01-2004 à 13:50:07    

jagstang a écrit :

je reste sceptique. y'a-t'il d'autres langages qui permettent ça ?

C++ ne fait aucune différence en sémantique dynamique entre class et struct.
 
Statiquement, comme différence, j'ai trouvé que la visibilité par défaut des membres (public pour struct et private pour class).
 
Par contre, j'ai peut-être raté des trucs, cette spec est unbuvable.
http://www.kuzbass.ru:8086/docs/is [...] ass.friend


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 15-01-2004 à 13:50:07   

Reply

Marsh Posté le 15-01-2004 à 18:57:41    

La différence entre le C++ et le C#
c'est que dans le C++, le passage par valeur/reference est déterminée localement (appel de fonction, allocation sur le tas et passage de pointeurs/references etc..).
Alors que dans C#, c'est déterminé par le type utilisé (value type et reference type).
 
Si tu décides de faire une struct contenant un simple float alors ça a un sens de le passer par valeur tout le temps. Le probleme de le passer par valeur c'est évidemment qu'il ne peut pas etre étendu (idem en C++ quand tu passes un objet par valeur tu perds tout propriétés des classes qui en dérive). Une struct est donc scellée par défaut (sealed).
 
LeGreg

Reply

Marsh Posté le 19-01-2004 à 01:09:10    

LeGreg a dit l'essentiel. Juste qques precisions tirees de The C# Programming language (Hejlsberg, Wiltamuth, Golde/Addison Wesley -- 33? pour le bouquin de 600 pages a couverture epaisse dans les bonnes librairies)  
En C# un type classe et un type struct ont un certain nombre de differences importantes
 
La principale difference entre classe et struct en C# est la methode d'allocation:
Quand on declare une variable de type struct, la memoire necessaire afin de contenir les valeurs de ses membres est directement allouée. Quand on declare une variable de type classe, ce qu est alloué est une reference a un objet alloué dynamiquement.
 
Autres differences:
* L'affectation a une variable de type struct cree une copie de la valeur affectée.
* La valeur par defaut d'un struct est obtenue en mettant  tous ses membres de type "value type" a leur valeur par defaut, et ses membres de type "reference type" a null.
* Les operations de boxing et unboxing entre un type struct et un object sont authorisees
* this a un sens different pour un truct et une classe
* Un type struct ne peut declarer de constructeur sans parametres
* Un type struct ne peut declarer de destructeur.
 
 
D'autre part, la declaration d'un type struct peut specifier une liste d'interfaces implementées, mais ne peut specifier de classe de base dont elle heriterait (implicitement, un type struct herite de la classe System.ValueType qui elle meme herite de object).
Un type struct ne peut etre abstrait, et est toujours implicitement scellé (on dirait final en java), c'est a dire qu'on ne peut employer les qualificateurs abstract et sealed dans sa declaration.
Comme l'heritage n'est pas supporte, l'accessibilite des membres d'un struct ne peut etre declaree comme protected ou protected internal.
Les fonctions membres d'un type struct ne peuvent etre declarees comme abstract ou virtual, et le modificateur override n'est authorise que pour les methodes (implicitement) derivant de System.ValueType .
 
Note: En C#, les types simples int, double et bool sont de type struct.
 
A+,


Message édité par gilou le 19-01-2004 à 01:18:19

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-01-2004 à 01:37:32    

merci  :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed