(РЕДАКТИРОВАТЬ: Этот ответ сосредоточен исключительно на «каковы последствия на относительно низком уровне», а не общие последствия для дизайна. Похоже, что другие ответы были рассмотрены, поэтому я не буду комментировать:)
Ну, определенно что-то не так с кодом, который вы дали, поскольку ничто не закрывает соединение, команду или считыватель. В частности, ваша строка назначения соединения обычно должна выглядеть следующим образом:
using (SqlConnection connection = GetConnection())
{
...
}
Вы вполне можете подумать, что это просто придирки, и что это просто пример кода, и очистка не важна - но "владение" ресурсами, которые требуют очистки, как раз и является проблемой передача DataReader
конструктору.
Я думаю, что все в порядке, если вы документируете, кто впоследствии «владеет» читателем. Например, в Image.FromStream
изображение впоследствии владеет потоком, и вам может не понравиться закрывать его самостоятельно (в зависимости от формата изображения и некоторых других вещей). В других случаях это все еще ваша ответственность, чтобы закрыть. Это должно быть очень тщательно задокументировано, и если тип с конструктором становится владельцем, он должен реализовать IDisposable
, чтобы упростить очистку и , чтобы сделать более очевидным, что очистка требуется.
В вашем случае, похоже, что конструктор не становится владельцем устройства чтения, что является прекрасной (и более простой) альтернативой. Просто задокументируйте это, и абоненту все равно придется соответствующим образом закрыть читателя.