2011-02-09 17 views
17

एक सवाल आज काम पर काटी कैसे अपनी विशिष्ट प्रकार (एक int) में एक वस्तु कन्वर्ट करने के लिए के बारे में, मैं इसे कास्ट करने के लिए कहा:कास्टिंग पर Convert.ToInt32 का उपयोग क्यों करें?

int i = (int)object; 

एक सहयोगी Convert.ToInt32() उपयोग करने के लिए कहा।

int i = Convert.ToInt32(object) 

Convert.ToInt32() और एक सीधा वस्तु डाली के बीच क्या अंतर है?

उत्तर

16

प्रत्येक ऑब्जेक्ट को सीधे int पर नहीं डाला जा सकता है। उदाहरण के लिए, निम्नलिखित संकलन नहीं होगा:

क्योंकि
string s = "1"; 
int i = (int)s; 

string परोक्ष int के लिए परिवर्तनीय नहीं है।

बहरहाल, यह कानूनी है:

string s = "1"; 
int i = Convert.ToInt32(s); 

एक तरफ ध्यान दें, दोनों कास्टिंग के रूप में और Convert अपवाद फेंक कर सकते हैं यदि इनपुट वस्तु नहीं बदला जा सकता। हालांकि, int.TryParse फेंक नहीं देता है अगर यह विफल रहता है; बल्कि, यह झूठी देता है (लेकिन यह केवल उपयोग करने से पहले एक स्ट्रिंग में ले जाता है, तो आप अपने इनपुट वस्तु .ToString() करने के लिए है):

object s = "1"; 
int i; 
if(int.TryParse(s.ToString(), out i)) 
{ 
    // i now has a value of 1 
} 
+0

जो शब्द आप खोज रहे हैं वह "अनुच्छेद" में "स्पष्ट रूप से" है - अंतर्निहित 'int i = s' होगा। –

1

आपको ऐसा केवल एक मूल प्रकार एक डाली नए प्रकार के लिए परिभाषित किया गया है डाल सकता । इसलिए एक संख्यात्मक प्रकार से दूसरे में कास्टिंग (उदा। लंबे समय तक int) सामान्य रूप से संभव है लेकिन गैर-संख्यात्मक प्रकारों से संख्यात्मक प्रकारों (जैसे स्ट्रिंग से int) तक कास्टिंग सामान्य रूप से संभव नहीं है। कनवर्ट इन गैर-संख्यात्मक प्रकारों को संख्यात्मक में बदलने के लिए कई और विधियां प्रदान करता है, इसलिए इसका उपयोग करने का कारण यह है कि आपको त्रुटि प्राप्त होने की संभावना कम होती है।

0

यदि आप जानते हैं कि बॉक्स किए गए उदाहरण एक int है, तो आप सुरक्षित रूप से (int) कास्ट ऑपरेटर को अनबॉक्स करने के लिए सुरक्षित रूप से उपयोग कर सकते हैं। हालांकि, अगर यह एक int (उदाहरण के लिए एक फ्लोट) में परिवर्तनीय है, तो कास्ट ऑपरेटर का उपयोग रनटाइम पर विफल हो जाएगा।

विशिष्ट रूपांतरणों की अनुमति देने और अस्वीकार करने के लिए Convert क्लास दस्तावेज़ देखें।

1

मुझे Convert खुद को पसंद करना है क्योंकि यह रूपांतरण के लिए एक अच्छा वर्दी इंटरफ़ेस प्रदान करता है। उदाहरण के लिए Convert.ToInt32("45") काम करता है लेकिन (int)"45", नहीं करता है।

ConvertOverflowException फेंकने जैसे मुद्दों की भी रिपोर्ट करेगा। कास्टिंग खतरनाक हो सकती है क्योंकि लंबे समय से एक int से कास्टिंग खराब परिणाम दे सकती है और रनटाइम आपको नहीं बताएगा।

मुझे यह भी पसंद है कि Convert.ToX(object obj) मौजूद है, जो आपको केवल Convert पर चीजों को आग लगने देता है और अधिकांश भाग इसके बारे में भूल जाता है।

+2

