En tant que développeur java .NET je voudrais comprendre l'interface IDisposable. Quelqu'un pourrait s'il vous plaît essayer d'expliquer cela et comment il diffère de ce qui se passe en Java? Merci.
L'idée de base ici est que, parfois, vous avez besoin déterministe disposition de ressources. IDisposable prévoit que mécanisme.
Par exemple, disons que vous avez un champ dans une Fenêtre. Lorsque cela est créé, il crée un handle windows (HWND) en interne. Lorsque vous retirez le contrôle de la Fenêtre, et il n'est plus utilisé, le contrôle devient admissible à la collecte des ordures ménagères - mais il ne recueillies tout de suite. En fait, il n'y a pas de garantie quant à combien de temps il sera avant la collecte.
Jusqu'à ce que le GC s'exécute et les processus orphelins de contrôle, il sera toujours l'utilisation des ressources, puisqu'il est encore maintenant le HWND.
IDisposable fournit un moyen pour les objets qui contiennent du code qui a besoin de nettoyage séparé de la GC est explicitement être nettoyé par l'utilisateur de l'objet. Dans le contrôle de cas, nous pouvons faire appel myControl.Dispose(), immédiatement, de façon synchrone de nettoyage de la "native" des ressources (HWND) utilisé par le contrôle.
Petite question - comment pouvez-vous dire si une ressource n'est pas géré et doit être explicitement disposé? Voir si elle met en œuvre IDisposable. 🙂 Est à peu près toujours de céder votre IDisposables, si vous le pouvez. Si la ressource n'est pas géré, vous devez juste savoir quand vous implémentez la classe. Si vous n'êtes pas de la mettre en œuvre, mais juste de l'aide, alors pas de soins particuliers requis. Si vous avez besoin de décider de l'explicite à l'élimination, puis essayez de répondre à la question "Est libérer la ressource de l'ASAP est plus critique que la poursuite de l'exécution dans ce fil maintenant". Les réponses peuvent être différentes, par exemple pour la partie du service web vs partie de l'interface graphique.
Les objets utilisé ici doit mettre en œuvre AutoCloseable interface. Il n'est pas exactement la même que IDisposable, mais le close() est appelée automatiquement à la fin. Cela donne l'occasion de mettre en œuvre un comportement similaire.
Lire plus à ce sujet dans java tutoriel. Le samplecode est à venir à partir de là.
Cela devrait absolument être accepté de répondre. Pas seulement explique comment les jetables concept fonctionne, mais montre comment cela est mis en œuvre sur l'île de Java. Toutes les autres réponses juste reportez-vous à c# mécanisme. AutoCloseable pas AutoClosable
Il y a des situations où vous avez besoin d'évacuation pour les ressources détenues par votre classe. E. g., connexion ouverte doit être fermée au bon moment, pas lors de la GC décide de recouvrer la mémoire. Dans .Méthode NETTE Dispose est utilisé par convention pour cela. Il peut être appelé dans try ... finally bloc, par exemple:
Parce que ce modèle est si largement utilisé, il est un sucre syntaxique pour cela:
using(IConnection conn =OpenConnection()){}//Dispose is called at the end.
Que cette syntaxe est très concis, il est parfois utile de mettre en œuvre IDisposable sur des objets qui n'ont pas de ressources propres, mais ont besoin d'une certaine opération sera exécutée à la fin de son utilisation. E. g. considérons la classe
classTimeMeasure:IDisposable{publicvoidMeasure(string operation){...}//recourds operation timepublicvoidDispose(){...//print timings for all operations}}
Utilisation:
using(TimeMeasure m =newTimeMeasure()){DoFoo();
m.Measure("Foo");DoBar();
m.Measure("Bar");}//timings for 'Foo' and 'Bar' are printed here
En Java plus ou moins l'équivalent de l'interface est Closeable. Mais il n'y a pas une syntaxe simple pour assurer ses appels.
Comment IDisposable devraient être mises en œuvre? C'est un peu délicat:
si vous avez des ressources propres, vous devez vous assurer qu'ils peuvent être libérés par les explicite Dispose appel ou par GC, mais pas par les deux. Donc, vous avez besoin d'un drapeau indiquant fait de l'élimination. Pour moins de la duplication de code, la disposition du code est déplacé à la méthode distincte.
Exemple:
bool disposed;publicvoidDispose(){Dispose(true);
GC.SuppressFinalize(this);//tell GC not to call Finalizer() for this object}~MyObject(){Dispose(false);}voidDispose(bool manualDisposing){if(!disposed){
disposed =true;if(manualDisposing)...//call Dispose on all IDisposable fields...//dispose all native resources}}
si vous ne possédez pas de ressources, comme dans le cas de TimeMeasure classe, pas besoin d'outil de finalisation, vous ne la logique nécessaire dans Dispose.
Fondamentalement IDisposable à un niveau élevé, combiné avec le using mot-clé est de vous donner syntaxique de ce que vous voyez est une commune de Java un langage comme ceci:
Connection c =null;try{
c = getConnection();....}finally{if(c !=null){
c.close();}}
Si Java a eu un aide de mot-clé et une interface IDisposable avec un close() méthode, il pourrait ressembler à ceci:
//psudo-Java
using(Connection c = getConnection()){.....}
Avec la méthode close implicitement appelé à la fin de ce bloc. Pas besoin de try/finally.
Cela étant dit, IDisposible est assez complexe contrat, et s'occupe principalement de la libérant de la mémoire non managée. Vous devez travailler dur avec Java d'avoir une mémoire non managée (essentiellement avec JNI et composants Swing, vous avez le concept), mais il est beaucoup plus commun .NET, donc il y a de la langue de support pour le concept.
J'ai écrit un série d'articles sur IDisposable.
L'idée de base ici est que, parfois, vous avez besoin déterministe disposition de ressources. IDisposable prévoit que mécanisme.
Par exemple, disons que vous avez un champ dans une Fenêtre. Lorsque cela est créé, il crée un handle windows (HWND) en interne. Lorsque vous retirez le contrôle de la Fenêtre, et il n'est plus utilisé, le contrôle devient admissible à la collecte des ordures ménagères - mais il ne recueillies tout de suite. En fait, il n'y a pas de garantie quant à combien de temps il sera avant la collecte.
Jusqu'à ce que le GC s'exécute et les processus orphelins de contrôle, il sera toujours l'utilisation des ressources, puisqu'il est encore maintenant le HWND.
IDisposable fournit un moyen pour les objets qui contiennent du code qui a besoin de nettoyage séparé de la GC est explicitement être nettoyé par l'utilisateur de l'objet. Dans le contrôle de cas, nous pouvons faire appel
myControl.Dispose(),
immédiatement, de façon synchrone de nettoyage de la "native" des ressources (HWND) utilisé par le contrôle.Voir si elle met en œuvre IDisposable. 🙂 Est à peu près toujours de céder votre IDisposables, si vous le pouvez.
Si la ressource n'est pas géré, vous devez juste savoir quand vous implémentez la classe. Si vous n'êtes pas de la mettre en œuvre, mais juste de l'aide, alors pas de soins particuliers requis. Si vous avez besoin de décider de l'explicite à l'élimination, puis essayez de répondre à la question "Est libérer la ressource de l'ASAP est plus critique que la poursuite de l'exécution dans ce fil maintenant". Les réponses peuvent être différentes, par exemple pour la partie du service web vs partie de l'interface graphique.
OriginalL'auteur Reed Copsey
Avec java 1.7, il est le nouveau introduit essayer-avec-déclaration de ressources.
Les objets utilisé ici doit mettre en œuvre AutoCloseable interface. Il n'est pas exactement la même que IDisposable, mais le
close()
est appelée automatiquement à la fin. Cela donne l'occasion de mettre en œuvre un comportement similaire.Le code ci-dessus est le même que
Lire plus à ce sujet dans java tutoriel. Le samplecode est à venir à partir de là.
AutoCloseable pas AutoClosable
OriginalL'auteur Christian13467
Il y a des situations où vous avez besoin d'évacuation pour les ressources détenues par votre classe. E. g., connexion ouverte doit être fermée au bon moment, pas lors de la GC décide de recouvrer la mémoire. Dans .Méthode NETTE
Dispose
est utilisé par convention pour cela. Il peut être appelé danstry ... finally
bloc, par exemple:Parce que ce modèle est si largement utilisé, il est un sucre syntaxique pour cela:
Que cette syntaxe est très concis, il est parfois utile de mettre en œuvre
IDisposable
sur des objets qui n'ont pas de ressources propres, mais ont besoin d'une certaine opération sera exécutée à la fin de son utilisation. E. g. considérons la classeUtilisation:
En Java plus ou moins l'équivalent de l'interface est
Closeable
. Mais il n'y a pas une syntaxe simple pour assurer ses appels.Comment
IDisposable
devraient être mises en œuvre? C'est un peu délicat:Dispose
appel ou par GC, mais pas par les deux. Donc, vous avez besoin d'un drapeau indiquant fait de l'élimination. Pour moins de la duplication de code, la disposition du code est déplacé à la méthode distincte.Exemple:
TimeMeasure
classe, pas besoin d'outil de finalisation, vous ne la logique nécessaire dansDispose
.OriginalL'auteur elder_george
Fondamentalement IDisposable à un niveau élevé, combiné avec le
using
mot-clé est de vous donner syntaxique de ce que vous voyez est une commune de Java un langage comme ceci:Si Java a eu un aide de mot-clé et une interface IDisposable avec un
close()
méthode, il pourrait ressembler à ceci:Avec la méthode close implicitement appelé à la fin de ce bloc. Pas besoin de try/finally.
Cela étant dit, IDisposible est assez complexe contrat, et s'occupe principalement de la libérant de la mémoire non managée. Vous devez travailler dur avec Java d'avoir une mémoire non managée (essentiellement avec JNI et composants Swing, vous avez le concept), mais il est beaucoup plus commun .NET, donc il y a de la langue de support pour le concept.
OriginalL'auteur Yishai
Interface IDisposable est utilisée pour libérer les ressources non gérées manuellement.
OriginalL'auteur Rajan Kumar Kharel
Il n'y a pas d'équivalent.
Il est utilisé lorsque vous utilisez les ressources non managées ( en Java, toutes les ressources de la zone gérée ).
.net mémoire allouée par la gestion des ressources recueillies automatiquement par le GC ( comme en Java ) .
Vous avez en outre la possibilité d'utiliser les ressources non managées, où vous serez responsable de l'allocation de mémoire et sa libération.
Vous appelez cette méthode lorsque vous n'avez pas besoin de ressources plus.
OriginalL'auteur OscarRyz