C# 当从using块中返回时,memorystream是否被释放

C# 当从using块中返回时,memorystream是否被释放,c#,.net,C#,.net,在查看using语句时,它说: 当IDisposable对象的生存期仅限于一个方法时,您应该在using语句中声明并实例化它。using语句以正确的方式调用对象上的Dispose方法,并且(当您如前所示使用它时)一旦调用Dispose,它还会导致对象本身超出范围。在使用块中,对象是只读的,不能修改或重新分配 考虑到MSDN提供的信息。 从已使该方法成为静态的using块中返回memorystream时 Q:memorystream是在返回时被释放,还是关闭并作为只读memorystream继续存

在查看using语句时,它说:

当IDisposable对象的生存期仅限于一个方法时,您应该在using语句中声明并实例化它。using语句以正确的方式调用对象上的Dispose方法,并且(当您如前所示使用它时)一旦调用Dispose,它还会导致对象本身超出范围。在使用块中,对象是只读的,不能修改或重新分配

考虑到MSDN提供的信息。 从已使该方法成为静态的using块中返回memorystream时

Q:memorystream是在返回时被释放,还是关闭并作为只读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块。我还以为它不会执行。但是提供的代码可以工作。。