कास्टिंग: (न्यूटाइप) बनाम ऑब्जेक्ट न्यूटाइप के रूप में

Possible Duplicate:
Casting vs using the 'as' keyword in the CLR

वास्तव में इन दो जानवरों के बीच क्या अंतर है?

SomeClass sc = (SomeClass)SomeObject;
SomeClass sc2 = SomeObject as SomeClass;

आम तौर पर, वे दोनों निर्दिष्ट प्रकार के लिए स्पष्ट होना चाहिए?

0
जोड़ा संपादित
विचारों: 4
जो मजाकिया है क्योंकि यह 3 महीने पहले पोस्ट किया गया था :) लेकिन दूसरे के पास अधिक विस्तृत उत्तर हैं।
जोड़ा लेखक Michael Stum, स्रोत
यह भी देखें stackoverflow.com/questions/496096/… । यह पहला था, लेकिन उसमें एक अच्छा जवाब है।
जोड़ा लेखक Jay Bazuzi, स्रोत
आपने दूसरा सबसे पुराना प्रश्न पोस्ट किया है जो कि दूसरे का डुप्लिकेट है (पहला लॉक है)! बधाई हो, मुझे लगता है?
जोड़ा लेखक gparyani, स्रोत

12 उत्तर

प्रक्रिया को याद रखने का यह एक अच्छा तरीका है कि उनमें से प्रत्येक का पालन करें कि मैं यह तय करने का प्रयास करता हूं कि मेरे परिस्थिति के लिए कौन सा बेहतर है।

DateTime i = (DateTime)value;
// is like doing
DateTime i = value is DateTime ? value as DateTime : throw new Exception(...);

और अगला यह अनुमान लगाने में आसान होना चाहिए कि यह क्या करता है

DateTime i = value as DateTime;

पहले मामले में अगर किसी अपवाद की तुलना में मूल्य को कास्ट नहीं किया जा सकता है तो दूसरे मामले में फेंक दिया जाता है यदि मूल्य नहीं डाला जा सकता है, तो मैं शून्य पर सेट हूं।

तो पहले मामले में एक हार्ड स्टॉप बनाया जाता है यदि कास्ट दूसरी कलाकार में विफल रहता है तो नरम स्टॉप बनाया जाता है और आपको बाद में एक NullReferenceException का सामना करना पड़ सकता है।

0
जोड़ा

यह पार्स और ट्राईपर्स के बीच अंतर की तरह है। जब आप उम्मीद करते हैं कि यह असफल हो सकता है तो आप TryParse का उपयोग करते हैं, लेकिन जब आपके पास मजबूत आश्वासन होता है तो यह असफल नहीं होगा आप पार्स का उपयोग करेंगे।

0
जोड़ा

यह भी ध्यान रखें कि आप केवल एक संदर्भ प्रकार या एक शून्य प्रकार के साथ कीवर्ड के रूप में उपयोग कर सकते हैं

अर्थात:

double d = 5.34;
int i = d as int;

संकलन नहीं करेंगे

double d = 5.34;
int i = (int)d;

संकलित करेंगे।

0
जोड़ा
क्योंकि एक कास्टिंग परिवर्तित नहीं होता है
जोड़ा लेखक CiNN, स्रोत

यदि स्रोत प्रकार को लक्ष्य प्रकार पर नहीं डाला जा सकता है तो पूर्व अपवाद फेंक देगा। उत्तरार्द्ध परिणामस्वरूप एस 2 एक शून्य संदर्भ होगा, लेकिन कोई अपवाद नहीं है।

[संपादित करें]

मेरा मूल उत्तर निश्चित रूप से सबसे स्पष्ट अंतर है, लेकिन एरिक लिपर्ट बताता है , यह केवल एकमात्र नहीं है। अन्य मतभेदों में शामिल हैं:

  • आप 'as' ऑपरेटर का उपयोग उस प्रकार पर डालने के लिए नहीं कर सकते जो 'शून्य' मान के रूप में स्वीकार नहीं करता
  • आप 'as' का उपयोग कन्वर्ट चीजों जैसे किसी भिन्न प्रतिनिधित्व (उदाहरण के लिए int में फ़्लोट) की तरह नहीं कर सकते हैं।

और आखिरकार, 'as' बनाम कास्ट ऑपरेटर का उपयोग करके, आप यह भी कह रहे हैं "मुझे यकीन नहीं है कि यह सफल होगा या नहीं।"

