Один и тот же объект, чтобы читать и содержать результаты - PullRequest
0 голосов
/ 12 октября 2011

Интерфейс 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 Ответ

1 голос
/ 12 октября 2011

Одним из недостатков наличия отдельного объекта записи является то, что наивный вызывающий может подумать, что он может передать его и использовать его независимо от базового IDataReader.

Т.е. он может подумать, что он может получить IDataRecord, пока читательпозиционируется на первой записи и используется для ссылки на первую запись, когда читатель перешел или даже был закрыт.Это явно невозможно без дополнительных затрат на материализацию записи, что противоречит концепции высокопроизводительного считывающего устройства, предназначенного только для прямого чтения.

Я не претендую на понимание всех мыслительных процессов, которые были приняты при принятии решения о разработке., но я уверен, что он был тщательно продуман и является правильным дизайном («правильный» в смысле «лучший компромисс», а не «идеальный»).

...