كيف يعمل هذا الجزء من التعليمات البرمجية
-
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
.هذا لا معنى له حقا بالنسبة لي, أن نكون صادقين;لم أر قط هذا النوع من التعليمات البرمجية وأتساءل عما إذا كان يفعل شيئا مفيدا بالفعل?