Возврат нового объекта из открытого DataReader — ОК или нет?

#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 за разъяснение о поведении читателя — я думаю, что это была область моей «выдуманной» заботы!