63Close65
ZephOn the 2016-05-23 at 10:40pm
Folco (./63) :
Autant les bouquins de C++ que j'ai insistent lourdement sur le constructeur de copie et l'opérateur d'affectation, autant j'ai rien vu passer là-dessus en C#.
C'est normal, l'intérêt d'un langage avec garbage collector c'est de ne pas recopier les objets et laisser le GC s'occuper de leur gestion à ta place. Copier des objets est assez (très) rare normalement, mais si tu en as vraiment besoin je pense avoir vu plus souvent des méthodes "Clone()" que des constructeurs par copie.
Folco (./63) :
Ca veut dire qu'on ne peut pas avoir d'objet local ??
Non, en effet. Un objet sera toujours* alloué sur le tas, et un type valeur toujours sur la pile.
Folco (./63) :
Dois-je comprendre que le MonObjet a = b; dont je parle dans le premier quote ne crée alors qu'une référence a, référençant le même objet que b, et ne créant pas de nouvelle instance de l'objet ?
Exactement, et normalement c'est ce dont tu devrais avoir besoin 99% du temps. Copier un objet est coûteux**, et à partir du moment où tu paies le prix d'un garbage collector autant l'utiliser à fond et en profiter pour limiter les recopies d'objets.
Folco (./63) :
edit -> si on peut écrire string s = "abcde";, c'est qu'on peut déclarer un objet en local... Du coup, que signifie exactement le = dans cette expression ? A gauche, j'ai une référence typée, à droite j'ai un argument de constructeur d'objet...
Tu peux voir ton expression comme un raccourci d'écriture pour string s = new string("abcde");, et ta string (qui est un type référence) se retrouve bien sur le tas.

* : c'est presque vrai, à une exception près.
** : d'ailleurs MSDN recommande d'utiliser des value types (struct) pour les types simples sans héritage avec 4 champs ou moins (et si possible immutables) ; les types références (class) sont conseillés dans tous les autres cas.