2008-09-11 10 views
18

यह shown है कि 'as' कास्टिंग उपसर्ग कास्टिंग से बहुत तेज है, लेकिन 'प्रतिबिंब' के बारे में क्या है? यह कितना बुरा है? जैसा कि आप कल्पना कर सकते हैं, Google पर 'है' खोजना बहुत प्रभावी नहीं है।सी # में 'है' प्रतिबिंब की प्रदर्शन विशेषताओं क्या हैं?

+2

'है' बहुत तेज़ है। –

+0

मुझे एहसास है कि डुप्लिकेट प्रश्नों को बंद करने में तारीख एकमात्र निर्धारण कारक नहीं है, लेकिन मेरा प्रश्न पोस्ट किया गया था और अन्य प्रश्न पोस्ट किए जाने से पहले उत्तर दिया गया था। _It_ डुप्लिकेट है, यह नहीं। –

उत्तर

19

कुछ ही विकल्प हैं:

  1. क्लासिक डाली: Foo foo = (Foo)bar
  2. as डाली ऑपरेटर: Foo foo = bar as Foo
  3. is परीक्षण: bool is = bar is Foo

  1. क्लासिक डाली यदि bar सुरक्षित रूप से Foo (त्वरित) के लिए डाली जा सकती है, जांच करने के लिए की जरूरत है, और फिर वास्तव में इसे (धीमा), या एक अपवाद (वास्तव में धीमी गति से) फेंक देते हैं।
  2. as ऑपरेटर अगर bar डाली जा सकती है, जांच करने के लिए है, तो डाली करते हैं, या इसे सुरक्षित रूप से ढाला नहीं जा सकता है, तो यह सिर्फ null रिटर्न की जरूरत
  3. is ऑपरेटर बस जांचता है कि bar को Foo पर डाला जा सकता है, और boolean लौटा सकता है। क्योंकि यह केवल एक पूर्ण कास्टिंग आपरेशन के पहले भाग करता

is परीक्षण, त्वरित है। as ऑपरेटर क्लासिक कास्ट से तेज़ है क्योंकि अगर कास्ट विफल रहता है तो अपवाद नहीं फेंकता है (जो उन परिस्थितियों के लिए अच्छा बनाता है जहां आप कानूनी रूप से उम्मीद करते हैं कि कास्ट विफल हो सकता है)।

तुम सिर्फ अगर चर bar एक Foo तो, is ऑपरेटर, लेकिन का उपयोग आप अगर bar एक Foo है परीक्षण करने के लिए जा रहे हैं है पता करने के लिए की जरूरत है, और अगर ऐसा है, तो यह डाली, तो आपको as ऑपरेटर का उपयोग करना चाहिए।

अनिवार्य रूप से प्रत्येक कलाकार को is के बराबर करने की आवश्यकता होती है ताकि यह सुनिश्चित किया जा सके कि कलाकार मान्य है। तो यदि आप एक पूर्ण कास्ट (या तो as कास्ट, या क्लासिक कास्ट ऑपरेटर के साथ) is प्रभावी ढंग से कर रहे हैं, तो is जांच करें, जो थोड़ा अतिरिक्त ओवरहेड है।

+3

चेक सबसे धीमा है, कास्ट संदर्भ प्रकारों पर बहुत तेज़ है, क्योंकि यह संदर्भ को वापस देता है। –

+0

इस एक जवाब ने मुझे विचार प्राप्त करने में मदद की .. – nawfal

6

"है" मूल रूप से "isinst" आईएल ऑपरेटर के बराबर है - जो कि लेख तेजी से वर्णन करता है।

3

इससे कोई फर्क नहीं पड़ता कि यह जल्दी से पर्याप्त होना चाहिए।

if (obj is Foo) { 
    Foo f = (Foo)obj; 
    f.doSomething(); 
} 

इस की तुलना में धीमी है: आप एक वस्तु के लिए पर्याप्त के प्रकार की जाँच कर रहे हैं यह प्रदर्शन पर एक प्रत्यक्ष प्रभाव है कि आप अपने डिजाइन जिस तरह से मुझे पता चला पुनर्विचार करने

7

की जरूरत बनाने के लिए के लिए यह है कि यह है:

Foo f = obj as Foo; 
if (f != null) { 
    f.doSomething(); 
} 

क्या इससे कोई फर्क पड़ता है? शायद नहीं, लेकिन ध्यान देने के लिए यह एक साधारण बात है, कि आप इसे भी कर सकते हैं।

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