سؤال

مجرد محاولة للحصول على رأسي حول الأدوية من خلال القراءة هذه المقالة المنير من قبل Juval Lowy

إعادة الصياغة .. عندما تحدد تعريف فئة عامة ، يتم تجميعه في IL.

  • بالنسبة إلى أنواع القيمة ، بمجرد أن تطلب الحصول على نوع معين من القيمة ، فإنه يحل محل T مع نوع القيمة المحددة للحصول على IL لهذا التكوين المحدد على سبيل المثال MyList<int> الاستفادة: لا توجد عقوبات ملاكمة وعدالة.
  • كل شيء جيد .. بالنسبة للأنواع المرجعية ، يحل المترجم محل جميع مثيلات T في التعريف الخاص بك مع الكائن ويقوم بإنشاء IL الذي يستخدم لجميع أنواع المرجع. ومع ذلك ، يتم تخصيص الحالات بناءً على نوع المرجع الفعلي المطلوب على سبيل المثال MyList<String>

الآن ما قبل التحريكات ، يمكن أن يكون لدينا أساليب تكتب Object المعلمات. تدعي الأداء الأداء تحسين الأداء بنسبة 100 ٪ بسبب 'إنه يتجنب عقوبة الأداء التي تتحملها عند تسليط نوع الكائن إلى نوعك المحدد عندما تريد استخدامه "

 // assume GetItem returns an Object
 string sMyPreciousString = (string) obList.GetItem(); 

ما الذي ضرب هذا الأداء عندما تنهار من كائن إلى نوع مرجعي محدد؟ كما أنه يبدو أن الأمر متروك للكائنات (حتى الأدوية الجنيسة ستفعل هذا) ، فليس من النجاح في الأداء .. لماذا؟

هل كانت مفيدة؟

المحلول

لا يتطلب الأمر إلى الكائن فحص وقت التنفيذ - فهو سيعمل دائمًا ، وهو مجرد عدم وجود OP بشكل أساسي.

يتطلب الانزلاق فحص وقت التنفيذ للتأكد من أنك لا تدفع دفقًا إلى سلسلة على سبيل المثال. إنها عقوبة صغيرة جدًا ، ومن غير المرجح أن تكون عنق الزجاجة - ولكن تجنبها ليست سوى فائدة إضافية للوظائف العامة.

نصائح أخرى

يأتي ضرب الأداء من الحاجة إلى فحص نوع وقت التشغيل. إذا كانت B عبارة عن فئة فرعية من A ، ثم عندما تقوم بإلقاء A في A ، فأنت تعرف في وقت الترجمة أن تكون آمنة ، لأن جميع BS هي. لذلك ، لا تحتاج إلى إنشاء أي رمز وقت تشغيل للتحقق من النوع.

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

لا تواجه الأدوية الجنيسة هذه المشكلة ، لأن المترجم يعرف ، في وقت الترجمة ، أنه تم وضع BS فقط في بنية البيانات ، لذلك عندما تقوم بسحب شيء ما ، يعرف المترجم أنه سيكون B ، لذلك ليست هناك حاجة ل اكتب التحقق في وقت التشغيل.

القراءة على IL التي يتم إنشاؤها (هذا مقالة - سلعة يذكر ذلك) ... آها - Isinst.

إذا لم تكن مهرجًا ، فلن تضطر إلى الاتصال isinst.

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