CsvHelper的GetRecords()是否实例化对象?对象何时创建?
CsvHelper GetRecords() 对象实例化说明
直接给结论:
GetRecords<Vehicle>()方法不会立即实例化对象,它返回的是一个延迟执行的IEnumerable<Vehicle>序列,此时还没开始读取CSV文件内容。- 对象的实际创建时机是在foreach遍历这个序列的过程中,每迭代一次(也就是读取CSV的一行数据时),CsvHelper才会实例化一个
Vehicle对象,同时把该行数据映射到对象的属性上。
结合你的代码具体说明:
var config = new CsvConfiguration(CultureInfo.InvariantCulture){ HasHeaderRecord = true }; using (var textreader = new StreamReader(filepath)) using (var csv = new CsvReader(textreader, CultureInfo.InvariantCulture)) { // 这一步仅获取了可枚举序列,未读取文件,也未创建任何Vehicle对象 var records = csv.GetRecords<Vehicle>(); // 进入foreach循环后,才开始逐行读取CSV内容 foreach(var vehicle in records) { // 此时的vehicle已经是完成实例化并填充好数据的对象,每循环一次就会创建一个新的Vehicle实例 vehicles.Add(vehicle); } }
这种延迟加载的设计是为了优化内存占用——尤其是处理大体积CSV文件时,不会一次性把所有数据加载到内存,而是按需创建对象。
内容的提问来源于stack exchange,提问作者Gui Gui
相关产品推荐
相关产品推荐

