我该叫哪一个?
有必要同时调用两者吗?
如果我已经呼叫其中一个,另一个会抛出异常吗?
我该叫哪一个?
有必要同时调用两者吗?
如果我已经呼叫其中一个,另一个会抛出异常吗?
Answers:
Close()
和Dispose()
,当在上被调用时MemoryStream
,只能起到两件事的作用:
MemoryStream
没有任何非托管资源可处置,因此从技术上讲您不必处置它。不丢弃a的效果MemoryStream
与删除对a的引用大致相同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的工作更容易的部分才适用。
1
,根据.NET参考源 .Dispose()
也不发布内部版本byte[]
。它集的唯一资源null
是_lastReadTask
其只在该方法中使用Task<int> ReadAsync(byte[], int, int, CancellationToken)
。除了设置一个变量空它是所有设置_isOpen
,_writable
以及_expandable
对false
。
以上都不是。您无需致电Close
或Dispose
。
MemoryStream
不包含任何非托管资源,因此唯一需要回收的资源是内存。MemoryStream
当您的代码不再引用时,垃圾回收期间将与对象的其余部分一起回收内存MemoryStream
。
如果您有对的长期引用,则MemoryStream
可以将该引用设置为null以允许MemoryStream
对进行垃圾回收。Close
并Dispose
释放蒸汽缓冲器和MemoryStream
适当的物体。
由于既Stream
没有MemoryStream
终结器也没有终结器,因此无需调用Close
或Dispose
导致GC.SuppressFinalize
调用它来优化垃圾回收。没有终结器可以抑制。
MemoryStream的文档是这样写的:
此类型实现
IDisposable
接口,但实际上没有任何资源可配置。这意味着不需要直接调用Dispose()
或使用诸如using
(在C#中)或Using
(在Visual Basic中)之类的语言构造来处置它。
作为第一个解决方案,建议尽可能使用using语句。这是在这里描述:http : //msdn.microsoft.com/en-us/library/yh598w02.aspx
当IDisposable对象的生存期仅限于一个方法时,应在using语句中声明并实例化它。using语句以正确的方式调用对象上的Dispose方法,并且(当您使用前面显示的方法时)它还会导致对象本身在调用Dispose时就超出范围。在using块中,该对象是只读的,无法修改或重新分配。
正如大多数.NET框架类中的其他人所建议的那样,现在来提一个问题,Close()和Dispose()之间没有区别,并且调用这两种方法中的哪一个都不重要。您应该打一个电话,但不能两个都打。但是,也有例外。
有例外;例如,System.Windows.Forms.Form和System.Data.SqlClient.SqlConnection对于Close()和Dispose()具有不同的行为。
有关完整的详细信息,您可以在此处检查:https : //blogs.msdn.microsoft.com/kimhamil/2008/03/15/the-often-non-difference-between-close-and-dispose/