2014-02-07 5 views
4

мы используем абстрактное ключевое слово до classname для ограничения, создавая экземпляр класса.Почему Datareader не может быть инициализирован?

Но datareader не является абстрактным классом, но мы не можем создать экземпляр этого. Не могли бы вы объяснить, почему?

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

Пожалуйста, помогите ...

+2

Обычно * вы * не создаете читателя; вы попросите команду сделать это * для * вас. Что вы пытаетесь сделать? –

ответ

4

DbDataReader является абстрактным классом. Если вы имеете в виду SqlDataReader, у него нет открытого конструктора, поэтому вы не можете создать экземпляр. Он имеет только internal конструктор (ILSpy):

// System.Data.SqlClient.SqlDataReader 
internal SqlDataReader(SqlCommand command, CommandBehavior behavior) 
{ 
    // ... 
} 

От MSDN:

создать SqlDataReader, вы обязательно Вызвать ExecuteReader метод объекта SqlCommand, а не непосредственно с помощью конструктор.

В целом это хорошая идея, чтобы избежать инстанцировании DataReader, так как он должен быть создан только через SqlCommand.ExecuteReader.

+1

мы можем это сделать 'System.Data.Common.DbDataReader reader = new System.Data.SqlClient.SqlDataReader();' даже sqlreader, не имеющий общего конструктора, но имеющий конструктор по умолчанию –

+1

@PranayRana: вы пытались скомпилировать? Нет конструктора по умолчанию, просто статического конструктора и внутреннего, о котором я уже говорил. –

+0

ITs компилирует ошибку времени, помогая мне понять это ... \ –

Смежные вопросы