आपके दूसरे कथन पर; जो आपने कहा वह डिफ़ॉल्ट मामले में सच है, लेकिन आप "चेक" ब्लॉक में कलाकार को लपेट सकते हैं, जो ऐसे मामलों में अंकगणित ओवरफ्लो अपवाद फेंक देगा। – KeithS

9

वे मौलिक रूप से अलग

कास्टिंग का कहना है कि ऑब्जेक्ट प्रकार का एक उदाहरण के लिए डाली जा रही है, तो यह डाली।

कनवर्ट कहता है कि परिवर्तित किए जाने वाले प्रकारों के बीच एक रूपांतरण है।

तो उदाहरण के लिए आप एक int को स्ट्रिंग नहीं डाल सकते हैं, लेकिन आप इसे परिवर्तित कर सकते हैं। आदिम प्रकारों के लिए कुछ अंतर्निहित कास्ट नियमों के कारण कुछ ग्रे क्षेत्र/ओवरलैप है, या स्पष्ट कास्ट रूपांतरण जो आप अपने प्रकार में जोड़ सकते हैं। लेकिन आम तौर पर मैं इन दोनों के बराबर नहीं सोचूंगा।

यह देखते हुए कि कोई 'बेहतर' विकल्प नहीं है, आपको उस विकल्प का उपयोग करना चाहिए जो दिए गए संदर्भ में समझ में आता है।

+8

मुझे लगता है कि यह इरादा का विषय है। कास्टिंग स्पष्ट रूप से कहता है "मुझे पता है कि आप एक 'int' हैं!" जबकि कन्वर्ट कहता है, "मुझे नहीं पता कि आप क्या हैं, लेकिन आखिरकार मुझे पता है कि आप एक 'int' ' – Greg

+0

हां - इसे समझाने का बहुत अच्छा तरीका है - धन्यवाद। –

0

अंतर Convert.ToInt32(object value)IConvertible का उपयोग करने के लिए मूल्य को int में बदलने के लिए उपयोग करेगा, जहां प्रत्यक्ष कास्ट केवल अपवाद फेंक देगा यदि ऐसी कास्ट मान्य नहीं है।

अन्य ओवरलोड भी परिवर्तित करने और कास्टिंग को परिवर्तित करने का प्रयास नहीं करते हैं।

1

Convert.ToInt32 मूल रूप से int.Parse एक अंतर के साथ के रूप में ही है: यदि आप int.Parse (शून्य) का उपयोग एक अपवाद फेंका जाता है, जबकि Convert.ToInt32 रिटर्न 0

कास्टिंग पर दूसरी ओर है एक अधिक जटिल संचालन और केवल तभी काम करेगा यदि मूल्य वास्तव में एक बॉक्स किए गए int या anohter (बॉक्स किए गए/अनबॉक्स किए गए) मान प्रकार है जिसे पूर्ण रूप से परिवर्तित किया जा सकता है।

1

Convert एक वर्ग है कि स्थिर तरीकों की एक श्रृंखला शामिल है और आधार प्रकार परिवर्तित करने के लिए इस्तेमाल किया जा माना जाता है है चार, SByte (मुक्केबाजी एक मूल्य प्रकार का ऑब्जेक्ट प्रतिनिधित्व है), समर्थित प्रकार बूलियन कर रहे हैं, , बाइट, Int16, Int32, Int64, UInt16, UInt32, UInt64, सिंगल, डबल, डेसिमल, डेटटाइम और स्ट्रिंग। कास्ट ऑपरेटर आपको एक ही काम करने की अनुमति देता है लेकिन आप इसे अन्य प्रकारों के साथ भी उपयोग कर सकते हैं, जिसमें आपके द्वारा बनाए गए प्रकार भी शामिल हैं। आप इस ऑपरेटरों को अपनी कक्षाओं में भी परिभाषित कर सकते हैं, जिससे आप किसी भी चीज़ से कुछ भी परिवर्तित कर सकते हैं। तो यह अंतर है, एक एक विधि है और दूसरा ऑपरेटर है, मैंने स्ट्रिंग में कनवर्ट करने और int करने के दौरान ऑपरेटर की गड़बड़ी की जांच नहीं की है, लेकिन इसमें कनवर्ट करने के तरीकों के समान तर्क हो सकता है।

संबंधित मुद्दे