向客户端数据集添加字段或动态访问它?
Add fields to a clientdataset or access it dynamically?
如果可以做到 Cds.FieldByName('field').Value,向 TClientDataset 添加字段有什么意义?
有参考文献是不是更快?
是'clearer'吗?
的问题
DataSet.FieldByName('field').Value
是一个性能。每次执行此操作时,都会通过数据集的字段集合进行串行搜索,以找到具有所需名称的字段。此搜索未以任何方式进行优化,例如使用二进制搜索或散列算法。因此,如果有很多字段 and/or 您在迭代数据集中的记录时执行此访问,它会对性能产生重大影响。
这是使用对象检查器定义 "persistent" TFields 的原因之一,但不是唯一的原因。您可以使用编译器已知的符号名称获取对特定 TField 的引用,这只会在编译时发生一次。所以是的,它比 FieldByName
快。看你是否觉得更清楚了。
使用持久 TFields 的其他原因包括可以轻松设置计算字段,更重要的是,不需要通过 FieldByName
在OnCalcFields
事件。使用 FieldByName
与持久字段的性能损失当然会乘以 OnCalcField
事件中引用的字段数,并且 OnCalcFields
对数据集中的每条记录至少调用一次,即使您不在自己的代码中迭代数据集记录。
以上内容适用于所有 TDataSet 后代,而不仅仅是 TClientDataSet。
如果可以做到 Cds.FieldByName('field').Value,向 TClientDataset 添加字段有什么意义?
有参考文献是不是更快? 是'clearer'吗?
DataSet.FieldByName('field').Value
是一个性能。每次执行此操作时,都会通过数据集的字段集合进行串行搜索,以找到具有所需名称的字段。此搜索未以任何方式进行优化,例如使用二进制搜索或散列算法。因此,如果有很多字段 and/or 您在迭代数据集中的记录时执行此访问,它会对性能产生重大影响。
这是使用对象检查器定义 "persistent" TFields 的原因之一,但不是唯一的原因。您可以使用编译器已知的符号名称获取对特定 TField 的引用,这只会在编译时发生一次。所以是的,它比 FieldByName
快。看你是否觉得更清楚了。
使用持久 TFields 的其他原因包括可以轻松设置计算字段,更重要的是,不需要通过 FieldByName
在OnCalcFields
事件。使用 FieldByName
与持久字段的性能损失当然会乘以 OnCalcField
事件中引用的字段数,并且 OnCalcFields
对数据集中的每条记录至少调用一次,即使您不在自己的代码中迭代数据集记录。
以上内容适用于所有 TDataSet 后代,而不仅仅是 TClientDataSet。