.net MemoryStream必须明确处理吗?
由于MemoryStream是一种非托管资源,是否总是必须对其进行处置 鉴于:.net MemoryStream必须明确处理吗?,.net,dispose,memorystream,.net,Dispose,Memorystream,由于MemoryStream是一种非托管资源,是否总是必须对其进行处置 鉴于: 1) A method is invoked. 2) A MemoryStream object is created (MemoryStream ms = new MemoryStream();). 3) An exception occurs and is caught from the invoking classes. 因此,MemoryStream对象上的引用将丢失。此场景是否需要try/finally块
1) A method is invoked.
2) A MemoryStream object is created (MemoryStream ms = new MemoryStream();).
3) An exception occurs and is caught from the invoking classes.
因此,MemoryStream对象上的引用将丢失。此场景是否需要try/finally块(或using语句)?任何实现
IDisposable
的类型都应该通过try/catch/finally块或using语句显式调用Dispose
在这样的情况下,从技术上讲,
MemoryStream
不需要处理,但是为了尊重接口并保护自己不受下游更改的影响,仍然应该调用Dispose
。MemoryStream
实现IDisposable
,因此在可能的情况下,使用using语句
当这不可行时,将其设置为try/catch/finally块
在需要让对象超出代码范围的情况下(当使用或try/catch/finally不起作用时),调用方有责任实现显式处理。通常,必须始终处理所有一次性对象 但是,
MemoryStream
实际上不需要被释放,因为它没有任何非托管资源。(它只是一个字节[]
和一个int
)它一次性使用的唯一原因是它继承了抽象的
流
类,该类实现了IDisposable
请注意,必须处理所有其他流。请参见此处
查看IL并使用执行以下操作:
try
{
}finally
{
((System.IDisposable)obj).Dispose();
}
这意味着您的流将得到处置,无论发生什么,除了异常(如果在
try块)将保留在堆栈上,因此如果您不小心,它可能会使您的应用程序崩溃
所以:
“因此,MemoryStream对象上的引用丢失。此场景是否需要try/finally块(或using语句)?”-相同
现在,如果Dispose方法由于某种原因失败,将会发生什么,这真的很有趣-
你有一个IE安全漏洞:)开玩笑:)只是想说倭黑猩猩太棒了。不同意你不应该在这种情况下调用Dispose,尽管它可能不是“需要的”事实上,它实现了IDisposable接口,应该通过using或try/catch/finally调用,因为实现细节在理论上可能会在某个时候发生变化,并且由于您忽略了对接口的尊重,您可能会被一个可能已被删除的bug咬到avoided@Aaron:在这种情况下,那是不太可能的。同意……但这是让行为习惯化。因为周围没有汽车而不使用转向灯的人会有意识地思考行动;“这不再是一种习惯行为,他们会在某个时候忘记的。”亚伦。对这就是我在这个特殊情况下说的原因。为了补充一点,我要冒险猜测,MemoryStream
实现了IDisposable
,这仅仅是因为它必然来自实现IDisposable
的Stream
。从参考源来看,可能MemoryStream
的基址使用了一些“异步IO资源”,因为参考源调用它,这些资源可能会被释放,但是基址Dispose
现在是完全空的。