Roy*_*bot 4 .net c# ienumerable
我做了以下工作
class Program
{
class GenEnumerator<T> : IEnumerable
{
public T[] Values { get; set; }
public IEnumerator GetEnumerator()
{
for (int i = 0; i < Values.Length; i++)
yield return Values[i];
}
}
static void Main(string[] args)
{
GenEnumerator<string> g = new GenEnumerator<string>();
g.Values = new string[] { "a", "b", "c", "d", "e" };
g.GetEnumerator().MoveNext();
Console.WriteLine(g.GetEnumerator().Current);
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud)
g.GetEnumerator().Current永远是空的.
但如果我这样做 - var a = g.GetEnumerator();
当前的proeperty得到一个值,并且工作正常
IEnumerator如果我想在Current没有IEnumerator类型变量的情况下使用它是否意味着我必须显式继承该类并实现其方法和属性?
谢谢,罗伊
您正在创建的新实例,GenEnumerator通过调用每次GetEnumerator,这就是为什么你Current是null.而是将其存储在一个字段中并使用它.
var e = g.GetEnumerator();
if(e.MoveNext())
{
var current = e.Current;
}
Run Code Online (Sandbox Code Playgroud)
这是因为为了Current使其变为非null,您需要调用MoveNext()同一个对象.
您当前的代码调用MoveNext()临时对象.这是你打电话时发生的事情
g.GetEnumerator().MoveNext()`;
Console.WriteLine(g.GetEnumerator().Current);
Run Code Online (Sandbox Code Playgroud)
GetEnumerator()返回一个对象xx.MoveNext()进行x 有资格进行垃圾收集,因为它不会从程序中的任何变量引用.g.GetEnumerator().Current,将y返回一个新对象y.Current,返回null,因为没有调用MoveNexton对象ya但是,当您添加变量时,您调用MoveNext并Current在同一个对象上修复问题:
GetEnumerator()返回一个对象x,该对象被赋值给变量aa.MoveNext()进行a.Current进行| 归档时间: |
|
| 查看次数: |
3437 次 |
| 最近记录: |