Этот код вредит на многих уровнях. Я отвечу на ваш вопрос, но сначала несколько советов:
- Параметры должны иметь хорошие имена. «DDL» для меня не имеет смысла. Кроме того, они не должны передаваться по ссылке, если это не является абсолютно необходимым. Вы не модифицируете DLL (только то, на что она указывает), поэтому передайте ее по значению.
- Методы, по возможности, не должны иметь побочных эффектов. Передав выпадающий список, вместо того, чтобы просто возвращать записи для него, вы вводите побочные эффекты. Это также связывает метод с конкретным выпадающим типом управления.
- Объявления i и j излишни (при условии, что Option Infer On), и выходят за пределы цикла.
- Почему я зациклен на текущий год? Делая это, вы ввели некоторые чувствительные ко времени ошибки (цикл может выполняться дважды, если выполняется новогодняя ночь в полночь).
- Вы добавляете месяцы к «времени», но напечатанный год постоянен. Вы увидите "январь 2009", следующий за "декабрь 2009"!
- Почему вы ловите такое общее исключение в рамках такого простого метода? Я не вижу вызовов, которые могли бы вызвать исключение, о котором вы хотели бы сообщить на этом уровне.
- Что делать, если вы хотите изменить количество месяцев для проецирования вперед? «12» подразумевается
спрятано глубоко внутри For-Loop!
В общем, я должен сказать, что это очень плохой код. Но это не трудно улучшить его шаг за шагом. После того, как я применил к нему свой собственный совет, я получил следующее:
Public Function GenerateMonthEntries(monthCount as integer) as IList(of String)
dim result = new List(Of String)()
dim time = DateTime.Now
for i = 0 to monthCount - 1
result.add(time.AddMonths(i).ToString("MMMM yyyy"))
next i
result.add(time.AddMonths(monthCount).ToString("MMMM yyyy") + "+")
return result
End Function
... where you're using the function ...
for each entry in GenerateMonthEntries(12) 'maybe the 12 should be a constant somewhere
whateverDropDownList.Items.add(entry)
next
Не обманывайте себя, этот код не идеален. Может быть, тип вывода должен быть более общим IEnumerable (Of String). Возможно, вместо этого переменная time должна быть параметром, чтобы вы могли легко протестировать метод и сделать его истинные зависимости очевидными.