4 votes

C#7 ref return : qu'est-ce qui reste en mémoire : l'instance de la classe ou la propriété ref return ?

public ref int GetData()
{
    var myDataStructure = new MyDataStructure();
    return ref myDataStructure.Data;
}

public class MyDataStructure
{
    private int _data;
    public ref int Data => ref _data;
}

Cette opération utilise la nouvelle fonction de retour de réf. de C#7. Après le retour de GetData(), qu'est-ce qui est conservé en mémoire ? L'instance complète de MyDataStructure ? Ou seulement le nombre entier ?

Si l'instance de MyDataStructure est conservée en mémoire, parce que quelqu'un détient une référence à un champ de cette instance, pourquoi ne peut-elle pas s être gardé en mémoire dans cet exemple :

public ref string GetString()
{
    string s = "a";
    return ref s; 
}

4voto

Jon Hanna Points 40291

Après le retour de GetData(), qu'est-ce qui est conservé en mémoire ? L'instance complète de MyDataStructure ? Ou seulement le nombre entier ?

En MyDataStructure est. Il existe sur le tas et vous avez une référence à un champ à l'intérieur de celui-ci.

pourquoi ne pas s être gardé en mémoire dans cet exemple

Parce que tant que la chaîne sur le tas vers laquelle il pointe existe sur le tas, s lui-même est un local qui n'est pas sur le tas. En tant que local, il n'existe plus après la fin de la méthode.

2voto

Paulo Morgado Points 1015

Parce que s est sur la pile, le treuil est perdu lorsque l'exécution de la méthode se termine.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X