#c# #.net #datareader
#c# #.net #datareader
Вопрос:
Я видел этот код:
public static ConsTypeCategory GetConsCategory(int providerId, int categoryId) {
const string select =
@"SELECT CategoryId, CategoryName, ExpectedDurationMins
FROM constypecategories
WHERE ProviderId = @ProviderId
AND CategoryId = @CategoryId
LIMIT 1";
MySqlParameter[] mySqlParameters = {
new MySqlParameter("ProviderId", providerId),
new MySqlParameter("CategoryId", categoryId)
};
using (MySqlDataReader dr = MySqlHelper.ExecuteReader(DB.ConnectionString, select, mySqlParameters)) {
while (dr.Read()) {
return new ConsTypeCategory(
dr.GetInt32("CategoryId"),
dr.GetString("CategoryName"),
dr.GetInt32("ExpectedDurationMins")
);
}
}
return null;
}
…и сразу подумал, что было неправильно возвращать «новый» объект из цикла datareader. Но, пытаясь найти обоснование этому мнению, я пришел к пустому.
Есть ли веская причина не возвращаться из этого «while»?
Комментарии:
1. В этом нет ничего плохого. Вы даже можете использовать это внутри метода итератора и возвращать объекты один за
yield return ...
другим. Программа чтения закроется, когда она выйдет за пределы области видимости. В этом случае послеreturn
. В итераторе после остановки итерации2. В этом случае вы можете заменить while на if , может быть, тогда вы почувствуете себя лучше
3. Вы используете
while
цикл, но возвращаете первую запись. Это говорит о том, что вам может потребоваться прочитать больше, чем это. Хотя это функционально эквивалентно использованиюif
, вы должны использоватьif
, чтобы дать понять, что вы ожидаете, что он вернет только один.4. согласен с @madreflection. Следующий разработчик, который посмотрит на ваш код, задастся вопросом, есть ли там ошибка.
5. Переключение ‘while’ на ‘if’ имеет смысл. И спасибо вам всем за образование, особенно @PanagiotisKanavos за разъяснение о поведении читателя — я думаю, что это была область моей «выдуманной» заботы!