कास्टिंग है प्रक्रिया एक डेटा प्रकार को दूसरे में परिवर्तित करने के लिए, उदाहरण के लिए, एक प्रकार से एक स्ट्रिंग प्रकार। में कुछ ऑपरेशन VB.NET काम करने के लिए विशिष्ट डेटा प्रकारों की आवश्यकता होती है। कास्टिंग उस प्रकार का निर्माण करती है जिसकी आपको आवश्यकता है। इस दो-भाग श्रृंखला में पहला लेख, VB.NET में कास्टिंग और डेटा प्रकार वार्तालाप, कास्टिंग का परिचय देता है। इस लेख में उन तीन ऑपरेटरों के बारे में बताया गया है जिनका आप उपयोग कर सकते हैं VB.NET - DirectCast, CType और TryCast - और उनके प्रदर्शन की तुलना करता है।
प्रदर्शन Microsoft और अन्य लेखों के अनुसार तीन कास्टिंग ऑपरेटरों के बीच बड़े अंतर में से एक है। उदाहरण के लिए, Microsoft आमतौर पर चेतावनी देता है कि, "DirectCast... CType की तुलना में कुछ बेहतर प्रदर्शन प्रदान कर सकता है जब और डेटा प्रकार वस्तु से परिवर्तित।" (महत्व दिया।)
मैंने जाँच करने के लिए कुछ कोड लिखने का फैसला किया।
लेकिन पहले सावधानी का एक शब्द। डैन एप्पलमैन, तकनीकी पुस्तक प्रकाशक एप्रेस और एक विश्वसनीय तकनीकी के संस्थापकों में से एक गुरु, एक बार मुझसे कहा था कि बेंचमार्किंग प्रदर्शन ज्यादातर लोगों की तुलना में सही ढंग से करना बहुत कठिन है एहसास। मशीन के प्रदर्शन, अन्य प्रक्रियाएं जो समानांतर, अनुकूलन में चल सकती हैं, जैसे कारक हैं मेमोरी कैशिंग या कंपाइलर ऑप्टिमाइज़ेशन और आपकी मान्यताओं में त्रुटि जैसे कोड वास्तव में क्या है करते हुए। इन बेंचमार्क में, मैंने "सेब और संतरे" की तुलना त्रुटियों को खत्म करने की कोशिश की है और सभी परीक्षण रिलीज बिल्ड के साथ चलाए गए हैं। लेकिन इन परिणामों में अभी भी त्रुटियां हो सकती हैं। यदि आप किसी को नोटिस करते हैं, तो कृपया मुझे बताएं।
तीन कास्टिंग ऑपरेटर हैं:
- DirectCast
- CTYPE
- TryCast
व्यावहारिक रूप से, आप आमतौर पर पाएंगे कि आपके आवेदन की आवश्यकताएं निर्धारित करेंगी कि आप किस ऑपरेटर का उपयोग करते हैं। DirectCast और TryCast की बहुत संकीर्ण आवश्यकताएं हैं। जब आप DirectCast का उपयोग करते हैं, तो प्रकार पहले से ही ज्ञात होना चाहिए। हालांकि कोड ...
TheString = DirectCast (TheObject, स्ट्रिंग)
... सफलतापूर्वक संकलित करेगा यदि TheObject पहले से ही एक स्ट्रिंग नहीं है, तो कोड रनटाइम अपवाद को फेंक देगा।
ट्राइकास्ट और भी अधिक प्रतिबंधात्मक है क्योंकि यह इंटेगर जैसे "मूल्य" प्रकारों पर बिल्कुल भी काम नहीं करेगा। (स्ट्रिंग एक संदर्भ प्रकार है। मूल्य प्रकार और संदर्भ प्रकारों के बारे में अधिक जानने के लिए, इस श्रृंखला का पहला लेख देखें।) यह कोड ...
TheInteger = TryCast (TheObject, Integer)
... संकलन भी नहीं होगा।
जब आप सुनिश्चित नहीं होते हैं कि आप किस प्रकार की वस्तु के साथ काम कर रहे हैं, तो ट्रायकास्ट उपयोगी है। DirectCast जैसी त्रुटि को फेंकने के बजाय, TryCast सिर्फ कुछ भी नहीं लौटाता है। ट्राइकैस्ट को अंजाम देने के बाद कुछ भी नहीं करने के लिए सामान्य अभ्यास है।
केवल CType (और अन्य "कन्वर्ट" ऑपरेटर जैसे CInt और CBool) ऐसे प्रकारों को परिवर्तित करेंगे, जिनमें इनहेरिटेंस रिलेशनशिप जैसे कि स्ट्रिंगर के लिए कोई संबंध नहीं है:
स्ट्रिंग स्ट्रिंग के रूप में मंद = "1" द इंटेगेटर अस इंटेगर। Integer = CType (स्ट्रिंग, पूर्णांक)
यह काम करता है क्योंकि CType "सहायक फ़ंक्शन" का उपयोग करता है जो इन रूपांतरणों को करने के लिए .NET CLR (सामान्य भाषा रनटाइम) का हिस्सा नहीं हैं।
लेकिन याद रखें कि यदि कोई स्ट्रिंग किसी ऐसी चीज में शामिल नहीं होती है, जिसे किसी इंटेगर में बदला जा सकता है, तो CType अपवाद को भी फेंक देगा। यदि कोई संभावना है कि स्ट्रिंग इस तरह पूर्णांक नहीं है ...
मंद स्ट्रिंग के रूप में स्ट्रिंग = "जॉर्ज"
... फिर कोई कास्टिंग ऑपरेटर काम नहीं करेगा। यहां तक कि TryCast Integer के साथ काम नहीं करेगा क्योंकि यह एक मूल्य प्रकार है। इस तरह के एक मामले में, आपको टाइप करने के लिए वैधता जाँच का उपयोग करना होगा, जैसे टाइपऑफ़ ऑपरेटर, इसे डालने का प्रयास करने से पहले अपने डेटा की जांच करना।
डायरेक्टकास्ट के लिए Microsoft के प्रलेखन में विशेष रूप से एक ऑब्जेक्ट प्रकार के साथ कास्टिंग का उल्लेख है ताकि मैं अपने पहले प्रदर्शन परीक्षण में क्या उपयोग करूं। परीक्षण अगले पृष्ठ पर शुरू होता है!
DirectCast आमतौर पर एक ऑब्जेक्ट प्रकार का उपयोग करेगा, इसलिए मैंने अपने पहले प्रदर्शन परीक्षण में इसका उपयोग किया है। ट्रायकास्ट को टेस्ट में शामिल करने के लिए, मैंने एक इफ ब्लॉक भी शामिल किया क्योंकि ट्राइकास्ट का उपयोग करने वाले लगभग सभी कार्यक्रमों में एक होगा। इस मामले में, हालांकि, इसे कभी भी निष्पादित नहीं किया जाएगा।
यहां वह कोड है जो किसी ऑब्जेक्ट को स्ट्रिंग करते समय तीनों की तुलना करता है:
नई स्टॉपवॉच के रूप में मंद समय स्ट्रिंग के रूप में। ऑब्जेक्ट के रूप में मंद theObject = "एक वस्तु" इंटीजर के रूप में मंद परिशोधन = CInt (Iterations)। पाठ) * 1000000। ' 'डायरेक्टकास्ट टेस्ट। समय। शुरू() I = 0 के लिए। TheString = DirectCast (TheObject, स्ट्रिंग) आगे। समय। रुकें() DirectCastTime। पाठ = समय। ElapsedMilliseconds। तार। ' 'CType Test। समय। पुनर्प्रारंभ करें() आई एज़ इंटेगर = ० टू द इटरेशंस। TheString = CType (TheObject, String) आगे। समय। रुकें() CTypeTime। पाठ = समय। ElapsedMilliseconds। तार। ' 'ट्रायकास्ट टेस्ट। समय। पुनर्प्रारंभ करें() आई एज़ इंटेगर = ० टू द इटरेशंस। TheString = TryCast (TheObject, स्ट्रिंग) अगर स्ट्रींग कुछ भी नहीं है। MsgBox ("यह कभी प्रदर्शित नहीं होना चाहिए") अगर अंत। आगे। समय। रुकें() TryCastTime। पाठ = समय। ElapsedMilliseconds। तार।
यह प्रारंभिक परीक्षण यह दर्शाता है कि Microsoft लक्ष्य पर सही है। यहाँ परिणाम है। (बड़ी और छोटी संख्या के पुनरावृत्तियों के साथ-साथ विभिन्न परिस्थितियों में बार-बार किए गए परीक्षण इस परिणाम से कोई महत्वपूर्ण अंतर नहीं दिखाते हैं।)
चित्रण प्रदर्शित करने के लिए यहां क्लिक करें
DirectCast और TryCast 323 और 356 मिलीसेकंड पर समान थे, लेकिन CType ने 1018 मिलीसेकंड पर तीन बार अधिक समय लिया। इस तरह के संदर्भ टाइप करते समय, आप प्रदर्शन में CType के लचीलेपन के लिए भुगतान करते हैं।
लेकिन क्या यह हमेशा इस तरह से काम करता है? DirectCast के लिए उनके पेज में Microsoft उदाहरण आपको बताने के लिए मुख्य रूप से उपयोगी है नहीं होगा DirectCast का उपयोग करके काम करें, क्या नहीं। यहाँ Microsoft उदाहरण है:
वस्तु के रूप में मंद q = 2.37। डिम i इंटेगर = CType (q, Integer) 'निम्न रूपांतरण रन समय पर विफल हो जाता है। Dim j as Integer = DirectCast (q, Integer) नई प्रणाली के रूप में डिम च। खिड़कियाँ। फार्म। प्रपत्र। डिम सी अस सिस्टम। खिड़कियाँ। फार्म। नियंत्रण। 'निम्नलिखित रूपांतरण सफल होता है। सी = डायरेक्टकैस्ट (एफ, सिस्टम)। खिड़कियाँ। फार्म। नियंत्रण)
दूसरे शब्दों में, आप नहीं कर सकते हैं DirectCast (या TryCast का उपयोग करें, हालाँकि वे इसका उल्लेख यहां नहीं करते हैं) एक वस्तु प्रकार को एक पूर्णांक प्रकार में डालने के लिए, लेकिन आप कर सकते हैं एक नियंत्रण प्रकार के लिए एक फार्म कास्ट करने के लिए DirectCast का उपयोग करें।
आइए Microsoft के प्रदर्शन के उदाहरण की जाँच करें कि क्या मर्जी DirectCast के साथ काम करते हैं। ऊपर दिखाए गए समान कोड टेम्प्लेट का उपयोग करके, विकल्प ...
सी = डायरेक्टकैस्ट (एफ, सिस्टम)। खिड़कियाँ। फार्म। नियंत्रण)
... CType और TryCast के समान कोड के साथ कोड में। परिणाम थोड़े आश्चर्यजनक हैं।
चित्रण प्रदर्शित करने के लिए यहां क्लिक करें
DirectCast वास्तव में 145 मिलीसेकंड पर तीन विकल्पों में सबसे धीमा था। CType 127 मिलीसेकंड पर बस थोड़ा तेज़ है, लेकिन TryCast, जिसमें IF ब्लॉक भी शामिल है, 77 मिलीसेकंड पर सबसे तेज़ है। मैंने अपनी वस्तुओं को लिखने की भी कोशिश की:
क्लास पेरेंटक्लास ...। एंड क्लास। क्लास चाइल्डक्लास। इन्हेरिट्स पेरेंटक्लास ...। एंड क्लास।
मुझे इसी तरह के परिणाम मिले। ऐसा प्रतीत होता है कि यदि आप नहीं एक वस्तु प्रकार कास्टिंग, आप बेहतर बंद कर रहे हैं नहीं DirectCast का उपयोग करना।