2009-07-15 16 views
25

एक सहयोगी ने मुझे आज एक दिलचस्प सवाल पूछा - क्या सी # कीवर्ड/ऑपरेटर "प्रतिबिंब माना जाता है?सी # "है" ऑपरेटर - क्या वह प्रतिबिंब है?

object tmp = "a string"; 
if(tmp is String) 
{ 
} 

इस ऑपरेटर को दृश्यों के पीछे कैसे लागू किया गया है? क्या इसे प्रतिबिंब या आत्मनिरीक्षण की आवश्यकता है? या भाषा की दृढ़ता से टाइप की गई प्रकृति की वजह से, वस्तु का प्रकार स्मृति में ऑब्जेक्ट की शीर्ष-स्तर विशेषता के रूप में तुरंत पहुंच योग्य है?

MSDN कहा गया है कि:

ध्यान दें कि ऑपरेटर है केवल संदर्भ के रूपांतरण, मुक्केबाजी रूपांतरण, और unboxing रूपांतरण समझता है। उपयोगकर्ता द्वारा परिभाषित रूपांतरण जैसे अन्य रूपांतरण, ऑपरेटर द्वारा नहीं माना जाता है।

बॉक्सिंग और अनबॉक्स किए गए रूपांतरणों पर विचार करने की क्षमता मुझे कुछ प्रकार के आत्मनिरीक्षण का संकेत देती है।

+0

संबंधित http://stackoverflow.com/questions/57701/what-are-the-performance-characteristics-of-is-reflection-in-c?lq=1 – nawfal

उत्तर

31

Referencing ECMA-335, is ऑपरेटर isinst ऑब्जेक्ट मॉडल आईएल अनुदेश (विभाजन तृतीय §4.6) है, जो आधार अनुदेश के रूप में परावर्तन पुस्तकालय (विभाजन चतुर्थ §5.5) का हिस्सा होने के लिए विरोध सेट का हिस्सा है उत्पन्न करता है।

संपादित करें: is ऑपरेटर प्रतिबिंब पुस्तकालय की तुलना में अत्यंत कुशल है। आप मूल रूप से एक ही परीक्षण प्रतिबिंब के माध्यम से और अधिक धीरे धीरे प्रदर्शन कर सकता है:

typeof(T).IsAssignableFrom(obj.GetType()) 

संपादित करें 2: आप castclass और isinst जानकारी (जिसे अब आप पोस्ट से बाहर संपादित किया है) की दक्षता के बारे में सही नहीं हैं। वे किसी भी व्यावहारिक वीएम कार्यान्वयन में अत्यधिक अनुकूलित हैं। केवल वास्तविक प्रदर्शन मुद्दा शामिल castclass के लिए क्षमता, एक अपवाद फेंकने के लिए जो आप सी # as ऑपरेटर और (संदर्भ प्रकार के लिए) null के लिए एक परीक्षण या is ऑपरेटर एक डाली (मूल्य प्रकार के लिए) के बाद का उपयोग करके से बचें।

+0

मैंने कुछ भी संपादित नहीं किया है, लेकिन शायद मुझे "महंगा" से मेरा मतलब स्पष्ट करना चाहिए। मुझे आईएल दक्षता के बारे में बहुत कुछ पता नहीं है, लेकिन FxCop की चेतावनी है यदि आपका निर्माण कोड जो एक आईएसआईएनटी और कास्टक्लास निर्देश दोनों को उत्सर्जित करता है क्योंकि वे इसे असुरक्षित या "महंगा" मानते हैं। –

+2

जैसा कि मैंने दूसरे संपादन में उल्लेख किया है, आपको संदर्भ प्रकारों के लिए 'n'' चेक के बाद' as' का उपयोग करना चाहिए। इसके बजाय आपने 'is' का उपयोग एक कलाकार के बाद किया था, जो FxCop आपको सतर्क कर रहा है। –

+2

कॉम्पैक्ट फ्रेमवर्क, आईएल पर जो कुछ भी लायक है, उसके लिए आरटीटीआई (जैसे 'isinst' और 'castclass') को स्पष्ट रूप से जांचने की आवश्यकता है, प्रतिबिंब के रूप में धीमी है, जबकि कॉलवर्ट अत्यधिक अनुकूलित है। नैतिक: टाइप-केस संरचनाओं का उपयोग करने से बचने का प्रयास करें जहां आभासी/अमूर्त विधियां काम कर सकती हैं। –

5

is ऑपरेटर अनिवार्य रूप से निर्धारित करता है कि एक कास्ट संभव है, लेकिन जब कलाकार असंभव है तो अपवाद फेंकने के बजाय यह false देता है। यदि आप कास्टिंग प्रतिबिंब पर विचार करते हैं तो यह भी प्रतिबिंब है।

संपादित करें:

कुछ शोध मैं ने पाया है कि एक डाली på castclass अनुदेश आईएल में किया जाता है के बाद, जबकि isinst अनुदेश के is ऑपरेटर नक्शे। FxCop में rule है जो आपको चेतावनी देता है कि क्या आप isinst और फिर castclass निर्देश का उपयोग करके अनावश्यक कास्ट कर रहे हैं। हालांकि परिचालन कुशल हैं, फिर भी उनके पास प्रदर्शन लागत है।

+0

'is' ऑपरेटर सही/गलत देता है और नहीं शून्य। – SolutionYogi

+1

मुझे लगता है कि आप "as" ऑपरेटर – Matt

+0

के बारे में सोच रहे हैं जो आपने वर्णन किया है वह 'as' ऑपरेटर है। 'है' ऑपरेटर अनिवार्य रूप से एक ही ऑपरेशन है, बस एक अलग वापसी मूल्य के साथ। – Charlie

1

अन्य भाषाओं गतिशील कास्टिंग का समर्थन करने के लिए पर्याप्त क्रम समय की जानकारी, और अभी तक कुछ भी नहीं प्रतिबिंब के रूप में वर्णित किया जा सकता है कि (सी ++ एक स्पष्ट उदाहरण है) है।

तो प्रतिबिंब केवल एक वस्तु के प्रकार की खोज के अलावा अतिरिक्त क्षमताओं को दर्शाता है। किसी ऑब्जेक्ट पर "प्रतिबिंबित" करने के लिए उदाहरण के लिए, अपने सदस्यों को चलने की क्षमता का तात्पर्य है।

+0

यह कहने के लिए * अधिक * सही होगा कि प्रतिबिंब किसी ऑब्जेक्ट की तुलना में कक्षा के सदस्यों को पार्स कर रहा है, क्योंकि आपको उदाहरण को जीवित रखने की आवश्यकता नहीं है। इसके अलावा प्रतिबिंब "असेंबली" में सक्षम करता है कि आपके पास एक असेंबली में कौन सी कक्षाएं हैं, न केवल सदस्यों और कक्षा की अन्य जानकारी। –

+0

@ डैनी वरोड - सभी भाषाओं में कक्षाएं या असेंबली नहीं हैं। –

+0

सी ++ में कक्षाएं और पुस्तकालय हैं, जावा में कक्षाएं और पैकेज हैं। ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग किसी ऑब्जेक्ट और क्लास के बीच अंतर को परिभाषित करता है। –

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