0
जोड़ा

वे अलग-अलग अपवाद फेंक देंगे।
(): NullReferenceException
के रूप में: अवैध कैस्ट अपवाद
जो डीबगिंग के लिए मदद कर सकता है।

"जैसा" कीवर्ड ऑब्जेक्ट को डालने का प्रयास करता है और यदि कास्ट विफल हो जाता है, तो मूर्ख को चुपचाप वापस कर दिया जाता है। कास्ट ऑपरेटर तत्काल अपवाद फेंक देगा अगर कास्ट विफल हो जाता है।

"केवल सी #" को "कीवर्ड" के रूप में उपयोग करें जहां आप एक असाधारण मामले में कलाकारों को असफल होने की उम्मीद कर रहे हैं। यदि आप सफल होने के लिए कलाकारों पर भरोसा कर रहे हैं और असफल होने वाली किसी ऑब्जेक्ट को प्राप्त करने के लिए तैयार नहीं हैं, तो आपको() कास्ट ऑपरेटर ताकि एक उचित और सहायक अपवाद फेंक दिया जा सके। "

For code examples and a further explanation: http://blog.nerdbank.net/2008/06/when-not-to-use-c-keyword.html

0
जोड़ा
(-1) के रूप में एक अवैधCastException फेंक नहीं होगा।
जोड़ा लेखक Keith, स्रोत

यह सब संदर्भ प्रकारों पर लागू होता है, मान प्रकार के रूप में कीवर्ड का उपयोग नहीं कर सकते क्योंकि वे शून्य नहीं हो सकते हैं।

//if I know that SomeObject is an instance of SomeClass
SomeClass sc = (SomeClass) someObject;


//if SomeObject *might* be SomeClass
SomeClass sc2 = someObject as SomeClass;

कास्ट सिंटैक्स तेज है, लेकिन केवल सफल होने पर, यह असफल होने में बहुत धीमा है।

सबसे अच्छा अभ्यास as का उपयोग करना है जब आप इस प्रकार को नहीं जानते:

//we need to know what someObject is
SomeClass sc;
SomeOtherClass soc;

//use as to find the right type
if( ( sc = someObject as SomeClass ) != null ) 
{
    //do something with sc
}
else if ( ( soc = someObject as SomeOtherClass ) != null ) 
{
    //do something with soc
}

हालांकि अगर आप पूरी तरह से सुनिश्चित हैं कि someObject SomeClass का उदाहरण है तो कास्ट का उपयोग करें।

.Net 2 या इससे ऊपर जेनेरिक का मतलब है कि आपको शायद ही कभी एक संदर्भ वर्ग का एक गैर-टाइप किया गया उदाहरण होना चाहिए, इसलिए बाद वाले का उपयोग अक्सर कम होता है।

0
जोड़ा

खैर 'as' ऑपरेटर "आपकी समस्या को कम करने के तरीके को कम करने में मदद करता है क्योंकि जब इसे एक असंगत उदाहरण प्रदान किया जाता है तो यह शून्य हो जाएगा, हो सकता है कि आप इसे उस विधि में पास कर दें जो इसे दूसरे को पास कर देगी और इसी तरह और अंत में आपको एक NullReferenceException मिलेगा जो आपके डिबगिंग को कठिन बना देगा।

इसका दुरुपयोग मत करो। 99% मामलों में प्रत्यक्ष कास्ट ऑपरेटर बेहतर है।

0
जोड़ा
यहां बहुत अच्छी सलाह है। पाठक, कृपया इस पर विचार करें।
जोड़ा लेखक mbadawi23, स्रोत

Rytmis की टिप्पणी पर विस्तार करने के लिए, आप के रूप में structs (वैल्यू प्रकार) के लिए कीवर्ड, क्योंकि उनके पास कोई शून्य मान नहीं है।

0
जोड़ा
0
जोड़ा

दो दृष्टिकोणों के बीच एक अंतर यह है कि पहला ((SomeClass) obj) टाइप कनवर्टर कहा जाता है।

0
जोड़ा

वीबी.नेट अनुभव के साथ आप में से उन लोगों के लिए, (प्रकार) डायरेक्टकास्ट के समान है और "जैसा प्रकार" TryCast जैसा ही है।

0
जोड़ा