العام في وقت التشغيل (ارشادات برمجة C#)

عندما يتم تحويل النوع العام برمجياً أو الأسلوب في Microsoft Intermediate Language (MSIL) ، يحتوي على بيانات التعريف التي تعرّف أنه يحتوي على نوع معلمات. كيف يختلف استخدام MSIL عن استخدام نوع عام استناداً إلى ما إذا كانت المعلمة التي تم توفيرها هي نوع قيمة أو نوع مرجع.

عندما يتم إنشاء نوع عام أولاً مع نوع قيمة كمعلمة، فإن وقت التشغيل يقوم بإنشاء نوع عام متخصصة مع المعلمة التي تم توفيرها أو معلمات استبداله في المواقع المناسبة في MSIL. يتم إنشاء أنواع العام متخصصة مرة واحدة لكل نوع القيمة فريد يتم استخدامه كمعلمة.

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

Stack<int> stack;

في هذا النقطة، ينشئ وقت التشغيل إصدار متخصص للفئة Stack<T> يحتوي على عدد صحيح تم استبداله بمعلمة بشكل مناسب. والآن، عندما يستخدم رمز البرنامج الخاص بك كومة من الإعداد الصحيحة، يعيد وقت التشغيل استخدام الفئة المتخصصة Stack<T> التي تم إنشاؤها. في المثال التالي, يتم إنشاء مثيلين من مكدس من الأعداد الصحيحة وتشارك مثيل واحد من التعليمات البرمجية Stack<int>:

Stack<int> stackOne = new Stack<int>();
Stack<int> stackTwo = new Stack<int>();

ومع ذلك، افترض أن فئة آخرى Stack<T>مع نوع قيمة مختلفة مثل long أو إنشاء بنية المعرفة من قبل مستخدم كمعلمة خاصة به عند نقطة آخرى في التعليمات البرمجية. ونتيجة لذلك، يقوم وقت التشغيل بإنشاء إصدار آخر من النوع العام و يستبدل long في المواقع المناسبة في MSIL. التحويلات لم تعد ضرورية لأن كل فئة عامة خاصة تحتوي أصلاً على نوع القيمة.

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

على سبيل المثال، افترض أن لديك نوعين من أنواع المرجع, فئة Customer و فئة Order، أيضاً افترض أنك قمت بإنشاء مكدس لأنواع Customer:

class Customer { }
class Order { }
Stack<Customer> customers;

في هذه المرحلة، يقوم وقت التشغيل بانشاء اصدار متخصص للفئة Stack<T> التي تقوم بتخزين مراجع الكائن الذي سيتم تعبئته وقت لاحق بدلاً من تخزين البيانات. بفرض أن السطر التالي من التعليمات البرمجية يقوم بإنشاء مكدس لنوع مرجع آخر الذي يسمى Order:

Stack<Order> orders = new Stack<Order>();

بعكس مع أنواع القيم, إصدار متخصص آخر من الفئة Stack<T> لم يتم إنشاؤه عن نوع Order. بدلاً من ذلك، يتم إنشاء مثيل لإصدار متخصص للفئة Stack<T> و المتغير orders يتم تعيينه للرجوع إليه. افترض أنك ثم ستواجه سطر من التعليمات البرمجية لإنشاء مكدس من نوع Customer:

customers = new Stack<Customer>();

كما مع الاستخدام السابقة لفئة Stack<T> التي تم إنشاؤها باستخدام نوع Order, يتم إنشاء مثيل آخر للفئة المخصصة Stack<T>. يتم تعيين المؤشرات التي ترد فيها إلى منطقة الذاكرة حجم نوع Customer. لأنه يمكن أن يختلف عدد أنواع المراجع عشوائية من برنامج، فإن C# تقوم بتنفيذ العام إلى حد كبير بتقليل مقدار التعليمات البرمجية بتقليل عدد الفئات المتخصصة التي تم إنشاؤها بواسطة المترجم لفئات عامة لأنواع المراجع إلى أحد.

فوعلاوة على ذلك، عندما يتم إنشاء مثيل فئة C# عامة باستخدام قيمة نوع أو مرجع نوع معلمة، يمكن للتفكير الاستعلام في وقت التشغيل ويمكن التحقق من نوعها الفعلي ومعلمة نوع الخاص به.

راجع أيضًا:

المرجع

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

System.Collections.Generic

المبادئ

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

موارد أخرى

generics في .NET Framework