comme décrire ce Article , sur l'utilisation de l'utilisation sur Idisposable Objets, il dit un des mots intéressants: p>
... Utilisation du bloc, la méthode de jet est automatiquement appelée un jour après la fin du bloc. (Ce n'est peut-être pas immédiat; cela dépend du CLR.) P>
Intéressant ici est " il peut ne pas être immédiat; cela dépend du CLR fort>".
Quelqu'un peut-il offrir plus de détails à ce sujet? Parce que nous avons des situations étranges où il semble que sur le code à l'aide de (nouveau myDisposable ()) {... ...}, après la fin du bloc}, il fait pas fort> appelle immédiatement à disposer de la méthode sur une instance mydisposable, mais certaines Temps plus tard. P>
Mise à jour: Conclusion Pour moi, il me semble que j'ai un problème ailleurs. Je pense que cela dispose que la méthode peut être appelée plusieurs fois plus tard après avoir utilisé des fins de bloc. Mais quand ce n'est pas comme ça, que je ne dois trouver un problème ailleurs dans mon code.
Merci pour les réponses! P>
5 Réponses :
SomeDisposableResource resource = new SomeDisposableResource(); try { // TODO: use the resource } finally { if (resource != null) { ((IDisposable)resource).Dispose(); } }
Cool, je ne savais pas que - étant donné que l'affiche pouvait définir un point d'arrêt dans sa méthode de disposition et une autre sur la ligne après la fin de l'utilisation du bloc d'utilisation, et ne devrait pas avoir de doutes, c'est ce que vous impliquez?
Notez que ressource code> ici est considéré comme une lecture seule à l'intérieur de l'utilisation de la construction. Le test NULL à l'intérieur du bloc
enfin code> est lancé si l'expression qui produit l'objet, le
= nouveau Somedisposableresource () code> Dans cet exemple, appelle une méthode pouvant renvoyer NULL. Il y a aussi des détails sur les structures qui ne sont pas importantes pour cette affaire. En bref, l'appel à
Dispose code> se produit dans le cadre du
} code> de l'utilisation de la construction.
Oui, qu'est-ce que je voulais dire était ... Si vous sortez l'original } code> et remplacez-le avec la partie enfin de votre réponse, vous pouvez y penser comme "faisant partie du
} code> ". C'est un modèle mental de la manière dont le code C # est exécuté, mais oui, je sais, il n'y a pas d'accolades dans l'IL :)
étrange ... très étrange ...
L'article est probablement faux. L'instruction Utilisation est compilée public void Log(string message)
{
using(StreamWriter sw = new StreamWriter(File.Append(path)))
{
sw.WriteLine(message);
}
}
public static void Main()
{
Log("Hello");
Log("World");
}
Utilisation d'un chèque NULL avant d'appeler, c'est pourquoi cette construction est également utile pour disposer des objets créés précédemment, sinon NULL: à l'aide de (x) {} code> - Beats à écrire
si ( x! = null) x.dispose (); code> partout, mais pas tout aussi clair.
Oui j'ai oublié. En fait, il devrait même se lancer à Idisposable, sinon le code ne fonctionnera pas avec des classes qui implémentent explicitement idiotposable comme le flux, mais c'est toujours le sens;)
Il ne se mit pas toujours à Idisposable cependant, regardez l'IL pour en utilisant code> sur une structure mise en œuvre Idisposable avec le dispositif d'élimination étant une méthode publique de la structure.
Je ne sais pas d'où cela vient de cela et contradictent tout ce que j'ai vu sur le est Mise en œuvre comme ceci: p> donc, la méthode La personne qui rédige l'article peut l'avoir confondu avec la manière dont un objet sera détesté recueilli un peu de temps après que cela ne soit plus utilisé, ni à quel point les objets jetables qui ne sont pas disposés ont leur finisseur appelé par un fil de fond. p> p> à l'aide de la relève code>, par exemple cet article qui dit qu'un
en utilisant un bloc code> comme ceci:
Dispose code> sera appelée avant la prochaine instruction suivante suivant le bloc code> en utilisant le bloc code>. P>
Je suis un peu sceptique de cette déclaration et je pense qu'ils signifiaient autre chose (peut-être la collecte des ordures). Une instruction utilisant uniquement le sucre syntaxique pour un essai / enfin bloquer lorsque les appels enfin en bloc disposent. Compte tenu de ce c #: l'IL ressemble à ceci: p> avis sur la dernière ligne C'est juste un ..try. Ceci est également indiqué dans l'utilisation de l'utilisateur em> de la spécification C #. p> p>
La théorie rencontre des faits en utilisant (pas de poêle prévu) .NET 5 et XUnit.
tandis que l'essai..Catch..Catch dispose l'objet avant l'affirmation finale, l'utilisation du bloc ne le fait pas. P> < Pré> xxx pré> p>
Je ne sais pas, mais cet article est suspect en considérant qu'il est faux de savoir ce que l'utilisation de bloc 'exactement' compile. Ils n'incluent même pas l'essai / enfin bloc. J'ai arrêté de lire à ce moment-là.
Le dispositif est appelé immédiatement lors de la sortie de la portée d'un bloc d'utilisation, ce sont les finaliseurs qui sont appelés beaucoup plus tard, le cas échéant. L'article est tout simplement faux sur ce point. Ref: msdn.microsoft.com/en-us/library/yh598w02.aspx < / a>
L'auteur de cette page Web est assez i> désemparé de ce qui se passe vraiment. Citation: "Dispose, finaliser et les destructeurs sont tous liés, mais cela dépasse notre champ de discussion ici". Oui, c'est la partie qu'il n'a pas eu.
Malheureusement, tout le monde peut poster un dribble incorrect sur ces interwebs de la nôtre. Vous devez être un peu plus critique de toute source d'information unique.
Je suis critique à propos de cet article, c'est pourquoi j'ai écrit une question ici. Mon problème est que je pense que une telle exécution retardée de disposer était dans mon cas. Mais avec ces réponses de votre part, il semble que j'ai un problème quelque part ailleurs.
Le point de l'article n'était pas tant le "quand" de disposer () être appelé, mais plus sur la relation entre Idisposable vs. Utilisation (...). Je l'ai mis à jour pour faire référence à la documentation MSDN. Le point de bloguer est d'apprendre autant qu'il est d'enseigner :)
@ Ashes999, c'est OK, je veux juste savoir où est la vérité. Merci à tous pour une explication.