Рекомендуемое поведение GetEnumerator () при реализации IEnumerable и IEnumerator

Я реализую свой собственный перечислимый тип. Что-то похожее на это:

public class LineReaderEnumerable : IEnumerable<string>, IDisposable
{
    private readonly LineEnumerator enumerator;

    public LineReaderEnumerable(FileStream fileStream)
    {
        enumerator = new LineEnumerator(new StreamReader(fileStream, Encoding.Default));
    }

    public IEnumerator<string> GetEnumerator()
    {
        return enumerator;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public void Dispose()
    {
       enumerator.Dispose();
    }
}

Класс перечислителя:

public class LineEnumerator : IEnumerator<string>
{
    private readonly StreamReader reader;
    private string current;

    public LineEnumerator(StreamReader reader)
    {
        this.reader = reader;
    }

    public void Dispose()
    {
        reader.Dispose();
    }

    public bool MoveNext()
    {
        if (reader.EndOfStream)
        {
            return false;
        }
        current = reader.ReadLine();
        return true;
    }

    public void Reset()
    {
        reader.DiscardBufferedData();
        reader.BaseStream.Seek(0, SeekOrigin.Begin);
        reader.BaseStream.Position = 0;
    }

    public string Current
    {
        get { return current; }
    }

    object IEnumerator.Current
    {
        get { return Current; }
    }
}

У меня такой вопрос: должен ли я вызывать Reset () в перечислителе при вызове GetEnumerator () или это ответственность вызывающего метода (например, foreach) за это ?

Следует ли GetEnumerator () создавать новый экземпляр или он должен всегда возвращать один и тот же экземпляр?

7
задан Evren Kuzucuoglu 6 October 2011 в 10:39
поделиться