C# получить / установить результаты в переполнении стека
Я получаю переполнение стека от использования части моего индекса get/set. Я попытался поместить значения в список вместо этого в наборе get, но с плохими результатами.
class TrackList : CollectionBase
{
public Tracks this[int i]
{
get
{
return this[i];
}
set
{
this[i] = value;
}
}
}
Главный:
class Program
{
public static void Main(string[] args)
{
TrackList l1 = new TrackList();
l1[0] = new Tracks(1, "Random");
l1[1] = new Tracks(2, "Random");
l1[2] = new Tracks(3, "Random");
}
}
Ответ: я зацикливался в моем get/set. Вот рабочий код:
class TrackList : CollectionBase
{
public Tracks this[int i]
{
get
{
return (Tracks) List[i];
}
set
{
List[i] = value;
}
}
}
Главный:
class Program
{
public static void Main(string[] args)
{
TrackList l1 = new TrackList();
l1.Add(new Tracks(1, "random"));
l1.Add(new Tracks(2, "random"));
l1.Add(new Tracks(3, "random"));
}
}
2 ответа
Вы рекурсивно вызываете индексатор свойств бесконечное количество раз. Я думаю, что вы хотите это:
public Tracks this[int i]
{
get
{
return (Tracks) List[i];
}
set
{
List[i] = value;
}
}
Затем добавьте ваши элементы:
TrackList l1 = new TrackList();
l1.List.Add(new Tracks(1, "Random"));
l1.List.Add(new Tracks(2, "Random"));
l1.List.Add(new Tracks(3, "Random"));
Затем замените элемент с помощью индексатора:
l1[1] = new Tracks(2, "Replacement");
Или получить элемент с помощью индексатора:
var firstItem = l1[0];
Пытаясь использовать l1[i]
где i <= l1.Count
будет производить ArgumentOutOfRangeException
, как и следовало ожидать.
Во-первых, ваше исключение stackru вызвано вызовом вашего индексатора на себя:
return this[i];
Вы вызываете свой индексатор, который вызывает ваш индексатор, который затем вызывает ваш индексатор и так далее.
Ваша основная программа должна выглядеть так:
class Program
{
public static void Main(string[] args)
{
TrackList l1 = new TrackList();
l1.Add(new Tracks(1, "Random"));
l1.Add(new Tracks(2, "Random"));
l1.Add(new Tracks(3, "Random"));
}
}
Вы не можете просто получить доступ к индексам, которых еще нет в вашем списке.
После того, как вы добавили его нормально, чтобы получить из него определенный элемент:
Tracks t = l1[2]; // to get the third element in your list
НЕ используйте list.Add
в установщике индексатора. Это нарушает принцип наименьшего удивления.
В противном случае единственная возможность - создать список с предварительно определенным количеством нулевых элементов в вашем конструкторе. Но я не рекомендую это.
TrackList l1 = new TrackList(3); // in constructor create a list of 3 null elements
Правильный путь для всего подхода использует List<Tracks>
и вы сделали.