c# تبديل التبديل مع الحقول الثابتة




.net static (5)

لنفترض أن لدي مجموعة من الحقول الثابتة وأريد استخدامها في التبديل:

public static string PID_1 = "12";
public static string PID_2 = "13";
public static string PID_3 = "14";

switch(pid)
{
    case PID_1:
        //Do something 1
        break;
    case PID_2:
        //Do something 2
        break;
    case PID_3:
        //Do something 3
        break;
    default:
        //Do something default
        break;
}

منذ C # لا يسمح بيان غير كونست داخل التبديل. أريد أن أفهم ما هو القصد من هذا النوع من التصميم. كيف أفعل شيئا من هذا القبيل في c #؟


وينبغي أن تكون حجة الحالة ثابتة في وقت التجميع.

حاول استخدام const بدلا من ذلك:

public const string PID_1 = "12";
public const string PID_2 = "13";
public const string PID_3 = "14";

... C # لا يسمح ببيان غير كونست داخل المفتاح ...

إذا لم تتمكن من استخدام:

public const string PID_1 = "12";
public const string PID_2 = "13";
public const string PID_3 = "14";

يمكنك استخدام القاموس :)

....
public static string PID_1 = "12";
public static string PID_2 = "13";
public static string PID_3 = "14";



// Define other methods and classes here

void Main()
{
   var dict = new Dictionary<string, Action>
   {
    {PID_1, ()=>Console.WriteLine("one")},
    {PID_2, ()=>Console.WriteLine("two")},
    {PID_3, ()=>Console.WriteLine("three")},
   };
   var pid = PID_1;
   dict[pid](); 
}


يبدو أن قيم السلسلة هذه يجب أن تكون ثابتة.

public const string PID_1 = "12";
public const string PID_2 = "13";
public const string PID_3 = "14";

إذا كان هذا ليس خيارا (يتم تغييرها فعلا في وقت التشغيل)، ثم يمكنك ريفاكتور هذا الحل في سلسلة من إذا / إلس إذا البيانات.

لماذا يجب أن تكون بيانات الحالة ثابتة؛ من خلال وجودها تكون ثابتة فإنه يسمح للبيان ليكون الأمثل إلى حد كبير بكثير. هو في الواقع أكثر كفاءة من سلسلة من إذا / إلس إذا البيانات (وإن لم يكن بشكل كبير حتى إذا لم يكن لديك الكثير من الشيكات المشروطة التي تستغرق وقتا طويلا). فإنه سيتم إنشاء ما يعادل جدول التجزئة مع القيم بيان حالة مفاتيح. ولا يمكن استخدام هذا النهج إذا تغيرت القيم.


أنا أفترض أن هناك سبب لم تعلن هذه المتغيرات كما const . هكذا قال:

بيان switch هو الاختزال فقط لحفنة من if / else if البيانات. لذلك إذا كنت تستطيع ضمان أن PID_1 و PID_2 و PID_3 لن تكون متساوية أبدا ، فإن ما ورد أعلاه يساوي ما يلي:

if (pid == PID_1) {
    // Do something 1
}
else if (pid == PID_2) {
    // Do something 2
}
else if (pid == PID_3) {
    // Do something 3
}
else {
    // Do something default
}






switch-statement