yield break والإنهاء المبكر
أوقفوا التكرار وفقًا لشرط
yield break والإنهاء المبكر درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
إيقاف أسلوب التكرار مبكرًا
قد ترغبون أحيانًا في أن يتوقف أسلوب التكرار عن إنتاج القيم قبل بلوغ النهاية الطبيعية. تنهي عبارة yield break التسلسل فورًا، مثل return لأساليب التكرار.
الاستخدام الأساسي لـ yield break
تنهي yield break أسلوب التكرار. فلا تُنتج أي قيم أخرى، وتنتهي حلقة foreach التي تستهلكه.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> UpToFive()
{
for (int i = 1; i <= 100; i++)
{
if (i > 5) yield break;
yield return i;
}
}
public static void Main()
{
foreach (var n in UpToFive())
Console.WriteLine(n);
}
}التكرار ما دام الشرط متحققًا
من الأنماط الشائعة إرجاع العناصر ما دام الشرط صحيحًا، ثم التوقف. وتجعل yield break هذا النمط واضحًا.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> WhileSmall(IEnumerable<int> nums)
{
foreach (var n in nums)
{
if (n >= 10) yield break;
yield return n;
}
}
public static void Main()
{
foreach (var n in WhileSmall(new[] { 2, 4, 8, 12, 3 }))
Console.WriteLine(n);
}
}عبارات الحماية باستخدام yield break
يمكنكم استخدام yield break في بداية أسلوب التكرار بوصفها عبارة حماية. فإذا كان الإدخال فارغًا أو غير صالح، فأرجعوا عدم وجود أي عناصر.
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
static IEnumerable<string> Lines(string text)
{
if (string.IsNullOrEmpty(text)) yield break;
foreach (var line in text.Split('\n'))
yield return line;
}
public static void Main()
{
foreach (var l in Lines("a\nb\nc"))
Console.WriteLine(l);
Console.WriteLine("empty count: " + Lines("").Count());
}
}تحديد عدد القيم الناتجة
استخدموا عدّادًا مع yield break لوضع حد لعدد العناصر التي ينتجها أسلوب التكرار، حتى عند التعامل مع مصدر طويل.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Take(IEnumerable<int> source, int max)
{
int count = 0;
foreach (var item in source)
{
if (count++ >= max) yield break;
yield return item;
}
}
public static void Main()
{
foreach (var n in Take(new[] { 1, 2, 3, 4, 5 }, 3))
Console.WriteLine(n);
}
}break لدى المستدعي مقابل yield break
هناك طريقتان لانتهاء التسلسل. يمكن لـالمستدعي التوقف عن طلب القيم باستخدام break، أو يمكن لـأسلوب التكرار التوقف عن الإنتاج باستخدام yield break. تنهي الطريقتان الحلقة، لكن لسببين مختلفين.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Counting()
{
int i = 1;
while (true) yield return i++;
}
public static void Main()
{
// Caller decides to stop with break
foreach (var n in Counting())
{
if (n > 3) break;
Console.WriteLine(n);
}
}
}تنهي yield break أسلوب التكرار الحالي فقط
تخرج yield break من أسلوب التكرار الذي تظهر فيه، لا من أي حلقة خارجية لدى المستدعي. وتعود السيطرة إلى الجهة التي كانت تعدّد العناصر.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Bounded(IEnumerable<int> nums, int limit)
{
foreach (var n in nums)
{
if (n > limit) yield break; // ends Bounded only
yield return n;
}
}
public static void Main()
{
var result = Bounded(new[] { 1, 2, 9, 3 }, 5);
Console.WriteLine("iterator created, still running");
foreach (var n in result) Console.WriteLine(n);
}
}لا توجد yield return بعد yield break
بمجرد تنفيذ yield break، ينتهي أسلوب التكرار. ولا يمكن لأي شفرة تأتي بعدها فعليًا في المسار نفسه أن تنتج قيمًا.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Demo(bool stopEarly)
{
yield return 1;
if (stopEarly) yield break;
yield return 2;
yield return 3;
}
public static void Main()
{
Console.WriteLine("stopEarly = true:");
foreach (var n in Demo(true)) Console.WriteLine(n);
Console.WriteLine("stopEarly = false:");
foreach (var n in Demo(false)) Console.WriteLine(n);
}
}دمج التصفية مع التوقف المبكر
يمكنكم التصفية والإنهاء داخل أسلوب التكرار نفسه: تخطّوا بعض القيم، وأرجعوا قيمًا أخرى، وتوقفوا بالكامل عند ظهور قيمة حارسة.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> UntilZero(IEnumerable<int> nums)
{
foreach (var n in nums)
{
if (n == 0) yield break; // stop at sentinel
if (n < 0) continue; // skip negatives
yield return n;
}
}
public static void Main()
{
foreach (var n in UntilZero(new[] { 3, -1, 5, 0, 9 }))
Console.WriteLine(n);
}
}كتل yield break وfinally
إذا كان المكرّر لديك يحتوي على try/finally، فستُنفَّذ كتلة finally أيضًا عندما ينهي yield break التسلسل. وهذا يضمن تنفيذ عمليات التنظيف، مثل إغلاق الموارد.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> WithCleanup()
{
try
{
yield return 1;
yield break;
}
finally
{
Console.WriteLine("cleanup ran");
}
}
public static void Main()
{
foreach (var n in WithCleanup())
Console.WriteLine(n);
}
}جرّب بنفسك
اجمع بين التصفية والإنهاء المبكر: أعد الأعداد الموجبة، لكن أوقف التنفيذ تمامًا عندما يتجاوز مجموعها التراكمي حدًا معينًا.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> WithinBudget(IEnumerable<int> nums, int budget)
{
int spent = 0;
foreach (var n in nums)
{
if (n <= 0) continue;
if (spent + n > budget) yield break;
spent += n;
yield return n;
}
}
public static void Main()
{
foreach (var n in WithinBudget(new[] { 3, -2, 4, 5, 1 }, 10))
Console.WriteLine(n);
}
}تحقق سريع
تذكّر دور yield break.
مراجعة
ينهي yield break المكرّر مبكرًا.
- يعمل مثل
returnبلا قيمة في المكرّرات. - استخدمه لتنفيذ منطق take-while، وعمليات الحراسة، وحدود العدد.
- ينهي المكرّر فقط، وليس حلقة المستدعي.
- تستمر كتل
finallyفي التنفيذ، مما يضمن التنظيف.
تعلم C# مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 93
- الدروس
- 346
الأسئلة الشائعة
هل درس «yield break والإنهاء المبكر» مجاني؟
نعم — نص درس «yield break والإنهاء المبكر» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «yield break والإنهاء المبكر»؟
أوقفوا التكرار وفقًا لشرط تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «yield break والإنهاء المبكر»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساليب التكرار باستخدام yield return
- yield break والإنهاء المبكر
- دلالات التقييم الكسول
- الأنواع القابلة للتعداد المخصّصة