الصب هو معالجة تحويل نوع بيانات واحد إلى آخر ، على سبيل المثال ، من نوع عدد صحيح إلى نوع سلسلة. بعض العمليات في VB.NET تتطلب أنواع بيانات محددة للعمل. الصب يخلق النوع الذي تحتاجه. المقالة الأولى في هذه السلسلة من جزأين ، تحويلات تحويل البيانات ونوع البيانات في VB.NET ، تقدم عملية الصب. توضح هذه المقالة العوامل الثلاثة التي يمكنك استخدامها للإرسال VB.NET - DirectCast و CType و TryCast - ويقارن أدائها.
الأداء هو أحد الاختلافات الكبيرة بين مشغلي السباقات الثلاثة وفقًا لمايكروسوفت ومقالات أخرى. على سبيل المثال ، تحرص Microsoft عادةً على تحذير ذلك ، "DirectCast... يمكن أن توفر أداء أفضل إلى حد ما من CType عند التحويل من وإلى نوع البيانات كائن." (تم اضافة التأكيدات.)
قررت أن أكتب بعض التعليمات البرمجية للتحقق.
ولكن أولا كلمة تحذير. دان أبلمان ، أحد مؤسسي ناشر الكتاب الفني Apress وتقني موثوق به المعلم ، قال لي ذات مرة أن أداء القياس هو أصعب بكثير من القيام به بشكل صحيح من معظم الناس تدرك. هناك عوامل مثل أداء الماكينة ، والعمليات الأخرى التي قد تعمل بالتوازي ، والتحسين مثل ذاكرة التخزين المؤقت أو المحول البرمجي الأمثل ، والأخطاء في افتراضاتك حول ما هو رمز في الواقع تفعل. في هذه المعايير ، حاولت التخلص من أخطاء المقارنة بين "التفاح والبرتقال" وتم تشغيل جميع الاختبارات باستخدام إصدار الإصدار. ولكن لا يزال هناك أخطاء في هذه النتائج. إذا لاحظت أي ، يرجى إعلامي.
مشغلي الصب الثلاثة هم:
- DirectCast
- CType
- TryCast
في الواقع العملي ، ستجد عادة أن متطلبات التطبيق الخاص بك ستحدد المشغل الذي تستخدمه. DirectCast و TryCast لها متطلبات ضيقة للغاية. عند استخدام DirectCast ، يجب أن يكون النوع معروفًا بالفعل. على الرغم من أن الرمز ...
theString = DirectCast (theObject ، سلسلة)
... سيتم التحويل بنجاح إذا لم يكن theObject خيطًا بالفعل ، فسيقوم الرمز برمي استثناء وقت التشغيل.
TryCast أكثر تقييدًا لأنه لن يعمل على الإطلاق على أنواع "القيمة" مثل Integer. (السلسلة هي نوع المرجع. لمزيد من المعلومات حول أنواع القيم وأنواع المراجع ، راجع المقالة الأولى في هذه السلسلة.) هذا الرمز ...
theInteger = TryCast (theObject ، عدد صحيح)
... لن تجميع حتى.
يكون TryCast مفيدًا عندما لا تكون متأكدًا من نوع الكائن الذي تعمل معه. بدلاً من إلقاء خطأ مثل DirectCast ، يقوم TryCast بإرجاع Nothing فقط. الممارسة المعتادة هي اختبار Nothing بعد تنفيذ TryCast.
فقط CType (وعوامل تشغيل "تحويل" أخرى مثل CInt و CBool) ستقوم بتحويل الأنواع التي ليس لها علاقة بالميراث مثل عدد صحيح إلى سلسلة:
قاتمة السلسلة كما خيط = "1" تعتيم theInteger كما عدد صحيح. theInteger = CType (السلسلة ، عدد صحيح)
يعمل هذا لأن CType يستخدم "وظائف المساعد" التي ليست جزءًا من .NET CLR (وقت تشغيل اللغة العامة) لإجراء هذه التحويلات.
ولكن تذكر أن CType ستلقي استثناءًا أيضًا إذا كانت السلسلة لا تحتوي على شيء يمكن تحويله إلى عدد صحيح. إذا كان هناك احتمال بأن السلسلة ليست عددًا صحيحًا مثل هذا ...
قاتمة السلسلة مثل سلسلة "جورج"
... ثم لن يعمل مشغل الصب. حتى TryCast لن يعمل مع Integer لأنه نوع القيمة. في مثل هذه الحالة ، يتعين عليك استخدام التحقق من الصلاحية ، مثل مشغل TypeOf ، للتحقق من بياناتك قبل محاولة إرسالها.
تشير وثائق Microsoft الخاصة بـ DirectCast بالتحديد إلى الإصغاء بنوع كائن ، وهذا ما استخدمته في اختبار الأداء الأول الخاص بي. الاختبار يبدأ في الصفحة التالية!
عادةً ما يستخدم DirectCast نوع كائن ، وهذا ما استخدمته في اختبار الأداء الأول الخاص بي. لتضمين TryCast في الاختبار ، قمت أيضًا بتضمين كتلة If نظرًا لأن جميع البرامج التي تستخدم TryCast تقريبًا سيكون لها واحدة. في هذه الحالة ، لن يتم تنفيذه أبدًا.
إليك الرمز الذي يقارن الثلاثة عند إرسال كائن إلى سلسلة:
قاتمة الوقت باسم ساعة توقيت جديدة () خافت theString كسلسلة. تعتيم theObject باسم كائن = "كائن" خافتة theIterations باسم عدد صحيح = سينت (التكرار. النص) * 1000000. ' اختبار ديريكاست. الوقت. بداية() لأني = 0 إلى theIterations. theString = DirectCast (theObject ، سلسلة) التالى. الوقت. قف() DirectCastTime. النص = الوقت. ElapsedMilliseconds. إلى سلسلة. ' اختبار CType. الوقت. اعادة البدء() بالنسبة لـ I As Integer = 0 إلى theIterations. theString = CType (theObject ، سلسلة) التالى. الوقت. قف() CTypeTime. النص = الوقت. ElapsedMilliseconds. إلى سلسلة. ' اختبار TryCast. الوقت. اعادة البدء() بالنسبة لـ I As Integer = 0 إلى theIterations. theString = TryCast (theObject ، سلسلة) إذا كانت سلسلة لا شيء بعد ذلك. MsgBox ("يجب ألا يعرض هذا") إنهاء إذا. التالى. الوقت. قف() TryCastTime. النص = الوقت. ElapsedMilliseconds. إلى سلسلة.
يبدو أن هذا الاختبار المبدئي يوضح أن Microsoft على حق في الهدف. ها هي النتيجة. (لم تُظهر التجارب ذات الأرقام الأكبر والأصغر من التكرارات وكذلك الاختبارات المتكررة في ظل ظروف مختلفة أي اختلافات كبيرة من هذه النتيجة.)
انقر هنا لعرض الرسم التوضيحي
كانت DirectCast و TryCast متشابهة في 323 و 356 ميلي ثانية ، لكن CType استغرق ثلاثة أضعاف الوقت في 1018 ميلي ثانية. عند اختيار أنواع مرجعية كهذه ، فأنت تدفع مقابل مرونة CType في الأداء.
ولكن هل تعمل دائما بهذه الطريقة؟ مثال Microsoft في صفحتهم لـ DirectCast مفيد بشكل أساسي لإخبارك بما متعود العمل باستخدام DirectCast ، وليس ما سوف. إليك مثال Microsoft:
خافت ككائن = 2.37. Dim i As Integer = CType (q، Integer) "فشل التحويل التالي في وقت التشغيل. Dim j As Integer = DirectCast (q، Integer) خافت و كنظام جديد. شبابيك. نماذج. شكل. خافت ج كنظام. شبابيك. نماذج. مراقبة. نجح التحويل التالي. c = DirectCast (f ، النظام. شبابيك. نماذج. مراقبة)
بمعنى آخر ، أنت لا استطيع استخدم DirectCast (أو TryCast ، على الرغم من أنهم لا يذكرونها هنا) لإلقاء نوع كائن على نوع صحيح ، لكنك يستطيع استخدم DirectCast لإلقاء نوع النموذج على نوع التحكم.
دعونا نتحقق من أداء مثال Microsoft لما إرادة العمل مع DirectCast. باستخدام نفس رمز الكود الموضح أعلاه ، استبدل ...
c = DirectCast (f ، النظام. شبابيك. نماذج. مراقبة)
... في رمز جنبا إلى جنب مع بدائل مماثلة ل CType و TryCast. النتائج مفاجئة بعض الشيء.
انقر هنا لعرض الرسم التوضيحي
كان DirectCast بالفعل أبطأ من الخيارات الثلاثة في 145 ميلي ثانية. CType هو أسرع قليلاً من 127 ميلي ثانية ولكن TryCast ، بما في ذلك كتلة If ، هو الأسرع في 77 ميلي ثانية. حاولت أيضًا كتابة الأشياء الخاصة بي:
فئة ParentClass... نهاية الدرجة. فئة تشايلد كلاس. يرث ParentClass... نهاية الدرجة.
حصلت على نتائج مماثلة. يبدو أنه إذا كنت ليس اختيار نوع كائن ، أنت أفضل حالا ليس باستخدام DirectCast.