IDataReader接口继承自IDataRecord。 Read()方法更改了阅读器的状态,以便您可以检索字段:
var reader = new SomeIDataReader();
while (reader.Read()) {
var firstField = reader[0];
}
IDataReader包含阅读器和记录。在我看来,这在一个课程中混合了两个问题。我会返回一个记录对象,并像这样使用它:
var reader = new MyDataReader();
do {
var record = reader.Read();
if (record == null) break;
var firstField = record[0];
} while (true);
这分离了数据读取器和数据容器的关注点,并且可以使用两个线程从同一个源读取。
我的解决方案更好吗?让读者包含结果有什么好处?为什么有人会选择IDataReader方法?
答案 0 :(得分:1)
拥有一个单独的记录对象的一个缺点是,一个天真的调用者可能认为他可以传递它并独立于底层IDataReader使用它。
即。他可能认为当读者定位在第一个记录时他可以得到一个IDataRecord,并在读者继续或甚至关闭时使用它来引用第一个记录。如果没有实现记录的开销,这显然是不可能的,这违背了读者的高性能前向概念。
我并没有假装理解设计决策中的所有思维过程,但我确信它是经过仔细考虑的,并且是正确的设计(“最佳权衡”意义上的“正确”)比'完美')。