आपकी समझ सच्ची है। ऐसा लगता है कि मुझे माइक्रो-ऑप्टिमाइज़ करने की कोशिश कर रहा है। जब आप टाइप के बारे में सुनिश्चित हों तो आपको एक सामान्य कास्ट का उपयोग करना चाहिए। अधिक समझदार अपवाद उत्पन्न करने के अलावा, यह तेजी से विफल भी होता है। यदि आप प्रकार के बारे में अपनी धारणा जा रहे गलत, अपने कार्यक्रम तुरंत विफल हो जाएगा और आप विफलता तुरंत बजाय इंतजार कर के कारण देखने के लिए एक के लिए सक्षम हो जाएगा NullReferenceException
या ArgumentNullException
या यहां तक कि एक तार्किक त्रुटि भविष्य में कुछ समय। सामान्य तौर पर, एक as
अभिव्यक्ति जो एक null
चेक द्वारा पीछा नहीं किया जाता है वह एक कोड गंध है।
दूसरी ओर, यदि आप कलाकारों के बारे में निश्चित नहीं हैं और यह असफल होने की उम्मीद करते हैं, तो आपको ब्लॉक के as
साथ लिपटे सामान्य कलाकारों के बजाय उपयोग करना चाहिए try-catch
। इसके अलावा, का उपयोग as
एक प्रकार की जाँच से अधिक की सिफारिश की जाती है , उसके बाद कलाकारों द्वारा। के बजाय:
if (x is SomeType)
((SomeType)x).SomeMethod();
जो कीवर्ड के लिए एक isinst
निर्देश उत्पन्न करता है is
, और कलाकारों के लिए एक castclass
निर्देश (प्रभावी रूप से कलाकारों को दो बार प्रदर्शन करता है), आपको उपयोग करना चाहिए:
var v = x as SomeType;
if (v != null)
v.SomeMethod();
यह केवल एक isinst
निर्देश उत्पन्न करता है । पूर्व विधि में मल्टीथ्रेडेड एप्लिकेशन में संभावित खराबी है क्योंकि दौड़ की स्थिति के कारण चर is
सफल हो सकता है और चेक लाइन के सफल होने के बाद इसका प्रकार बदल सकता है । उत्तरार्द्ध विधि इस त्रुटि के लिए प्रवण नहीं है।
उत्पादन कोड में उपयोग के लिए निम्नलिखित समाधान की सिफारिश नहीं की गई है। यदि आप वास्तव में C # में इस तरह के एक मौलिक निर्माण से नफरत करते हैं, तो आप VB या किसी अन्य भाषा पर स्विच करने पर विचार कर सकते हैं।
यदि कोई जाति के सिंटैक्स से सख्त घृणा करता है, तो वह कलाकारों की नकल करने के लिए एक एक्सटेंशन विधि लिख सकता है:
public static T To<T>(this object o) { // Name it as you like: As, Cast, To, ...
return (T)o;
}
और एक साफ [?] सिंटैक्स का उपयोग करें:
obj.To<SomeType>().SomeMethod()