سؤال

في حلقة C# (لا تتردد في الإجابة على اللغات الأخرى)، ما الفرق بين الاستراحة والمتابعة كوسيلة لترك بنية الحلقة، والانتقال إلى التكرار التالي؟

مثال:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what's the difference between this and continue ?
        //continue;
    }
}
هل كانت مفيدة؟

المحلول

break سوف يخرج من الحلقة تماما continue سوف فقط يتخطى التكرار الحالي.

على سبيل المثال:

for (int i = 0; i < 10; i++) {
    if (i == 0) {
        break;
    }

    DoSomeThingWith(i);
}

سيؤدي الفاصل إلى خروج الحلقة عند التكرار الأول - DoSomeThingWith لن يتم إعدامه أبدًا.هذه هنا:

for (int i = 0; i < 10; i++) {
    if(i == 0) {
        continue;
    }

    DoSomeThingWith(i);
}

لن ينفذ DoSomeThingWith ل i = 0, ، ولكن الحلقة سوف يكمل و DoSomeThingWith سيتم تنفيذه ل i = 1 ل i = 9.

نصائح أخرى

إحدى الطرق السهلة حقًا لفهم ذلك هي وضع كلمة "حلقة" بعد كل كلمة من الكلمات الرئيسية.تصبح المصطلحات الآن منطقية إذا تمت قراءتها مثل العبارات اليومية.

break حلقة - التكرار مكسور ويتوقف.

continue حلقة - تستمر الحلقة في التنفيذ مع التكرار التالي.

استراحة يتسبب في خروج عداد البرنامج من نطاق الحلقة الأعمق

for(i = 0; i < 10; i++)
{
    if(i == 2)
        break;
}

يعمل مثل هذا

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto BREAK;
}
BREAK:;

يكمل يقفز إلى نهاية الحلقة.في حلقة for، استمر بالانتقال إلى تعبير الزيادة.

for(i = 0; i < 10; i++)
{
    if(i == 2)
        continue;

    printf("%d", i);
}

يعمل مثل هذا

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto CONTINUE;

    printf("%d", i);

    CONTINUE:;
}

break سوف يتوقف foreach حلقة كاملة، continue سوف انتقل إلى التالي DataRow.

اعتدت دائمًا أن أشعر بالحيرة بشأن ما إذا كان يجب علي استخدام الاستراحة أم الاستمرار.وهذا ما يساعدني على التذكر:

متى تستخدم الاستراحة مقابل المتابعة؟

  1. استراحة - إنه مثل الانفصال.إنه لأمر محزن، يا رفاق فراق.

Break

  1. يكمل - يعني أنك ستمنح اليوم راحة وتسوي كل شيء غدًا (أي.تخطي التكرار الحالي)!

Continue

هناك أكثر من عدد قليل من الناس الذين لا يحبون break و continue.آخر شكوى رأيتها بشأنهم كانت في جافا سكريبت:الأجزاء الجيدة بواسطة دوجلاس كروكفورد.ولكنني أجد أن استخدام أحدها في بعض الأحيان يؤدي إلى تبسيط الأمور حقًا، خاصة إذا كانت لغتك لا تتضمن حرف do-while أو do-until نمط الحلقة.

أنا أميل إلى استخدام break في الحلقات التي تبحث في قائمة عن شيء ما.بمجرد العثور عليه، ليس هناك فائدة من الاستمرار، لذا من الأفضل أن تستقيل.

أنا أستعمل continue عند القيام بشيء ما بمعظم عناصر القائمة، ولكنك لا تزال ترغب في تخطي القليل منها.

ال break تكون العبارة مفيدة أيضًا عند الاقتراع للحصول على استجابة صالحة من شخص ما أو شيء ما.بدلاً من:

Ask a question
While the answer is invalid:
    Ask the question

يمكنك التخلص من بعض الازدواجية والاستخدام:

While True:
    Ask a question
    If the answer is valid:
        break

ال do-until الحلقة التي ذكرتها من قبل هي الحل الأكثر أناقة لهذه المشكلة بالذات:

Do:
    Ask a question
    Until the answer is valid

لا الازدواجية، ولا break حاجة سواء.

لقد أعطى الجميع تفسيرا جيدا للغاية.ما زلت أنشر إجابتي فقط لإعطاء مثال إذا كان ذلك يمكن أن يساعد.

// break statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        break; // It will force to come out from the loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}

هنا هو الإخراج:

0 [مطبوع] 1 [مطبوع] 2 [مطبوع]

لذلك لن يتم عرض 3[مطبوع] و4[مطبوع] نظرًا لوجود فاصل عندما يكون i == 3

//continue statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        continue; // It will take the control to start point of loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}

هنا هو الإخراج:

0 [مطبوع] 1 [مطبوع] 2 [مطبوع] 4 [مطبوع]

لذلك لن يتم عرض 3[Printed] نظرًا لوجود متابعة عندما == 3

استراحة

يفرض الكسر على الحلقة الخروج فورًا.

يكمل

