c# - प्रत्यक्ष कास्टिंग बनाम 'ऑपरेटर' के रूप में?




casting (10)

  1. जब कुछ निश्चित रूप से दूसरी बात होनी चाहिए तो इसका प्रयोग करें।
  2. जब कुछ और चीज हो सकती है तो प्रयोग करें।
  3. जब आप परवाह नहीं करते हैं तो इसका उपयोग करें, लेकिन आप केवल उपलब्ध स्ट्रिंग प्रस्तुति का उपयोग करना चाहते हैं।

निम्नलिखित कोड पर विचार करें:

void Handler(object o, EventArgs e)
{
   // I swear o is a string
   string s = (string)o; // 1
   //-OR-
   string s = o as string; // 2
   // -OR-
   string s = o.ToString(); // 3
}

तीन प्रकार के कास्टिंग के बीच क्या अंतर है (ठीक है, तीसरा एक कास्टिंग नहीं है, लेकिन आपको मंशा मिलता है)। किसको प्राथमिकता दी जानी चाहिए?


"(स्ट्रिंग) ओ" के परिणामस्वरूप एक अवैध कैस्ट अपवाद होगा क्योंकि इसमें कोई प्रत्यक्ष कलाकार नहीं है।

"ओ स्ट्रिंग" के रूप में एक अपवाद फेंकने के बजाय, एक शून्य संदर्भ होगा।

"o.ToString ()" किसी भी प्रकार का प्रति-कलाकार नहीं है, यह एक विधि है जो ऑब्जेक्ट द्वारा कार्यान्वित की जाती है, और इस तरह एक या दूसरे तरीके से, नेट में प्रत्येक वर्ग द्वारा "कुछ करता है" के उदाहरण के साथ जिस वर्ग को इसे बुलाया जाता है और एक स्ट्रिंग देता है।

भूलें कि स्ट्रिंग में कनवर्ट करने के लिए, कन्वर्ट भी है। टॉस्ट्रिंग (कुछ टाइप उदाहरण ओफटाट टाइप) जहां कुछ टाइप प्रकारों में से एक है, अनिवार्य रूप से ढांचे के आधार प्रकार हैं।


2 व्युत्पन्न प्रकार के लिए कास्टिंग के लिए उपयोगी है।

मान लीजिए कि एक पशु है:

b = a as Badger;
c = a as Cow;

if (b != null)
   b.EatSnails();
else if (c != null)
   c.EatGrass();

कम से कम कास्ट के साथ खिलाया जाएगा।


इस पृष्ठ पर चलने वाले प्रयोगों के मुताबिक: http://www.dotnetguru2.org/sebastienros/index.php/2006/02/24/cast_vs_as

(इस पृष्ठ में कुछ "अवैध रेफरर" त्रुटियां कभी-कभी दिखाई देती हैं, इसलिए अगर यह करता है तो रीफ्रेश करें)

निष्कर्ष यह है कि, "as" ऑपरेटर आमतौर पर एक कलाकार से तेज होता है। कभी-कभी कई बार तेजी से, कभी-कभी बस मुश्किल से।

मैं अव्यवस्थित रूप से "जैसा" भी अधिक पठनीय है।

इसलिए, चूंकि यह तेज़ और "सुरक्षित" दोनों (अपवाद फेंक नहीं है), और संभवतः पढ़ने के लिए आसान है, इसलिए मैं हर समय "as" का उपयोग करने की सलाह देता हूं।


कुछ भी (किसी भी प्रकार का) स्ट्रिंग प्रस्तुति प्राप्त करने का प्रयास करते समय संभावित रूप से शून्य हो सकता है, मैं कोड की निम्न पंक्ति पसंद करता हूं। यह कॉम्पैक्ट है, यह ToString () को आमंत्रित करता है, और यह सही ढंग से नल को संभालता है। यदि ओ शून्य है, तो इसमें स्ट्रिंग होगी। लक्षण।

String s = String.Concat(o);

चूंकि किसी ने इसका उल्लेख नहीं किया है, उदाहरण के सबसे नज़दीक कीवर्ड द्वारा जावा पर यह है:

obj.GetType().IsInstanceOfType(otherObj)

