28

注意:我已经阅读了以下两个问题:

你能解释一下流的概念吗?

C# 使用流

我正在用 C# 编码

  1. 在几乎所有使用流的代码示例中,几乎总是调用 .Dispose()、.Flush()、.Close()。
    • 在流的概念中,完成了什么?
    • 如果我不处理存储在变量中的流,我的应用程序是否在某处泄漏?
    • 为什么我需要调用这些函数中的任何一个?我见过不这样做但仍然可以完成工作的代码示例(没有明显的破损)

我目前正在我的应用程序中构建一个类,该类包含一个主要方法(让我们调用它GetStream()),该方法通过以下方式返回一个流myWebRequest.GetResponse().GetResponseStream()

主要方法GetStream()返回一个Stream对象,该对象可用于任何需要流的操作(StreamReader、Bitmap() 等)。

有没有办法让流在最后一次使用后自动处理(垃圾收集?)而不强迫任何调用.GetStream()手动处理它的人?

正如您可能知道的那样,我的问题是模糊和笼统的。我对流的理解并不扎实,因此任何指向有用文章的链接,这些文章提供了比 SO 问题所能提供的更深入的流,我们将不胜感激。

4

1 回答 1

38

处理流会关闭它(并且可能不会做太多其他事情。)关闭流会刷新它,并释放与流相关的任何资源,例如文件句柄。刷新流获取尚未写入的任何缓冲数据,并立即将其写出;一些流在内部使用缓冲来避免对相对昂贵的资源(如磁盘文件或网络管道)进行大量小更新。

您需要在大多数流上调用其中一个Close或调用,或者您的Dispose代码不正确,因为在垃圾收集器到来之前(谁知道这将花费多长时间),底层资源不会被释放供其他人使用。 Dispose理所当然;预计您将在 C# 中处理所有一次性的东西。Flush在大多数情况下,您可能不必显式调用。

Dispose在 C# 中,通过块调用是惯用的using,它是在 finally 中配置的 try-finally 块的语法糖,例如:

using (FileStream stream = new FileStream(path))
{
    // ...
}

在功能上等同于

FileStream stream;

try
{
    stream = new FileStream(path);
    // ...
}
finally
{
    if (stream != null)
        stream.Dispose();
}
于 2009-12-08T04:27:34.820 回答