【发布时间】:2018-10-24 11:00:16
【问题描述】:
在查看 msdn 的 using 语句时,它显示以下内容:
当 IDisposable 对象的生命周期仅限于单个方法时,您应该在 using 语句中声明并实例化它。 using 语句以正确的方式调用对象的 Dispose 方法,并且(当您如前所示使用它时)它还会导致对象本身在调用 Dispose 时立即超出范围。在 using 块中,对象是只读的,不能修改或重新分配。
考虑到 MSDN 提供的信息。 从方法已设为静态的 using 块中返回内存流时。
问:内存流在返回时会被释放,还是会关闭并作为只读内存流继续存在?
下面的代码用于返回内存流。
public static MemoryStream CreatePermitFileMemoryStream(int encOnlineId)
{
var folder = @"path\anotherpath\filelocation";
try
{
using (var zipStream = new MemoryStream())
{
using (var fileStream = new FileStream(@"path\anotherpath\filelocation\file.zip", FileMode.OpenOrCreate))
{
using (var zipArchive = new ZipArchive(fileStream, ZipArchiveMode.Create))
{
foreach (var fileInfo in Directory.EnumerateFileSystemEntries(folder))
{
if (fileInfo.Contains("file.tmp") || fileInfo.Contains("PERM.TXT"))
{
var filename = new FileInfo(fileInfo);
zipArchive.CreateEntryFromFile(fileInfo, filename.Name);
}
}
fileStream.CopyTo(zipStream);
zipStream.Position = 0;
return zipStream;
}
}
}
}
finally
{
FileUtils.DeleteFile(@"path\anotherpath\filelocation");
}
}
return new MemoryStream();
}
【问题讨论】:
-
using块在您调用return时退出。所以是的,Dispose将在zipStream上被调用。 -
您将返回一个已处理的 MemoryStream。所以访问它会抛出异常或返回错误。
-
如果你真的需要返回一个流(不是字节数组),就不要使用
zipStream的 using-block。 -
我也认为它不会执行。但是提供的代码有效..