当编写对潜在无限"流"数据(即字节、字符等)进行操作的函数时,在决定使用字符串/数组与流进行输入/输出时,有哪些设计考虑因素?
总是编写函数以使用流,然后创建使用流包装器(即 StringReader/Writer)的重载方法来返回"简单数据"(如数组或不需要释放的字符串)和其他注意事项,是否会对性能产生巨大影响?
我认为在数组上运行的函数要方便得多,因为您可以"返回"结果数组,并且通常不必担心释放。我认为流运算符很好,因为它们可以在无限的数据源上运行,也可能是内存效率高的。
如果您正在使用未知大小的二进制数据,请始终使用流。例如,如果可以避免,将整个文件读入字节数组通常是个坏主意。.Net 中处理二进制数据(如加密和压缩)的大多数函数都构建为使用流作为输入/输出。
如果您正在编写一个函数来处理数据流,那么为什么不将其作为IEnumerable<T>
传递。然后,可以在生成器函数中将流作为IEnumerable<T>
返回。换句话说,使用 return yield
一次返回每个结果。
在某些情况下,您最终可能会获得性能的渐近改进,因为评估是根据需要完成的。