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> и вы сделали.

Другие вопросы по тегам