C# - this est-il une référence ou une valeur ?
Voici une curiosité de C#. Nous nous attendons à ce que this, dans un objet de type référence soit une référence. Et qu’il soit éventuellement une valeur dans un objet de type valeur.
Eh bien, c’est juste le contraire !
Un peu d’histoire : à l’intérieure d’une méthode de classe, this représente l’instance courante de cette classe:
public class MyClass {
int i;
public void MyFunc(){
this.i = 2;
}
}
Mais si this représente une instance, c’est forcément qu’il s’agit d’une référence ? Non. Exceptionnellement, this réfère bien à un objet mais le compilateur considère cette variable comme étant une valeur. Il est donc impossible de faire :
this = unAutreObjetDuMemeType;
Curieux mais acceptable. Cependant, ça devient particulièrement intéressant du coté des types valeurs. this est alors … une référence ! Par exemple :
public struct MyStruct{ public void MyFunc( bool reset ){ if ( reset ){ this = new MyStruct(); this.i = 0; } } } (...) MyStruct myStruct; myStruct.i = 1; myStruct.MyFunc( true ); // Ici, myStruct.i == 0.... Quid de ceci ?Réfléchissons. Soit un objet de type valeur nommé V et un objet de type référence nommé R. L’objet V est alloué sur la pile et l’objet R dans le heap (pour ce dernier, la pile ne contient que l’adresse de l’espace mémoire alloué à R sur le heap).
Qu’arriverait-t-il si nous pouvions redéfinir this à l’intérieur de R ? Notre pointeur placé sur la pile pointerait toujours sur l’ancien objet et le nouvel objet ne pourrait jamais être récupéré… Les concepteurs de C# furent donc bien avisés en ne permettant pas cette opération.
Et qu’arrive-t-il lorsque nous redéfinissons V ? Un nouvel objet est créé au même endroit sur la pile, de sorte que notre variable V pointe (oui, même s’il s’agit d’un type valeur, c’est tout de même un pointeur) instantanément sur le nouvel objet.
Il s’agit donc d’un traitement exceptionnel, mais logique.
Plus d’info sur jaggersoft. Su c-sharpcorner, un superbe article montrant le fonctionnement de la pile et du heap (nombreux graphiques à l’appui !).