我该调用哪一个?
需要同时调用两个函数吗?
如果我已经调用其中一个,那么另一个会抛出异常吗?
我该调用哪一个?
需要同时调用两个函数吗?
如果我已经调用其中一个,那么另一个会抛出异常吗?
Close()
和Dispose()
在MemoryStream
上的调用只有两个作用:
MemoryStream
没有任何未受控资源需要处理,因此您不必严格释放它。 不释放MemoryStream
的效果与放弃对byte[]
的引用相同-- GC将以相同的方式清理两者。
我应该调用哪一个?是否需要同时调用两者?
流的Dispose()
方法直接委托给Close()
方法2,因此两者完全相同。
如果我已经调用了其中一个,另一个会抛出异常吗?
IDisposable.Dispose()的文档明确说明可以多次调用Dispose()
,对于任何对象都是安全的3。(如果对于某个类不是这样,那么该类实现了IDisposable
接口,违反了其契约,这将是一个错误。)
所有这些都是为了说:是否释放MemoryStream
并没有太大关系。它具有Close
/Dispose
方法的唯一真正原因是它继承自Stream
,后者需要这些方法作为其合同的一部分,以支持具有未托管资源(如文件或套接字描述符)的流。
1 Mono的实现没有释放byte[]
的引用。我不知道Microsoft的实现是否有。
2 "该方法调用Close,然后调用Stream.Dispose(Boolean)。"
3 "如果一个对象的Dispose方法被调用多次,则对象必须忽略第一次之后的所有调用。"
MemoryStream
部分将使GC的工作更轻松。 - Edward Brey以上都不需要。你不需要调用Close
或Dispose
。
MemoryStream
不持有任何非托管资源,因此唯一需要回收的资源是内存,在您的代码不再引用 MemoryStream
对象时将在垃圾收集期间与其余的对象一起回收内存。
如果您有一个长期存在的 MemoryStream
引用,则可以将该引用设置为 null 以允许 MemoryStream
被垃圾收集。 Close
和 Dispose
都不会释放流缓冲区或 MemoryStream
对象本身。
由于既没有 Stream
也没有 MemoryStream
的终结器,因此无需调用 Close
或 Dispose
来导致调用 GC.SuppressFinalize
以优化垃圾回收。没有要压制的终结器。
MemoryStream 文档如下:
此类型实现
IDisposable
接口,但实际上没有任何需要处理的资源。这意味着不必通过直接调用Dispose()
或使用语言结构(如 C# 中的using
或 Visual Basic 中的Using
)来处理。
您可以使用using
块来处理这个问题。当using
块超出其作用域时,它会自动调用Dispose
。
示例:
using (MemoryStream ms = new MemoryStream())
{
// Do something with ms..
}
// ms is disposed here
希望这有所帮助。使用using
块,以便在对象实现了IDisposable
接口时进行处理。
我该叫哪一个?
任何一个都可以。
是否需要同时调用两个?
不需要,只需调用其中一个即可。
如果我已经调用了其中一个,另一个会抛出异常吗?
不会,一次性模式声明后续对Dispose的调用不会产生负面影响。
public void Dispose()
{
this.Close();
}
调用Close()方法将在内部调用Dispose()方法来释放资源。
请参阅此链接获取更多信息: msdn
Dispose()
会在内部调用 Close()
,但反过来不行。 - Adilet SoronovDispose()
就可以解决问题 =)完整的细节可以在此处查看:https://blogs.msdn.microsoft.com/kimhamil/2008/03/15/the-often-non-difference-between-close-and-dispose/
}参考此问题:https://dev59.com/f2ct5IYBdhLWcg3wmOjg - Randy James
Close()
。文档指出应该确保流被正确处理而不是调用它,而MemoryStream
文档 明确表示不需要调用Dispose()
,因为它没有任何需要处理的资源。所以,在完成MemoryStream
的使用后,就像其他托管类型一样将其留下,垃圾回收器会处理剩下的事情。 - saastn