【发布时间】:2011-10-06 10:39:47
【问题描述】:
我正在实现自己的可枚举类型。类似这样的东西:
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; }
}
}
我的问题是:我应该在调用 GetEnumerator() 时在枚举器上调用 Reset() 还是调用方法(如 foreach)的责任?
GetEnumerator() 应该创建一个新实例,还是应该始终返回相同的实例?
【问题讨论】:
-
确保枚举器实现
IDisposable()- 请参阅stackoverflow.com/questions/4982396/… -
@Jeremy 实际上是设计的,IEnumerator 有一个 Dispose 方法你需要实现
标签: c# .net ienumerable