读取和包含结果的相同对象

时间:2011-10-12 10:02:25

标签: c# .net oop design-patterns sqldatareader

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方法?

1 个答案:

答案 0 :(得分:1)

拥有一个单独的记录对象的一个​​缺点是,一个天真的调用者可能认为他可以传递它并独立于底层IDataReader使用它。

即。他可能认为当读者定位在第一个记录时他可以得到一个IDataRecord,并在读者继续或甚至关闭时使用它来引用第一个记录。如果没有实现记录的开销,这显然是不可能的,这违背了读者的高性能前向概念。

我并没有假装理解设计决策中的所有思维过程,但我确信它是经过仔细考虑的,并且是正确的设计(“最佳权衡”意义上的“正确”)比'完美')。