c# - 直接返回 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);
}
有什么理由不选择第二种选择吗?
解决方案
该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
创建的,因此由调用者来处理流,而不是您的类。
推荐阅读
- opencl - Opencl 内核本地内存
- c# - 如何最好地在 .Net Core 中加密/解密非常大的文件
- javascript - 如何从 JSON URL 获取特定数据并使用 Typeahead.js 将其用于我的过滤器搜索?
- airflow - 气流中相同 DAG 的多个实例在没有任何日志的情况下失败
- php - 为什么 Laravel 项目显示 502 Bad Gateway nginx/1.17.2?
- templates - 如何将自定义项目模板添加到 intellij 插件?
- c++ - 我在哪里得到“GDI_CapturingAnImage.h”?我想要 GDI_CapturingAnImage.h 文件
- flutter - 如何在颤动中增加滑块轨道宽度
- java - JPA 批量插入不会提高性能
- r - 是否有用于将表格按两行分组的 R 函数?