во-первых - да, я рассмотрел этот вопрос: Создание объекта в геттерах плохая практика?. Я также не говорю об инициализации объекта в аксессорах/мутаторах, речь идет о конкретной части объекта, которую я хочу вернуть определенным образом.
Мой вопрос более конкретен; Это не обязательно относится только к С#, однако в настоящее время я ищу решение для реализации в моем проекте С#.
У меня есть класс со словарем, который сопоставляет объекты даты с десятичным значением. В одном аксессоре я хочу вернуть список всех ключей словаря, другой аксессор возвращает значения. Я также хочу иметь средство доступа, которое дает мне десятичные значения в определенном формате. Это будет выглядеть примерно так:
class Class
{
// Some other properties...
// ....
private Dictionary<DateTime, decimal> dict;
public Class(Dictionary<DateTime, decimal> dict)
{
this.dict = dict;
}
private string FormatTheWayIWant(decimal dt)
{
// Format decimal value.
string s = String.Format("{0:F}", dt);
return s;
}
public ReadOnlyCollection<DateTime> DateTimes
{
get { return new ReadOnlyCollection<DateTime>(this.dict.Keys.ToList()); }
}
public ReadOnlyCollection<decimal> Values
{
get { return new ReadOnlyCollection<decimal>(this.dict.Values.ToList()); }
}
public ReadOnlyCollection<string> FormattedStrings
{
get
{
// Format each decimal value they way I want.
List<string> list = new List<string>();
foreach (decimal dt in dict.Keys)
{
list.Add(FormatTheWayIWant(dt));
}
return new ReadOnlyCollection<string>(list);
}
}
}
Таким образом, я могу сделать следующие вызовы (что и является моей целью!):
DateTime dateTime = DateTimes[0];
decimal s = Values[0];
string formattedS = FormattedStrings[0];
Проблема с этим подходом заключается в том, что я создаю новый список каждый раз, когда вызываю метод доступа FormattedStrings, даже если мне нужна только одна из отформатированных строк. Я знаю, что это не очень хорошая практика и может привести к ненужным проблемам с производительностью...
Альтернативы, о которых я думал, следующие:
- Я мог бы расширить класс
decimal
и реализовать собственный метод ToString(). - Или перезапишите класс
KeyValuePair<DateTime, decimal>
и используйте индексатор в моем классе. - Или я создаю метод с параметром для индекса и возвращаю только одну отформатированную строку.
- Или у меня может быть собственный список для доступа, который обновляется в методе set для моего словаря каждый раз, когда я обновляю словарь.
У меня есть вопрос: есть ли способ заставить это работать с аксессором вместо метода, создавая пользовательские классы или создавая странные побочные эффекты для других объектов при присвоении значения?
Заранее спасибо.