التبديل C #:حالة عدم الوقوع في قيود الحالات الأخرى

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

  •  09-06-2019
  •  | 
  •  

سؤال

هذا السؤال هو نوع من الإضافة إلى هذا سؤال

في C#، لا يمكن لحالة التبديل أن تنتقل إلى حالات أخرى، وهذا يسبب خطأ في الترجمة.في هذه الحالة أقوم فقط بإضافة بعض الأرقام إلى إجمالي الشهر للشهر المحدد وكل شهر لاحق بعد ذلك.(مثال بسيط وليس حقيقيا)

switch (month)
{
    case 0:
      add something to month totals
    case 1:
      add something to month totals
    case 2:
      add something to month totals
    default:
      break;
}

هل هناك بديل منطقي لهذا في C# دون الحاجة إلى كتابة الكثير من عبارات if؟

if (month <= 0)
   add something to month
if (month <= 1)
   add something to month
if (month <= 2)
   add something to month
.... etc
هل كانت مفيدة؟

المحلول

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

بدلاً من ذلك، ماذا لو قمت بتنفيذ نمط المواصفات لمعرفة ما إذا كان هناك شيء مطابق، ثم التصرف بناءً عليه؟

foreach(MonthSpecification spec in this.MonthSpecifications)
{
   if(spec.IsSatisfiedBy(month))
       spec.Perform(month);
}

ثم يمكنك فقط إضافة مواصفات مختلفة تتوافق مع ما تحاول القيام به.

من الصعب معرفة ما هو نطاقك، لذلك قد يكون المثال الخاص بي مفتعلًا بعض الشيء.

نصائح أخرى

في عبارات التبديل C#، يمكنك تجاوز الحالات فقط إذا لم يكن هناك بيان للحالة التي تريد تجاوزها

switch(myVar)
{
   case 1:
   case 2: // Case 1 or 2 get here
      break;
}

ومع ذلك، إذا كنت تريد تنفيذ بيان ما، فيجب عليك استخدام GOTO المخيف

switch(myVar)
    {
       case 1: // Case 1 statement
               goto case 2;
       case 2: // Case 1 or 2 get here
          break;
    }

هل تضيف الثوابت؟إذا كان الأمر كذلك، فربما يعمل شيء مثل هذا (بناء جملة C):

const int addToTotals[] = {123, 456, ..., 789};

for(i=month;i<12;i++)
   totals += addToTotals[i];

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

-آدم

هناك بالفعل سؤال يتناول هذا الموضوع:

قيود بيان التبديل C# - لماذا؟

يحرر:

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

اكتب حالات التبديل بترتيب عكسي

case 2:

case 1:

case 0:

break;


default:

امل ان يساعد!

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