Read和Load的语义差异

本文关键字:语义 Load Read | 更新日期: 2023-09-27 18:20:49

我想知道ReadLoad(在C#中)之间的语义区别是什么。比较时我看不出有什么不同,例如

  • System.IO.MemoryStream.Read()
  • System.Console.Read()
  • System.IO.StreamReader.Read()
  • System.IO.File.ReadAllText()

  • System.Xml.XmlDocument.Load()
  • System.Xml.Linq.XDocument.Load()
  • System.Reflection.Assembly.Load()

由于我希望对我的程序进行一致的命名,只需从持久存储和更高级别的函数中获取文件,也可以初始化、交叉引用和错误检查,我恳请您提供意见。

Read和Load的语义差异

在您的示例中,"读取"通常指读取数据的部分。无论这是为了限制在给定操作中需要存储和/或处理的数据量,还是因为数据本身不能立即全部可用(例如Console.Read()或从网络流中读取),基本行为都是一样的:数据被处理成比可以或将要处理的整组数据更小的片段。

有一个例外ReadAllText(),它实际上一次读取所有数据。但在这种类型中,所有其他执行类似的方法也使用"读取"一词。在这种情况下使用"Read"可以保持API的一致性,而不使用"Load"不会显著阻碍对API的理解(尤其是因为方法名称也明确表示"All Text"…在这种情况中,看到所有文本都被读取,任何人都不应该感到惊讶,对吧?:)。

在使用"Load"的示例中,它们一次消耗所有数据,并将其转换为其他内容,例如XMLDOM或程序集。这是一种明显不同于只读取数据并最多对其进行最小处理(例如解码某些文本格式)的操作。与"读取"操作不同,"加载"将始终消耗所有数据,而不允许一次只读取一部分。

Read API是关于:

  • 以较小的单位读取数据,如字节、字符
  • 有一个指针,它大多是像DataReader这样的仅向前类型
  • 已连接并从源读取
  • 适用于所有类型的数据,但如果在一段时间内保持实时连接,则可能是一种成本高昂的选择
  • 在整个过程中需要一致的连接
  • 连接ADO.Net的体系结构就是一个例子

在另一端加载API:

  • 一次性加载内存中的所有数据
  • 打开连接,读取所有内容并关闭,不保持实时连接
  • 可以使用数据应用逻辑,在内存中向前/向后移动
  • 适用于较小的数据集,但由于内存和网络要求,可能会对较大的数据集产生问题
  • 一旦加载,可以在一段时间内方便地进行处理,作为断开连接的数据
  • ADO.Net断开连接的体系结构、Dataset、DataTable和IEnumerable都是有效的示例