2009-05-07 9 views
2

J'ai une fonction en C# 2.0 appelée Foo(), qui retourne une valeur du type boolean. J'instancie un objet dans la fonction que je ne détruis pas avant de retourner la valeur booléenne. Je veux savoir s'il est nécessaire de détruire les objets créés avant de renvoyer la valeur?Retour d'une fonction sans détruire d'objets

merci.

+1

regardez toutes les bonnes réponses et 0 remises. Pourquoi si avare? –

Répondre

5

Non, ce n'est pas. Si la méthode Foo crée les types de valeur, ils sont situés sur la pile et sont ainsi nettoyés lorsque la pile est déroulée. Si vous créez les types de référence, votre référence à ces instances sera hors de portée à mesure que la méthode se termine et que les instances seront donc mises en place pour la récupération de place.

+0

Merci pour l'explication! – pradeeptp

+0

S'il est vrai qu'en général il n'est pas nécessaire de détruire explicitement les objets créés par Foo, ils ne sont PAS alloués sur la pile! Dans la plupart des langages gérés, il existe une pile dégénérée utilisée pour le suivi des appels de fonction, et tous les objets sont alloués sur le tas géré. –

+0

@Tal: Avez-vous lu ma réponse ?! La première phrase est "non c'est pas" comme dans "non il n'est pas nécessaire de détruire quoi que ce soit". Les types de valeur locaux * sont * situés sur la pile. Les objets ou les types de référence si vous le souhaitez sont toujours alloués sur le tas. –

1

no. à moins que l'objet en question met en œuvre IDisposable, dans ce cas, l'envelopper dans une déclaration à l'aide() {}

+0

Vous devez toujours implémenter IDisposable en considérant les deux possibilités: l'utilisateur disposera explicitement (ou implicitement dans un bloc d'utilisation) de l'objet et l'utilisateur ne disposera pas de l'objet. Dans la situation ultérieure, vous devez implémenter un destructeur qui finit par effectuer tout nettoyage requis. –

+2

@dribeas - vous avez la règle à l'envers. Si un objet a un destructeur, il doit également implémenter IDisposable. Mais si un objet implémente IDisposable, il est rarement nécessaire de lui donner un destructeur. par exemple. le compilateur crée des classes d'itérateur pour supporter IDisposable et pourtant ils n'ont pas de destructeur, une classe qui ne contient que des références à d'autres IDisposables devrait supporter IDisposable mais n'aura pas besoin d'un destructeur. Il n'est presque jamais nécessaire d'écrire un destructeur en C# aujourd'hui. SafeHandle est un meilleur outil pour gérer les ressources du système d'exploitation. –

0

En C#, tous les objets sont des ordures collectées automatiquement, et au fond il n'y a aucun moyen de désaffecter explicitement un objet, donc non, vous n'avez pas besoin de détruire manuellement des objets.

Si votre objet contient une ressource, vous voulez être sûr de libérer la ressource, mais vous n'avez pas besoin de (ne peut pas) détruire l'objet.

0

Il serait préférable si vous utilisez la méthode disposer en cas de i/o ou objets db. Sinon, lorsque vous essayez de modifier un fichier précédemment référencé et non publié, une exception peut se produire.

Vous pouvez également affecter une valeur nulle à l'objet pour supprimer la référence.

Questions connexes