Вы можете определенно все еще читать из переменной.Там нет проблем с точки зрения определенного назначения, иначе вы получите ошибку во время компиляции.Например, это нормально:
using System;
using System.IO;
class Test
{
static void Main()
{
string x;
using (new MemoryStream())
{
x = "hello";
}
Console.WriteLine(x);
}
}
Это абсолютно нормально.
Теперь, если SevenZipArchive
вернет ReadOnlyCollection<string>
, я бы обычно ожидал, чтоостается действительным после удаления самого архива.Однако ReadOnlyCollection<T>
- это просто оболочка вокруг другой коллекции ... и если эта коллекция будет признана недействительной из-за удаления archive
, это, безусловно, объяснит.
К сожалению, Джоэл предложил способ копирования коллекции.только создает другую обертку - которая будет запрашивать у первой обертки счетчик, в свою очередь запрашивая исходную (недействительную) коллекцию.
Вот один подход, который должен работать:
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;
}
Обратите внимание на дополнительный вызов ToList()
.Это вынудит скопировать коллекцию в List<string>
сначала ... действительно скопированную, а не просто создать обертку.
Конечно, если вы действительно не возражаете, если метод возвращает List, выможно просто использовать:
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;
}
... и тогда, когда вам не нужна дополнительная диагностика:
private List<string> ExtractRar(string varRarFileName,
string varDestinationDirectory) {
using (var archive = new SevenZipArchive(varRarFileName)) {
return archive.Volumes.ToList();
}
}
(я предполагаю, что вы используете .NET 3.5 иливыше, кстати, использовать метод расширения ToList
.)