فوائد العام (إرشادات برمجة C#)

يوفر العام حلاً للقيد في الإصدارات السابقة من وقت تشغيل اللغة العامة ولغة C# في التعميم الذي يتم إنجاز عن طريق صب أنواع من وإلى نوع قاعدة عالمية Object. يمكنك إنشاء مجموعة نوع آمن في وقت التحويل برمجياً, عن طريق إنشاء فئة عام.

يمكن البرهنة على القيود المفروضة على استخدام فئات مجموعة غير العام بكتابة برنامج قصير يستخدم فئة مجموعة ArrayList من مكتبة الفئة NET Framework. ArrayListهي فئة مجموعة ملائمة للغاية يمكن استخدامها بدون تعديل لتخزين أي نوع قيمة أو مرجع.

// The .NET Framework 1.1 way to create a list:
System.Collections.ArrayList list1 = new System.Collections.ArrayList();
list1.Add(3);
list1.Add(105);

System.Collections.ArrayList list2 = new System.Collections.ArrayList();
list2.Add("It is raining in Redmond.");
list2.Add("It is snowing in the mountains.");

ولكن هذه الملاءمة لها ثمنها. أي نوع القيمة أو مرجع تمت إضافته إلى ArrayList يتم توجيهه ضمنيًا إلى Object. إذا كانت العناصر هي أنواع القيم، فإنه يجب أن تكون محاصرة عندما يتم إضافتها إلى القائمة، و غير محاصرة عند استردادها. كلاً من النوع وعمليات التحويل إلى كائن و التحويل إلى نوع القيمة يخفض الأداء; يمكن أن يكون تأثير تحويل إلى كائن و تحويل إلى نوع القيمة هامة جداً في وحدات سيناريو أين يجب تكريره عبر مجموعات كبيرة.

قيود أخرى هي الافتقار إلى التحقق من النوع وقت الترجمة, لأن ArrayList يحوّل كل شيء إلى Object، و لا توجد طريقة في وقت الترجمة لمنع تعليمات العميل برمجية للقيام بشي مماثل لهذا:

System.Collections.ArrayList list = new System.Collections.ArrayList();
// Add an integer to the list.
list.Add(3);
// Add a string to the list. This will compile, but may cause an error later.
list.Add("It is raining in Redmond.");

int t = 0;
// This causes an InvalidCastException to be returned.
foreach (int x in list)
{
    t += x;
}

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

في الإصدارات 1.0 و 1.1 في لغة C#, يمكنك تجنب أخطار التعليمات البرمجية المعممة في فئات مجموعة مكتبة الفئة الأساسية لـ .NET Framework و بواسطة كتابة مجموعات النوع المحدد الخاصة بك فقط. بالطبع، لأن مثل هذه فئة غير قابلة للاستخدام لأكثر من نوع بيانات واحد, فإنك تفقد فوائد التعميم, و تضطر إلى إعادة كتابة الفئة لكل نوع سيتم تخزينها.

ما يحتاجه ArrayList و فئات أخرى مشابهة فعلاً هو طريقة لتحديد رمز العميل, على أساس كل مثيل، نوع بيانات خاص تنوي استخدامها. و هذا سيزيل الحاجة لموجه لـ T:System.Object وأيضا يجعل من الممكن للمترجم للقيام بنوع من التدقيق. بمعنى آخر، ArrayList تحتاج لمعلمة نوع. هذه تماماً ما توفره العام. في مجموعة العام List<T> , في مساحة الاسم N:System.Collections.Generic , نفس العملية لإضافة عناصر إلى المجموعة يشبه هذا:

// The .NET Framework 2.0 way to create a list
List<int> list1 = new List<int>();

// No boxing, no casting:
list1.Add(3);

// Compile-time error:
// list1.Add("It is raining in Redmond.");

بالنسبة لتعليمات العميل البرمجية. بناء الجملة المضافة فقط مع List<T> مقارنة بـ ArrayList هي نوع الوسيطة في تعريف و إنشاء المثيل. في المقابل هذا التعقيد أكثر قليلاً من الترميز، فيمكنك إنشاء قائمة ليست فقط أكثر أماناً من ArrayList، ولكن أيضاً أسرع بشكل ملحوظ ، خاصةً عندما تكون عناصر القائمة أنواع القيم.

راجع أيضًا:

المرجع

مقدمة للأشياء العامة (دليل البرمجة لـ #C)

System.Collections.Generic

التحويل إلى كائن والتحويل إلى نوع القيمة (دليل البرمجة لـ C#)

المبادئ

دليل البرمجة لـ #C

موارد أخرى

أفضل ممارسات المجموعات