VB.NET में DirectCast () और CType () के बीच अंतर


99

मैं एक अनुभवी C / C ++ / C # प्रोग्रामर हूं, जिसने VB.NET में प्रवेश लिया है। मैं आम तौर पर कलाकारों के लिए CType (और CInt, CBool, CStr) का उपयोग करता हूं क्योंकि यह कम वर्ण है और कास्टिंग का पहला तरीका था जिसे मैं उजागर किया गया था, लेकिन मैं डायरेक्टकास्ट और ट्राइकास्ट के बारे में भी जानता हूं।

सीधे तौर पर, DirectCast और CType के बीच कोई अंतर (कलाकारों के प्रदर्शन, प्रभाव आदि) हैं? मैं TryCast के विचार को समझता हूं।


6
DirectCast, CType, TryCast stackoverflow.com/questions/2703585/…
MarkJ

जवाबों:


182

ध्यान देने वाली पहली बात यह है कि VB.NET के पास C # के (type)instanceकास्टिंग तंत्र का सीधा एनालॉग नहीं है । मैं इसे ऊपर लाता हूं क्योंकि यह दो VB.NET ऑपरेटरों की तुलना में एक शुरुआती बिंदु के रूप में उपयोगी है (और वे ऑपरेटर हैं, फ़ंक्शन नहीं हैं, भले ही उनके पास फ़ंक्शन शब्दार्थ हैं)।

DirectCast()C # कास्टिंग ऑपरेटर से अधिक सख्त है। यह केवल तभी आपको कास्ट करने की अनुमति देता है जब आपके द्वारा डाली जा रही वस्तु पहले से ही टाइप की हुई हो। मेरा मानना ​​है कि यह अभी भी अनबॉक्स वैल्यू टाइप करेगा, लेकिन अन्यथा यह कोई रूपांतरण नहीं करेगा। तो, उदाहरण के लिए, आप से डाली नहीं कर सकते shortकरने के लिए int, जैसा कि एक सी # के साथ कर सकता (int)डाली। लेकिन आप IEnumerableएक सरणी से कास्ट कर सकते हैं , अगर आपका अंतर्निहित IEnumerableऑब्जेक्ट चर वास्तव में एक है Array। और निश्चित रूप से आप किसी Objectभी चीज़ से कास्ट कर सकते हैं , यह मानते हुए कि आपके ऑब्जेक्ट का प्रकार वास्तव में वंशानुक्रम के पेड़ में आपके कलाकारों के प्रकार से नीचे है।

यह वांछनीय है क्योंकि यह बहुत तेज है । कम रूपांतरण और प्रकार की जाँच है कि जगह लेने की जरूरत है।

CType()C # कास्टिंग ऑपरेटर की तुलना में कम सख्त है। यह उन चीजों को करेगा जो आप केवल एक साधारण (int)शैली के कलाकारों के साथ नहीं कर सकते हैं , जैसे एक स्ट्रिंग को पूर्णांक में बदलना। इसमें Convert.To___()C # में कॉलिंग जितनी शक्ति है, जहां ___आपके कलाकारों का लक्ष्य प्रकार है।

यह वांछनीय है क्योंकि यह बहुत शक्तिशाली है। हालांकि, यह शक्ति प्रदर्शन की लागत पर आती है; यह तेज DirectCast()या C # के कास्ट ऑपरेटर के रूप में नहीं है क्योंकि इसे कलाकारों को खत्म करने के लिए काफी काम करने की आवश्यकता हो सकती है। आम तौर पर आपको पसंद करना चाहिए DirectCast()जब आप कर सकते हैं।

अंत में, आप एक कास्टिंग ऑपरेटर से चूक गए: TryCast()जो कि C # के asऑपरेटर के लिए एक सीधा एनालॉग है ।


23
+1 मैं कहता हूं कि इसकी सख्ती DirectCastएक और फायदा है। यदि आप एक गलती करते हैं, तो कंपाइलर आपको तुरंत बताता है, लेकिन CTypeएक गलती से रन-टाइम पर कभी-कभी गलत व्यवहार हो सकता है - शायद कुछ उपयोगकर्ता मशीन पर विभिन्न क्षेत्रीय सेटिंग्स के साथ।
MarkJ

1
बहुत बढ़िया जवाब। तो जटिलता के क्रम में (छोटे बड़े के लिए): DirectCast, TryCast, CType/ Convert.ToXYZ(), C<xyz>()सही होगा?
आदर्श वाक्य

3
@ आदर्श वाक्य - करीब। C <xyz> () "फ़ंक्शन" को सूची में उच्च स्थान पर ले जाना चाहिए, क्योंकि वे वास्तव में फ़ंक्शन के बजाय ऑपरेटर हैं, भले ही उनके पास फ़ंक्शन शब्दार्थ हैं। उन प्रकारों के लिए जो उनके पास हैं, वे C # 's (टाइप) कास्टिंग के बहुत करीब हैं, लेकिन बस थोड़ा और काम करेंगे।
जोएल कोएहॉर्न

3
आपकी टिप्पणी के लिए @MarkJ +1, लेकिन नोट DirectCastकेवल कक्षाओं के साथ सख्त है, इंटरफेस नहीं (क्योंकि आपके पास COM प्रकार हो सकते हैं - और शायद अन्य - जो वास्तव में .NET प्रकार की .GetInterfacesसूची द्वारा परिभाषित इंटरफेस को लागू नहीं करते हैं )।
मार्क हर्ड

2
@JoelCoehoorn +1, लेकिन वास्तव में, TryCast()और asवास्तव में समान नहीं हैं। TryCast()केवल संदर्भ प्रकारों के साथ काम करता है, जबकि ऐसी asकिसी भी चीज़ के साथ काम करता है जो अशक्त हो सकती है। तो int? icast = myNum as int?;बस ठीक काम करेगा, लेकिन Dim icast as Integer? = TryCast(myNum, Integer?)एक संकलक त्रुटि देगा। बस दो भाषाओं के बीच एक और अजीब अंतर है। lol
CptRobby

12

इसके साथ CTypeआप कुछ इस तरह से लिख सकते हैं Ctype("string",Integer)। लेकिन DirectCastउपर्युक्त कथन के साथ संकलन समय त्रुटि देगा।

 Dim a As Integer = DirectCast("1", Integer) 'Gives compiler error
 Dim b As Integer = CType("1", Integer) 'Will compile

0

DirectCastसे अधिक प्रतिबंधात्मक है CType

उदाहरण के लिए, यह एक त्रुटि फेंक देगा:

Sub Main()
    Dim newint As Integer = DirectCast(3345.34, Integer)
    Console.WriteLine(newint)
    Console.ReadLine()
End Sub

इसे विजुअल स्टूडियो आईडीई में भी दिखाया जाएगा।

हालांकि, यह एक त्रुटि नहीं है:

Sub Main()
    Dim newint As Integer = CType(3345.34, Integer)
    Console.WriteLine(newint)
    Console.ReadLine()
End Sub
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.