प्रत्यक्ष कास्ट string s = (string) o; यदि आपके ऐप string के तार्किक संदर्भ में एकमात्र वैध प्रकार है। इस दृष्टिकोण के साथ, आपको InvalidCastException प्राप्त होगा और Fail-fast के सिद्धांत को लागू करेगा। आपके तर्क को अमान्य प्रकार को आगे बढ़ाने से सुरक्षित किया जाएगा या ऑपरेटर के as उपयोग किए जाने पर NullReferenceException प्राप्त होगा।

यदि तर्क कई अलग-अलग प्रकार की string s = o as string; अपेक्षा string s = o as string; और इसे null या उपयोग ऑपरेटर पर जांचें।

कास्ट को सरल बनाने के लिए सी # 7.0 में नई शानदार सुविधा दिखाई दी है और चेक एक पैटर्न मिलान है :

if(o is string s)
{
  // Use string variable s
}

or

switch (o)
{
  case int i:
     // Use int variable i
     break;
  case string s:
     // Use string variable s
     break;
 }

यदि आप पहले ही जानते हैं कि यह किस प्रकार कास्ट कर सकता है, तो सी-स्टाइल कास्ट का उपयोग करें:

var o = (string) iKnowThisIsAString; 

ध्यान दें कि केवल सी-स्टाइल कास्ट के साथ आप स्पष्ट प्रकार का दबाव कर सकते हैं।

यदि आपको नहीं पता कि यह वांछित प्रकार है या आप इसका उपयोग करने जा रहे हैं, तो यह कीवर्ड के रूप में उपयोग करें:

var s = o as string;
if (s != null) return s.Replace("_","-");

//or for early return:
if (s==null) return;

ध्यान दें कि किसी भी प्रकार के रूपांतरण ऑपरेटर को कॉल नहीं किया जाएगा। यदि ऑब्जेक्ट निर्दिष्ट प्रकार के शून्य और मूल रूप से नहीं है तो यह केवल गैर-शून्य होगा।

किसी ऑब्जेक्ट का मानव-पठनीय स्ट्रिंग प्रस्तुति प्राप्त करने के लिए ToString () का उपयोग करें, भले ही यह स्ट्रिंग पर नहीं डाला जा सके।


सभी दिए गए उत्तर अच्छे हैं, अगर मैं कुछ जोड़ सकता हूं: सीधे स्ट्रिंग के तरीकों और गुणों (उदाहरण के लिए) का उपयोग करने के लिए आप लिख नहीं सकते:

(string)o.ToLower(); // won't compile

आप केवल लिख सकते हैं:

((string)o).ToLower();

लेकिन आप इसके बजाय लिख सकते हैं:

(o as string).ToLower();

विकल्प के as में अधिक पठनीय है (कम से कम मेरी राय के लिए)।


string s = (string)o; // 1

यदि o string नहीं है तो InvalidCastException फेंकता है। अन्यथा, o को असाइन करता है, भले ही o null

string s = o as string; // 2

अगर o string नहीं है या o null है तो null को असाइन करता है। इस कारण से, आप इसका उपयोग मूल्य प्रकारों के साथ नहीं कर सकते (ऑपरेटर उस मामले में कभी भी वापस नहीं आ सकता)। अन्यथा, एस को असाइन करता है।

string s = o.ToString(); // 3

यदि null है तो एक NullReferenceException कारण NullReferenceException है। असाइन करता है जो भी o.ToString() वापस आ जाता है, इससे कोई फर्क नहीं पड़ता कि o किस प्रकार o है।

अधिकांश रूपांतरणों के लिए 1 का उपयोग करें - यह सरल और सीधा है। मैं लगभग 2 का उपयोग कभी नहीं करता क्योंकि चूंकि कुछ सही प्रकार नहीं है, तो मुझे आमतौर पर अपवाद होने की उम्मीद है। मैंने केवल बुरी तरह से डिज़ाइन की गई लाइब्रेरीज़ के साथ इस रिटर्न-नल प्रकार की कार्यक्षमता की आवश्यकता देखी है जो त्रुटि कोड का उपयोग करती है (उदाहरण के लिए अपवादों का उपयोग करने के बजाय शून्य = त्रुटि लौटाएं)।

3 एक कलाकार नहीं है और सिर्फ एक विधि आमंत्रण है। किसी गैर-स्ट्रिंग ऑब्जेक्ट की स्ट्रिंग प्रस्तुति की आवश्यकता होने पर इसका उपयोग करें।







casting