在函数中关闭一个流,一个坏主意?

7 c# io exception-handling

我今天写了一些代码,另一位开发人员说它更安全.我不确定这是否正确,因为我无法看到这里所做的一些代码示例的优势

public byte[] ReadFile(Stream stream)
{
    byte[] result = null;

    try
    {
       // do something with stream
       result = <result of operation>
    }
    finally
    {
        stream.Close();
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

这被改为

public byte[] ReadFile(Stream stream)
{
    byte[] result = null;

    // do something with stream
    result = <result of operation>

    return result;
}
Run Code Online (Sandbox Code Playgroud)

如果你完成它后流不被关闭,我对c#很新吗?

Hen*_*man 11

一般来说,第一个版本是一个糟糕的设计.

是的,Stream应该关闭,但最好是通过打开它的相同代码(相同的方法).这被称为关注点的分离,它使错误和混淆的可能性大大降低.

所以要么

  • ReadFile()接受例如a string fileName和打开并关闭流,或
  • 你留给打电话的人.

您的方法(第2版)应该以这种方式使用:

using (var reader = new FileReader(...))
{
  // maybe some pre-reading
  var r = ReadFile(reader);
  // maybe some post-reading
}
Run Code Online (Sandbox Code Playgroud)

请注意,第二种方法也使该方法更具可重用性.

  • @HenkHolterman:公平转让所有权; 但是,它确实暗示人们不应该传递`Stream`到`StreamReader`除非一个"拥有"流,使得使用StreamReader`没有资格情况的`如OP的方法.我只是希望我们不必经常使用诸如`NonClosingStreamWrapper`之类的第三方解决方法. (2认同)

Tig*_*ran 6

这个问题没有正确答案,因为这取决于您的应用程序架构.

我会说,是的,因为如果在这个函数stream中没有创建,但只使用了,所以关闭它让我们放弃调用者.

但我再说一遍,这取决于您的应用程序架构.


Ste*_*eve 5

谁打开门必须记得关闭它.

因此,最好在打开它的方法中关闭流.