Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

yield return

7 views
Skip to first unread message

andre...@gmail.com

unread,
Feb 10, 2008, 3:22:58 AM2/10/08
to
Why "yield return" results in generating of a nested class enumerator,
rather than a nested struct one?

andre...@gmail.com

unread,
Feb 20, 2008, 5:13:39 AM2/20/08
to
On Feb 10, 9:22 am, andreis...@gmail.com wrote:
> Why "yieldreturn" results in generating of a nested class enumerator,
> rather than a nestedstructone?

ok. the point is that structs get boxed if being casted to an
interface, so the only way to benefit from a struct enumerator is to
make it public (please note PUBLIC struct MyEnumerator):

internal class Program
{
private static void Main()
{
Stopwatch s = new Stopwatch();
s.Start();
MyEnumerable<int> mylist = new MyEnumerable<int>(); foreach
(int i in mylist) { int a = i; }
s.Stop();
Console.WriteLine("Struct iterator : " +
s.ElapsedMilliseconds + "ms");

s.Reset();
s.Start();
MyEnumerableClass<int> mylist2 = new MyEnumerableClass<int>();
foreach (int i in mylist2) { int a = i; }
s.Stop();
Console.WriteLine("Class iterator : " +
s.ElapsedMilliseconds + "ms");
}
}

class MyEnumerable<T> : IEnumerable<T>
{
public MyEnumerator GetEnumerator() { return new MyEnumerator(); }
IEnumerator<T> IEnumerable<T>.GetEnumerator() { return
GetEnumerator(); }
IEnumerator IEnumerable.GetEnumerator() { return
GetEnumerator(); }

public struct MyEnumerator : IEnumerator<T>
{
private static int count = 10000000;
object IEnumerator.Current { get { return Current; } }
public void Dispose() { }
public bool MoveNext() { return (count-- > 0); }
public void Reset() { }
public T Current { get { return default(T); } }
}
}

class MyEnumerableClass<T> : IEnumerable<T>
{
public MyEnumeratorClass GetEnumerator() { return new
MyEnumeratorClass(); }
IEnumerator<T> IEnumerable<T>.GetEnumerator() { return
GetEnumerator(); }
IEnumerator IEnumerable.GetEnumerator() { return
GetEnumerator(); }

public class MyEnumeratorClass : IEnumerator<T>
{
private static int count = 10000000;
object IEnumerator.Current { get { return Current; } }
public void Dispose() { }
public bool MoveNext() { return (count-- > 0); }
public void Reset() { }
public T Current { get { return default(T); } }
}
}


So, I presume since yield return generates a class, it could be an
issue exposing an autogenerated class/struct, so they left it private
AND class, since being a private struct does not add any value.

That's what I think.

0 new messages