«Доходность» в IEnumerator или IEnumerable? - PullRequest
0 голосов
/ 24 сентября 2018

Я искал этот пункт и пока не получаю никакой информации !.

Я много видел видео и красную кучу статей о «Возвращении дохода», и я думаю, что я лучше понимаю об этом, но есть момент, который я не могу получить

Чтоправильный интерфейс я должен использовать возвращение в него?(Конечно, возвращение доходности будет использоваться в цикле, но в каком интерфейсе).

Я имею в виду, что в этой точке есть различия, я видел, как некоторые люди создавали "итератор" в пределах IEnumerator, например:

static string[] Names = { "Name1", "Name2", "Name3" };

    static IEnumerator Test()
    {
        for (int i = 0; i < Names.Length; i++)
        {
            yield return Names[i];
        }
    }

и некоторые другие используют IEnumerable:

        static IEnumerable Test()
    {
        for (int i = 0; i < Names.Length; i++)
        {
            yield return Names[i];
        }
    }

Я предполагаю, что лучше создать «Итератор», используя «Возврат доходности» внутри IEnumerable интерфейс, потому что в общем случае IEnumerable отвечает за доступ к классу (точнее, возвращает экземпляр класса (Object)), который защищает логику итерации.и что именно происходит с компилятором (сахаром ключевого слова yield) в этом случае.

 private static IEnumerable Test() => new <Test>d__1(-2);
//decompiled code of Test() method above Using reflector tool

Есть идеи по этому поводу?

1 Ответ

0 голосов
/ 24 сентября 2018

Компилятор поддерживает оба, и фактически, если возвращаемое значение равно IEnumerable<T>, сгенерированный класс будет реализовывать оба интерфейса, где GetEnumerator() реализован примерно так (примерно):

IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
    if (state == Created && initialThreadId == Environment.CurrentManagedThreadId)
    {
        state = EnumerationStarted;
        return this;
    }
    else
        return new GeneratedEnumerableEnumerator(state: EnumerationStarted);
}

state в приведенном выше коде int, Created и EnumerationStarted не являются реальными именами констант.state может иметь много внутренних значений в зависимости от сложности вашей реализации.

Что такое правильный интерфейс, если я должен использовать возвращение

Это зависит от вашего случая.Если вы внедряете IEnumerable<T>.GetEnumerator() в свой тип коллекции, используйте IEnumerator<T>.И если вам нужно вернуть IEnumerable<T>, содержание которого легко получить, используйте IEnumerable<T>.И то, и другое может иметь смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...