كيف يعمل هذا الجزء من التعليمات البرمجية

StackOverflow https://stackoverflow.com/questions/3293964

  •  18-09-2020
  •  | 
  •  

سؤال

محدث.أهلاً, أعرف كيف يعمل الرمز أدناه.وأنا أعلم أن الصليب ، ودائرة تشير إلى الصليب () ، ودائرة () الأسلوب.ولكن ما زلت ملء الخلط قليلا مع هذا الجزء من التعليمات البرمجية.هل يمكنك شرح ذلك لي?

public GameMoves()
            {
                cross = Cross();
                circle = Circle();
            }

كل رمز

 static void Main(string[] args)
            {
                GameMoves game = new GameMoves();
                IEnumerator enumerator = game.Cross();
                while (enumerator.MoveNext())
                {
                    enumerator = (IEnumerator)enumerator.Current;
                }
            }
        }

        public class GameMoves
        {
            private IEnumerator cross;
            private IEnumerator circle;

            public GameMoves()
            {
                cross = Cross();
                circle = Circle();
            }

            private int move = 0;
            public IEnumerator Cross()
            {
                while (true)
                {
                    Console.WriteLine("X, step {0}", move);
                    move++;
                    if (move > 9)
                        yield break;
                    yield return circle;
                }
            }

            public IEnumerator Circle()
            {
                while (true)
                {
                    Console.WriteLine("O, step {0}", move);
                    move++;
                    if (move > 9)
                        yield break;
                    yield return cross;
                }
            }
        }
هل كانت مفيدة؟

المحلول

كلاهما Cross و Circle هي مولدات.يعودون سلسلة من objectق عن طريق IEnumerable.هذا هو ، يمكنك الكتابة:

foreach (var cross in Cross())  // works with Circle, also
{
    // ...
}

وعلى كل تكرار حلقة ، يتم إنشاء العنصر التالي ليتم إرجاعها داخل Cross أو Circle الطريقة.هذه الأساليب لا تنفذ كل شيء في وقت واحد ، بدلا من ذلك في كل مرة yield return يتم التوصل إلى بيان ، وسوف يستمر تنفيذ البرنامج في رمز الدعوة (و foreach حلقة) ، ويتم استئناف الرمز داخل المولد فقط عند الحاجة إلى العنصر التالي.


سكرتير خاص.: قبل انقطاع اتصال الإنترنت الخاص بي لعدة ساعات, كنت أرغب أيضا في التعليق على الحقيقة الغريبة المتمثلة في أن المولدات الخاصة بك تستمر في إعادة الإشارات إلى نفسها عبر yield return.هذا لا معنى له حقا بالنسبة لي, أن نكون صادقين;لم أر قط هذا النوع من التعليمات البرمجية وأتساءل عما إذا كان يفعل شيئا مفيدا بالفعل?

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top