[C#] في وقت مبكر وتأخر الربط


Answers

C # 3 يستخدم ملزمة في وقت مبكر.

يضيف C # 4 الربط المتأخر بالكلمة الرئيسية dynamic . انظر مدخل بلوق كريس بورو حول هذا الموضوع لمزيد من التفاصيل.

أما بالنسبة للطرق الافتراضية مقابل الطرق غير الافتراضية، فهذه مسألة مختلفة. إذا كنت استدعاء string.ToString() ، C # رمز إلى object.ToString() الظاهري. object.ToString() الأسلوب. لا يتغير رمز المتصل بناء على نوع الكائن. بدلا من ذلك، يتم استدعاء أساليب افتراضية من خلال جدول مؤشرات وظيفة. تشير حالة الكائن إلى جدول الكائن الذي يشير إلى طريقة ToString() . مثيل السلسلة يحتوي على جدول طريقة ظاهرية يشير إلى أنه أسلوب ToString() . نعم، هذا هو تعدد الأشكال. ولكنها ليست ملزمة في وقت متأخر.

Question

أحاول الحصول على رأسي حول عندما يحدث في وقت مبكر / تأخير الربط في C #.

الطرق غير الافتراضية هي دائما ملزمة في وقت مبكر. الطرق الافتراضية هي دائما في وقت متأخر ملزمة: مترجم إدراج رمز إضافي لحل الطريقة الفعلية لربط في وقت التنفيذ والتحقق من سلامة النوع. لذلك النوع الفرعي تعدد الأشكال يستخدم في وقت متأخر ملزمة.

طرق الاتصال باستخدام التفكير هو مثال على التأخر في الربط. ونحن نكتب رمز لتحقيق هذا بدلا من مترجم. (على سبيل المثال الاتصال مكونات كوم.)

يدعم VB.NET الربط المتأخر الضمني عندما يكون الخيار متوقفا. كائن في وقت متأخر عندما يتم تعيينه إلى متغير أعلن ليكون من نوع كائن. يقوم مترجم ف بإدراج التعليمات البرمجية للربط بالطريقة الصحيحة في وقت التنفيذ وللقبض على المكالمات غير الصالحة. C # لا يدعم هذه الميزة.

هل أنا أتجه في الاتجاه الصحيح؟

ماذا عن استدعاء المندوبين ودعوة طريقة من خلال مرجع واجهة؟ هل هذا الربط المبكر أو المتأخر؟




ملزمة في وقت مبكر

يصف الاسم نفسه أن مترجم يعرف عن نوع الكائن هو، ما هي جميع الأساليب والخصائص التي يحتوي عليها. بمجرد الإعلان عن الكائن، سوف نيت إنتليسنز ملء الأساليب والخصائص على النقر على زر نقطة.

أمثلة شائعة:

كومبوكس كوبويتمز؛

ليستبوكس لستيتمز؛ في الأمثلة المذكورة أعلاه، إذا قمنا بكتابة كبويتم ووضع نقطة تليها، فإنه سيتم ملء تلقائيا جميع الأساليب والأحداث وخصائص مربع التحرير والسرد، لأن المترجم يعرف بالفعل انها مربع تمرير.

في وقت متأخر ملزمة

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

أمثلة شائعة:

أوبجيتمز أوبجيكتس؛

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

ملزمة في وقت مبكر مقابل الملزم في وقت متأخر

الآن يأتي إلى الصورة | |

سيتم تشغيل التطبيق بشكل أسرع في الربط المبكر، لأنه لا يتم الملاكمة أو أونبوكسينغ هنا.

أسهل لكتابة التعليمات البرمجية في ملزمة في وقت مبكر، منذ سيتم تسخير تلقائيا إنتليسنس

الحد الأدنى من الأخطاء في ملزمة في وقت مبكر، منذ يتم التحقق من بناء الجملة خلال الوقت تجميع نفسها.

في وقت متأخر ملزمة دعم في كل نوع من الإصدارات، لأن كل شيء تقرر في وقت التشغيل.

الحد الأدنى من تأثير التعليمات البرمجية في التحسينات المستقبلية، إذا تم استخدام التجليد المتأخر.

وسوف يكون الأداء رمز في ملزمة في وقت مبكر. كلاهما له مزايا وعيوب، انها قرار المطور لاختيار الربط المناسب على أساس السيناريو.




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

http://www.youtube.com/watch؟v=s0eIgl5iqqQ&list=PLAC325451207E3105&index=55&feature=plpp_video

http://www.youtube.com/playlist؟list=PLAC325451207E3105