Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MemoryStream.Close()或MemoryStream.Dispose()文件_C#_.net_Garbage Collection - Fatal编程技术网

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();
    }