Vous pouvez toujours lire dans la variable. Il n'y a pas de problème en termes d'affectation définie, ou vous obtiendrez une erreur de compilation. Par exemple, c'est bon:
using System;
using System.IO;
class Test
{
static void Main()
{
string x;
using (new MemoryStream())
{
x = "hello";
}
Console.WriteLine(x);
}
}
C'est tout à fait correct.
Maintenant, si SevenZipArchive
retourne un ReadOnlyCollection<string>
, je serais habituellement pense que pour être encore valide après l'archive elle-même est disposé. Cependant, ReadOnlyCollection<T>
est simplement un emballage autour d'une autre collection ... et si cette collection est invalidée en disposant de archive
, cela expliquerait certainement les choses. Malheureusement, la méthode suggérée par Joel pour copier la collection crée seulement un autre wrapper - qui demandera le premier wrapper pour le comptage, demandant à son tour la collection originale (invalidée).
est ici une approche qui devrait fonctionner:
private ReadOnlyCollection<string> ExtractRar(string varRarFileName,
string varDestinationDirectory) {
ReadOnlyCollection<string> collection;
using (var archive = new SevenZipArchive(varRarFileName)) {
collection = new ReadOnlyCollection<string>(archive.Volumes.ToList());
MessageBox.Show(collection.Count.ToString()); // output 10
}
MessageBox.Show(collection.Count.ToString()); // output 0
return collection;
}
Notez l'appel supplémentaire à ToList()
. Cela va forcer la collection à être copiée sur un List<string>
d'abord ... vraiment copié, pas seulement en créant un wrapper.
Bien sûr, si vous ne me dérange pas vraiment si la méthode retourne une liste, vous pouvez simplement utiliser:
private List<string> ExtractRar(string varRarFileName,
string varDestinationDirectory) {
List<string> collection;
using (var archive = new SevenZipArchive(varRarFileName)) {
collection = archive.Volumes.ToList();
MessageBox.Show(collection.Count.ToString()); // output 10
}
MessageBox.Show(collection.Count.ToString()); // output 0
return collection;
}
... et puis quand vous n'avez pas besoin des diagnostics supplémentaires:
private List<string> ExtractRar(string varRarFileName,
string varDestinationDirectory) {
using (var archive = new SevenZipArchive(varRarFileName)) {
return archive.Volumes.ToList();
}
}
(je suppose que vous utilisez .NET 3.5 ou supérieur, en passant, d'utiliser la méthode d'extension ToList
.)
Cela a fonctionné :-) – MadBoy
Oui. La documentation vérifiée et ma «nouvelle» théorie ne fonctionneront certainement pas dans ce cas. Ceci est vraiment mieux. –