وهذا يفعل عكس الكسر.بدلاً من إنهاء الحلقة، فإنها تتكرر مرة أخرى على الفور، متخطية بقية التعليمات البرمجية.

على سبيل المثال

foreach(var i in Enumerable.Range(1,3))
{
    Console.WriteLine(i);
}

يطبع 1، 2، 3 (على أسطر منفصلة).

أضف شرط الاستراحة عند i = 2

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        break;

    Console.WriteLine(i);
}

الآن تطبع الحلقة 1 وتتوقف.

استبدل الفاصل بالمتابعة.

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        continue;

    Console.WriteLine(i);
}

الآن قم بتكرار المطبوعات 1 و 3 (تخطي 2).

هكذا، break يوقف الحلقة، في حين continue يتخطى إلى التكرار التالي.

روبي للأسف مختلفة بعض الشيء.ملاحظة:ذاكرتي ضبابية بعض الشيء في هذا الشأن، لذا أعتذر إذا كنت مخطئًا

بدلاً من الفاصل/المتابعة، يحتوي على الفاصل/التالي، والذي يتصرف بنفس الطريقة فيما يتعلق بالحلقات

الحلقات (مثل أي شيء آخر) هي تعبيرات، و"ترجع" آخر شيء فعلته.في معظم الأحيان، يكون الحصول على القيمة المرجعة من الحلقة أمرًا لا معنى له، لذلك يقوم الجميع بذلك

a = 5
while a < 10
    a + 1
end

ومع ذلك يمكنك القيام بذلك

a = 5
b = while a < 10
    a + 1
end # b is now 10

ومع ذلك، فإن الكثير من أكواد روبي "تحاكي" حلقة باستخدام كتلة.المثال الكنسي هو

10.times do |x|
    puts x
end

نظرًا لأنه من الشائع جدًا أن يرغب الأشخاص في القيام بأشياء نتيجة كتلة، فهذا هو المكان الذي تصبح فيه الأمور فوضوية.الفاصل/التالي يعني أشياء مختلفة في سياق الكتلة.

Break سوف يقفز من الكود الذي يسمى الكتلة

بعد ذلك، سيتم تخطي بقية الكود الموجود في الكتلة، و"إرجاع" ما تحدده إلى المتصل في الكتلة.وهذا لا معنى له دون أمثلة.

def timesten
    10.times{ |t| puts yield t }
end


timesten do |x|
   x * 2
end
# will print
2
4
6
8 ... and so on


timesten do |x|
    break
    x * 2
end
# won't print anything. The break jumps out of the timesten function entirely, and the call to `puts` inside it gets skipped

timesten do |x|
    break 5
    x * 2
end
# This is the same as above. it's "returning" 5, but nobody is catching it. If you did a = timesten... then a would get assigned to 5

timesten do |x|
    next 5
    x * 2
end 
# this would print
5
5
5 ... and so on, because 'next 5' skips the 'x * 2' and 'returns' 5.

إذن أجل.روبي رائعة، ولكن لديها بعض الحالات الزاوية الفظيعة.هذا هو ثاني أسوأ شيء رأيته خلال سنوات استخدامه :-)

إجابة بسيطة:

استراحة يخرج من الحلقة على الفور.
يكمل يبدأ معالجة العنصر التالي.(إذا كان هناك أي منها، بالانتقال إلى سطر التقييم الخاص بـ for/while)

أرجو أن أذكر ما هو واضح:لاحظ أن إضافة لا فاصل ولا متابعة، سوف يستأنف برنامجك؛أي.لقد حوصرت بسبب خطأ معين، ثم بعد تسجيله، أردت استئناف المعالجة، وكان هناك المزيد من مهام التعليمات البرمجية بين الصف التالي، لذلك سمحت لها بالفشل.

للخروج تمامًا من حلقة foreach، استراحة يستخدم؛

للانتقال إلى التكرار التالي في الحلقة، يكمل يستخدم؛

استراحة يكون مفيدًا إذا كنت تقوم بالتكرار عبر مجموعة من الكائنات (مثل الصفوف في Datatable) وكنت تبحث عن تطابق معين، وعندما تجد هذا التطابق، ليست هناك حاجة للمتابعة خلال الصفوف المتبقية، لذلك تريد الخروج .

يكمل يكون مفيدًا عندما تنجز ما تحتاج إليه داخل تكرار الحلقة.سيكون لديك عادة يكمل بعد لو.

إذا كنت لا تريد استخدامها استراحة كل ما عليك فعله هو زيادة قيمة I بطريقة تجعل شرط التكرار خاطئًا ولن يتم تنفيذ الحلقة في التكرار التالي.

for(int i = 0; i < list.Count; i++){
   if(i == 5)
    i = list.Count;  //it will make "i<list.Count" false and loop will exit
}

أما بالنسبة للغات الأخرى:

'VB
For i=0 To 10
   If i=5 then Exit For '= break in C#;
   'Do Something for i<5
next

For i=0 To 10
   If i=5 then Continue For '= continue in C#
   'Do Something for i<>5...
Next
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top