C# 当从using块中返回时,memorystream是否被释放
在查看using语句时,它说: 当IDisposable对象的生存期仅限于一个方法时,您应该在using语句中声明并实例化它。using语句以正确的方式调用对象上的Dispose方法,并且(当您如前所示使用它时)一旦调用Dispose,它还会导致对象本身超出范围。在使用块中,对象是只读的,不能修改或重新分配 考虑到MSDN提供的信息。 从已使该方法成为静态的using块中返回memorystream时 Q:memorystream是在返回时被释放,还是关闭并作为只读memorystream继续存在 下面的代码用于返回memorystreamC# 当从using块中返回时,memorystream是否被释放,c#,.net,C#,.net,在查看using语句时,它说: 当IDisposable对象的生存期仅限于一个方法时,您应该在using语句中声明并实例化它。using语句以正确的方式调用对象上的Dispose方法,并且(当您如前所示使用它时)一旦调用Dispose,它还会导致对象本身超出范围。在使用块中,对象是只读的,不能修改或重新分配 考虑到MSDN提供的信息。 从已使该方法成为静态的using块中返回memorystream时 Q:memorystream是在返回时被释放,还是关闭并作为只读memorystream继续存
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语句:
using (var permitFileStream = CreatePermitFileMemoryStream(0))
{
//Use your stream
}
返回流是可以的。您仍然可以在使用流的地方使用using语句:
using (var permitFileStream = CreatePermitFileMemoryStream(0))
{
//Use your stream
}
答案是肯定的。
实现
IDisposable
接口的任何对象都可以在using block中使用,以确保在using block结束时调用Dispose()
。事实上,使用block相当于try,finally
在finally block中具有Dispose()
的块。答案是是。
实现
IDisposable
接口的任何对象都可以在using block中使用,以确保在using block结束时调用Dispose()
。事实上,使用block充当的是try,finally
块在finally block中具有Dispose()
。代码可能会起作用,因为内存流上的Dispose实际上不起任何作用(内存由GC回收),但我肯定不会依赖它在所有.NET实现中都这样做,除非您调用的唯一函数是GetBuffer(),它保证在关闭流后工作。在这种情况下,删除“using”可能更安全。
“只读”是指无法将引用重新分配给另一个对象。
顺便说一句,如果您查看Dispose()中的注释,则表明开发人员有意让对象缓冲区在Dispose后仍然可用,但不能保证从中读取数据流会正常工作(写入几乎肯定会失败)。代码可能会正常工作,因为MemoryStream上的Dispose实际上没有任何作用(内存是由GC回收的),但我肯定不会依赖于它在所有.NET实现中总是这样做,除非您调用的唯一函数是GetBuffer(),它保证在关闭流后工作。在这种情况下,删除“using”可能更安全。 “只读”是指无法将引用重新分配给另一个对象。
顺便说一句,如果您查看Dispose()中的注释,则表明开发人员有意让对象缓冲区在Dispose后仍然可用,但不能保证作为流进行读取(并且几乎肯定会失败).调用
return
时,会退出using
块。因此,是的,Dispose
将在zipStream
上调用。您将返回一个disposed MemoryStream。因此,访问它将引发异常或返回错误。如果确实需要返回流(而不是字节数组),只是不要对zipStream
使用using块。我还以为它不会执行。但是提供的代码可以工作。using
块在调用return
时退出。因此,是的,Dispose
将在zipStream
上调用。您将返回一个已处理的MemoryStream。因此访问它将抛出Exceptionons或返回错误。如果您确实需要返回流(而不是字节数组),请不要对zipStream
使用using块。我还以为它不会执行。但是提供的代码可以工作。。