首页 > 解决方案 > 直接返回 Stream 或者返回一个 Func当方法打开一个流

问题描述

我有一个实现的类IDisposable和一个返回的方法Stream

我想知道直接返回流更好:

public Stream GetStream()
{
     var stream = new FileStream(_fileName,  FileMode.Open);
     return stream;
}

或者最好返回 aFunc<stream>并让调用者决定何时“触发它”:

public Func<Stream> GetStream()
{
     var openStream() => new FileStream(_fileName,  FileMode.Open);
     return openStream;
}

我已经尝试过自己的研究,虽然似乎有很多类似的答案,但我还没有找到一个像这样的答案。查看现有答案,我仍然不确定一个是否明显优于另一个。

我认为第二种方法提供了更大的灵活性,因为我们不返回打开的流,我们打开流并允许用户在适合他们时打开流可能更可取。例如:

var listOfStreamFunc = new List<Func<Stream>>(){
   somewhere1.GetStreamFunc(),
   somewhere2.GetStreamFunc()
};

SomeMethod(listOfStreamFunc);

然后我们可以将流的打开推迟到SomeMethod,这是有利的,因为仅在必要时才打开流,同时通过意外过早关闭流来减少误用的可能性,例如

using (x = GetStream()){
   SomeMethod(x);
}

有什么理由不选择第二种选择吗?

标签: c#stream

解决方案


Func<Stream>方法允许您推迟打开流,但如果您真的想推迟打开它,那么首先不要调用Stream GetStream()

此外,如果您一直遵循您的思维过程,那么您最终会将所有内容包装在 aFunc中,例如:

Func<int> Add(int a, int b)
{
  var adder = () => a + b;
  return adder;
}

显然,认为用户可以调用加法器,然后在他们想要结果时“触发它”,在这里没有任何收获!

此外,名称GetStream实际上并没有记录该方法的作用(因为它没有为您提供流)。如果您希望返回 aFunc<Stream>然后给它一个更好的名称,例如:

Func<Stream> CreateStreamOpener()
{
  return ....
}

现在它更加明确了。

请注意,最终这并不能降低误用的风险,因为您最终将不得不拥有一个Stream您管理的原始对象。

您的类实现的事实IDisposable与此处无关,因为您没有坚持Stream创建的,因此由调用者来处理流,而不是您的类。


推荐阅读