شرح - C#حلقة-كسر مقابل الاستمرار




شرح delegate c# (10)

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

مثال:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what's the difference between this and continue ?
        //continue;
    }
}

إجابة بسيطة:

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


إذا كنت لا ترغب في استخدام فاصل ، فقم فقط بزيادة قيمة I بطريقة تجعل من حالة التكرار false ولن يتم تنفيذ الحلقة في التكرار التالي.

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
}

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

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

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


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

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 التخطى إلى التكرار التالي.


كما للغات أخرى:

'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

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

بدلا من كسر / متابعة ، فقد كسر / التالي ، والتي تتصرف نفسها من حيث الحلقات

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

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

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

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

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

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.

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


هناك أكثر من عدد قليل من الناس الذين لا يحبون break continue . أحدث الشكوى التي رأيتها عنهم كانت في JavaScript: The Good Parts by Douglas Crockford. ولكني أجد أن استخدام أحدها أحيانًا يبسط الأمور حقًا ، خاصةً إذا كانت لغتك لا تتضمن نمطًا للحركة أو فعلًا.

أنا أميل إلى استخدام 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 even التي ذكرتها من قبل هي الحل الأكثر أناقة لهذه المشكلة تحديدًا:

Do:
    Ask a question
    Until the answer is valid

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


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


break وقف حلقة foreach تماما ، continue تخطي إلى DataRow المقبل.


استراحة

يفرض Break حلقة للخروج فوراً.

استمر

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





enumeration