View Single Post
  #2 (permalink)  
Old June 4th, 2018, 03:06 PM
ChristianNagel ChristianNagel is offline
Wrox Author
Points: 1,160, Level: 13
Points: 1,160, Level: 13 Points: 1,160, Level: 13 Points: 1,160, Level: 13
Activity: 0%
Activity: 0% Activity: 0% Activity: 0%
 
Join Date: Sep 2010
Location: Austria
Posts: 174
Thanks: 3
Thanked 53 Times in 53 Posts
Default

The magic is the yield statement.

The yield statement creates an enumerator. Because of the yield statement, invoking the Cross method in the GameMoves constructor, the code you see implemented in this method will not be called - you can verify this setting breakpoints and running the application in the debugger. Instead, the yield statement creates a class implementing the interface IEnumerator. An object of this class is returned invoking the Cross method.

Code:
    
    public class GameMoves
    {
        private IEnumerator _cross;
        private IEnumerator _circle;
        public GameMoves()
        {
            _cross = Cross();
            _circle = Circle();
        }
        private int _move = 0;
        const int MaxMoves = 9;
        public IEnumerator Cross()
        {
            while (true)
            {
                WriteLine($"Cross, move {_move}");
                if (++_move >= MaxMoves)
                    yield break;
                yield return _circle;
            }
        }
        public IEnumerator Circle()
        {
            while (true)
            {
                WriteLine("Circle, move {0}", _move);
                if (++_move >= MaxMoves)
                    yield break;
                yield return _cross;
            }
        }
    }
Invoking the MoveNext method, you'll see the debugger stops at a breakpoint within the Cross method - at this time the _cross and _circle fields are already filled with the IEnumerator implementing objects.


Code:
 
            var game = new GameMoves();
            IEnumerator enumerator = game.Cross();
            while (enumerator.MoveNext())
            {
                enumerator = enumerator.Current as IEnumerator;
            }
I hope this helps.


For discussions and questions on the new book Professional C# 7 and .NET Core 2.0, please create an issue in https://github.com/ProfessionalCShar...ssionalCSharp7.

For Professional C# 6 questions, you can use GitHub as well: https://github.com/ProfessionalCShar...ssionalCSharp6.
__________________
Christian
CN innovation
Visit my blog at: csharp.christiannagel.com
Follow me on twitter: @christiannagel

Last edited by ChristianNagel; June 5th, 2018 at 04:58 AM.
Reply With Quote