C# MemoryStream.Close()或MemoryStream.Dispose()文件
我该叫哪一个 有必要两个都打电话吗C# MemoryStream.Close()或MemoryStream.Dispose()文件,c#,.net,garbage-collection,C#,.net,Garbage Collection,我该叫哪一个 有必要两个都打电话吗 如果我已经调用了其中一个,那么另一个会抛出异常吗?使用usingblock,这样如果对象的实现IDisposable接口调用Close()将在内部调用Dispose()释放资源,则对象将被释放 有关更多信息,请参阅此链接: 您可以为此使用using块。当超出其范围时,它将自动调用Dispose 例如: using (MemoryStream ms = new MemoryStream()) { // Do something with ms.. } /
如果我已经调用了其中一个,那么另一个会抛出异常吗?使用
using
block,这样如果对象的实现IDisposable接口调用Close()将在内部调用Dispose()释放资源,则对象将被释放
有关更多信息,请参阅此链接:
您可以为此使用using
块。当超出其范围时,它将自动调用Dispose
例如:
using (MemoryStream ms = new MemoryStream())
{
// Do something with ms..
}
// ms is disposed here
希望这能有所帮助。只调用Dispose()
就可以了。下面的代码是流式的。从reflector中进行Dispose正如您所看到的,如果进行Dispose(这在使用时是隐式的),则无需关闭
Close()
和Dispose()
,在MemoryStream
上调用时,仅用于执行两项操作:
- 标记已处置的对象,以便将来意外使用该对象时引发异常
- 可能1释放对托管对象的引用,这可以使GC的工作更容易,具体取决于GC实现。(在今天的GC算法中,它没有真正的区别,因此这是一个学术讨论的重点,并且没有重大的现实影响。)
MemoryStream
没有任何非托管资源可供处置,因此您在技术上不必处置它。不处理内存流
的效果与删除对字节[]
的引用大致相同——GC将以相同的方式清除这两个字节
我该叫哪一个?有必要两个都打电话吗
streams 2的Dispose()
方法,因此两者的作用完全相同
如果我已经调用了其中一个,另一个会抛出异常吗
特别声明在任何object3上多次调用Dispose()
是安全的。(如果某个特定类不是这样,那么该类以违反其约定的方式实现了IDisposable
接口,这将是一个bug。)
所有这些都表明:不管你是否处理内存流
,都不会有很大的区别。它拥有Close
/Dispose
方法的唯一真正原因是它继承了Stream
,这要求这些方法作为其契约的一部分来支持具有非托管资源(如文件或套接字描述符)的流
1不会释放字节[]
引用。我不知道微软的实现是否会
2“此方法调用Close,后者随后调用Stream.Dispose(布尔值)。”
3“如果对象的Dispose方法被多次调用,则该对象必须忽略第一次调用之后的所有调用。”
我该叫哪一个
他们中的任何一个
有必要两个都打电话吗
不,两个都足够了
如果我已经调用了其中一个,另一个会抛出异常吗
否,一次性模式声明后续对Dispose的调用不会产生负面影响。在.NET 3.5(未检查其他版本)中,在处理MemoryStream时,按以下顺序调用方法:
Stream.Dispose()
- 就这么结束了
Stream.Close()
- 调用Dispose(true),然后调用GC.SuppressFinalize(this)
MemoryStream.Dispose(true)
- 将_isOpen、_writable和_expandable标志设置为false
Stream.Dispose(true)
- 如果活动,则关闭异步事件
作为第一个解决方案,建议尽可能使用using语句。这里描述了这一点:
当IDisposable对象的生存期仅限于一个方法时,您应该在using语句中声明并实例化它using语句以正确的方式调用对象上的Dispose方法,并且(当您如前所示使用它时)一旦调用Dispose,它还会导致对象本身超出范围。在using块中,对象是只读的,无法修改或重新分配
现在来讨论这个问题,正如其他人在大多数.NET framework类中所建议的那样,Close()和Dispose()之间没有区别,调用这两个方法中的哪一个也不重要。你应该叫一个,但不能叫两个。但是,也有例外
也有例外;例如,System.Windows.Forms.Form和System.Data.SqlClient.SqlConnection对于Close()和Dispose()具有不同的行为
有关完整的详细信息,您可以在此处查看:以上任何一项。您无需调用Close
或Dispose
MemoryStream
不包含任何非托管资源,因此要回收的唯一资源是内存。当代码不再引用MemoryStream
时,将在垃圾收集期间使用MemoryStream
对象的其余部分回收内存
如果对MemoryStream
有一个长期引用,可以将该引用设置为null,以允许对MemoryStream
进行垃圾收集<代码>关闭
和处置
释放蒸汽缓冲器和内存流
对象本身
由于Stream
和MemoryStream
都没有终结器,因此无需调用Close
或Dispose
来导致调用GC.SuppressFinalize
来优化垃圾收集。没有要抑制的终结器
文件中这样说:
此类型实现了IDisposable
接口,但实际上没有任何可处置的资源。这意味着通过直接调用Dispose()
或使用使用(在C#中)或使用等语言构造来处理它
public void Dispose()
{
this.Close();
}