هل يتطابق نمط أفضل من التبديل التقليدي القائم على النوع؟
بلغات مثل C# التي لا تدعم "التبديل حسب النوع" المباشر ، عادةً ما يستخدم المبرمجون الهيكل الكلاسيكي "إذا ... إذا ... أخرى" لمحاكاة التبديل المستند إلى النوع. ومع ذلك ، مع زيادة عدد الأنواع المعنية ، يصبح هذا النهج طويلًا وهشًا.
نمط مطابق في C# 7 وبعد ذلك
بدءًا من C# 7 ، يوفر مطابقة الأنماط طريقة أكثر أناقة وموجزة للتبديل حسب النوع. يسمح بناء جملة "نوع الحالة" بمطابقة أنواع المتغيرات ، واستبدالًا بفعالية عبارة "if" مع حالة من نمط معين.
على سبيل المثال:
void Foo(object o)
{
switch (o)
{
case A a: // 匹配A类型
a.Hop();
break;
case B b: // 匹配B类型
b.Skip();
break;
default:
throw new ArgumentException("意外类型: " o.GetType());
}
}
C# 6 باستخدام NameOf ()
في C# 6 ، يمكنك استخدام مشغل NameOF () للحصول على اسم النوع ديناميكيًا لبيانات التبديل. على الرغم من أنه ليس موجزًا مثل مطابقة الأنماط ، إلا أنه يوفر بديلاً أسهل لتجنب أسماء الأنواع المشفرة.
void Foo(object o)
{
switch (o.GetType().Name)
{
case nameof(A):
// 处理A类型
break;
case nameof(B):
// 处理B类型
break;
default:
// 处理其他类型
break;
}
}
التبديل المستند إلى النوع في C# 5 وأبرين
بالنسبة لـ C# 5 وأقدما ، ليس لديك خيار سوى استخدام هيكل "if ... if else ... else" بأسماء من النوع المتشددين. يمكن أن يصبح هذا النهج خرقاء ومعرضة للخطأ.
void Foo(object o)
{
if (o is A)
{
// 处理A类型
}
else if (o is B)
{
// 处理B类型
}
else
{
// 处理其他类型
}
}
ختاماً
تطابق النمط في C# 7 ويوفر لاحقًا وسيلة قوية وموجزة لمحاكاة التبديل القائم على النوع. إنه يلغي الحاجة إلى السلاسل الشرطية ، ويحسن قابلية قراءة الكود ، ويقلل من إمكانية وجود أخطاء. بالنسبة للإصدارات السابقة من C#، فإن استخدام بيانات NameOF () وتبديل بديل أكثر مرونة من أسماء الأنواع المرمزة ، في حين أن بنية كلاسيكية "إذا ... إذا ... أخرى" لا تزال خيارًا أقل مثاليًا ولكنه لا يزال قابلاً للتطبيق.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3