Disons que vous avez ceci: (code boilerplate omis)Qu'arrive-t-il aux objets déclarés à l'intérieur d'une fonction et utilisés comme valeur de retour? Pourquoi ne sont-ils pas désaffectés sur le retour?
static Object foo()
{
Object test = new Object();
return test;
}
Object output = foo();
au moins en C#, le programme ne tombe pas en panne lorsque vous essayez d'utiliser la sortie même si elle pointe vers le même objet déclaré dans foo. Pourquoi n'a-t-il pas été immédiatement désaffecté? Et si c'est une mauvaise façon de gérer les valeurs de retour d'objet, y a-t-il une meilleure façon de le gérer?
"Pourquoi ne l'avez-vous pas immédiatement désaffecté?" Parce que le garbage collection, et nous passons des références. L'amour en C# n'a jamais à dire que vous avez terminé. –
"L'amour en C# n'a jamais à dire que vous avez terminé." - C'est profond @JeroenMostert: D Ken: En assignant la référence 'output' il y a une forte référence à l'objet créé dans la fonction. C'est pourquoi le GC ne le recueillera pas. Pourquoi serait-ce "un mauvais moyen de gérer les valeurs de retour d'objet"? Sinon, comment retourneriez-vous un type de référence? – Fildor
Retournez-vous, pourquoi * devrait * le programme plantage? N'est-ce pas clair ce que vous voulez faire ici? Souhaitez-vous que le programme se bloque parce que vous ne lui avez pas dit explicitement de faire une copie appropriée pour l'accès en dehors de la fonction? Aimeriez-vous savoir exactement ce qu'il y a sur la pile et ce qu'il y a sur le tas à chaque instant?Si vous avez dit «oui», vous pouvez avoir une carrière merveilleuse en tant que programmeur C - mais vous (surtout) n'avez pas besoin de porter ce bagage mental lorsque vous programmez C#. –