.net 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块

由于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块(或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
现在是完全空的。