नीचे निम्नलिखित लेख से एक पोस्टिंग है :
जबरदस्ती और कास्टिंग के बीच अंतर अक्सर उपेक्षित होता है। मैं देख सकता हूँ क्यों; कई भाषाओं में दोनों कार्यों के लिए एक ही (या समान) वाक्य रचना और शब्दावली है। कुछ भाषाएं "कास्टिंग" के रूप में भी किसी भी रूपांतरण का उल्लेख कर सकती हैं, लेकिन निम्नलिखित स्पष्टीकरण सीटीएस में अवधारणाओं को संदर्भित करता है।
यदि आप किसी प्रकार के मान को किसी भिन्न प्रकार के स्थान पर निर्दिष्ट करने का प्रयास कर रहे हैं, तो आप नए प्रकार का मान उत्पन्न कर सकते हैं जिसका मूल के समान अर्थ है। यह ज़बरदस्ती है। ज़बरदस्ती आपको नए प्रकार का उपयोग करके एक नया मूल्य बनाने की अनुमति देता है जो किसी तरह से मूल जैसा होता है। कुछ सहकर्मी डेटा को छोड़ सकते हैं (उदाहरण के लिए int 0x12345678 को लघु 0x5678 में परिवर्तित करना), जबकि अन्य नहीं कर सकते हैं (उदाहरण के लिए int 0x00000008 को लघु 0x0008, या लंबे समय तक 0x000000000008 को कनवर्ट करना)।
याद रखें कि मान कई प्रकार के हो सकते हैं। यदि आपकी स्थिति थोड़ी अलग है, और आप केवल मूल्य के प्रकारों में से एक का चयन करना चाहते हैं, तो कास्टिंग नौकरी के लिए उपकरण है। कास्टिंग केवल इंगित करता है कि आप एक विशेष प्रकार पर काम करना चाहते हैं जिसमें एक मूल्य शामिल है।
कोड स्तर पर अंतर C # से IL तक भिन्न होता है। C # में, कास्टिंग और ज़बरदस्ती दोनों एक जैसे दिखते हैं:
static void ChangeTypes(int number, System.IO.Stream stream)
{
long longNumber = number;
short shortNumber = (short)number;
IDisposable disposableStream = stream;
System.IO.FileStream fileStream = (System.IO.FileStream)stream;
}
IL स्तर पर वे काफी अलग हैं:
ldarg.0
conv.i8
stloc.0
ldarg.0
conv.i2
stloc.1
ldarg.1
stloc.2
ldarg.1
castclass [mscorlib]System.IO.FileStream
stloc.3
तार्किक स्तर के लिए, कुछ महत्वपूर्ण अंतर हैं। याद रखने के लिए जो सबसे महत्वपूर्ण है वह यह है कि जबरदस्ती एक नया मूल्य बनाता है, जबकि कास्टिंग नहीं करता है। कास्टिंग के बाद मूल मूल्य और मूल्य की पहचान समान है, जबकि एक समन्वित मूल्य की पहचान मूल मूल्य से अलग है; एक नया, अलग उदाहरण बनाता है, जबकि कास्टिंग नहीं करता है। एक कोरोलरी यह है कि कास्टिंग और मूल का परिणाम हमेशा समान होगा (दोनों पहचान और समानता में), लेकिन एक सुसंगत मूल्य मूल के बराबर हो सकता है या नहीं हो सकता है, और मूल पहचान को कभी साझा नहीं करता है।
उपरोक्त उदाहरणों में ज़बरदस्ती के निहितार्थ को देखना आसान है, क्योंकि संख्यात्मक प्रकार हमेशा मूल्य द्वारा कॉपी किए जाते हैं। जब आप संदर्भ प्रकारों के साथ काम कर रहे हों तो चीजें थोड़ी पेचीदा हो जाती हैं।
class Name : Tuple<string, string>
{
public Name(string first, string last)
: base(first, last)
{
}
public static implicit operator string[](Name name)
{
return new string[] { name.Item1, name.Item2 };
}
}
नीचे दिए गए उदाहरण में, एक रूपांतरण एक कास्ट है, जबकि दूसरा एक जबरदस्ती है।
Tuple<string, string> tuple = name;
string[] strings = name;
इन रूपांतरणों के बाद, टपल और नाम समान हैं, लेकिन तार दोनों में से किसी के बराबर नहीं हैं। आप नाम वर्ग और स्ट्रिंग [] की तुलना करने के लिए नाम वर्ग पर इक्वल्स () और ऑपरेटर == () को लागू करके स्थिति को थोड़ा बेहतर (या थोड़ा और अधिक भ्रमित) कर सकते हैं। ये ऑपरेटर तुलनात्मक समस्या को "ठीक" करेंगे, लेकिन फिर भी आपके पास दो अलग-अलग उदाहरण होंगे; स्ट्रिंग्स के किसी भी संशोधन को नाम या टपल में नहीं दिखाया जाएगा, जबकि नाम या टपल में से किसी एक में परिवर्तन नाम और टपल में परिलक्षित होगा, लेकिन स्ट्रिंग्स में नहीं।
यद्यपि ऊपर दिए गए उदाहरण का अर्थ कास्टिंग और जबरदस्ती के बीच कुछ अंतरों को स्पष्ट करना था, यह इस बात का भी एक महान उदाहरण है कि आप C # में संदर्भ प्रकारों के साथ रूपांतरण ऑपरेटरों का उपयोग करने के बारे में अत्यधिक सतर्क क्यों रहें।