2011-06-06 20 views
9
'है'

करता is ऑपरेटर से संकेत मिलता है या नहीं, एक वस्तु एक निश्चित वर्ग का एक उदाहरण है, या केवल यदि यह है कि वर्ग के लिए casted जा सकता है?सी # ऑपरेटर स्पष्टीकरण

मान लें कि मेरे पास DbCommand है जिसे command कहा जाता है जिसे वास्तव में SqlCommand के रूप में प्रारंभ किया गया है। command is OracleCommand का नतीजा क्या है?

(SqlCommand और OracleCommand दोनों DbCommand से विरासत)

+0

नतीजा झूठा नहीं होगा, क्योंकि न तो डीबीकॉमैंड और न ही एसकएल कॉमांड ओरेकल कॉमांड के उदाहरण हैं? –

+0

'is' इंगित करता है कि कोई ऑब्जेक्ट किसी प्रकार का उदाहरण या व्युत्पन्न है या नहीं। http://msdn.microsoft.com/en-us/library/scekt9xw(v=VS.100).aspx – Jon

+0

@they: क्या वे दो परिभाषाएं समान नहीं हैं? – Mehrdad

उत्तर

18

यह जाँच करता है, तो उद्देश्य यह है कि प्रकार के एक सदस्य, या एक प्रकार है कि से विरासत या आधार प्रकार या इंटरफ़ेस लागू करता है। एक तरह से, यह जांचता है कि ऑब्जेक्ट को टाइप प्रकार पर डाला जा सकता है या नहीं।

command is OracleCommand झूठा रिटर्न देता है क्योंकि यह SqlCommand है, OracleCommand नहीं। हालांकि, command is SqlCommand और command is DbCommand दोनों सत्य वापस आ जाएंगे क्योंकि यह उन दोनों प्रकारों का सदस्य है और इसलिए क्रमशः या तो डाउनकास्ट या उथल-पुथल हो सकता है।

यदि आपके पास विरासत के तीन स्तर हैं, उदा। BaseClass, SubClass और SubSubClass, new SubClass() के रूप में शुरू की गई वस्तु केवल is BaseClass और is SubClass के लिए सच होती है। हालांकि SubSubClass इनमें से दोनों से निकला है, ऑब्जेक्ट स्वयं इसका एक उदाहरण नहीं है, इसलिए is SubSubClass झूठी रिटर्न देता है।

1

is से संकेत मिलता है अगर वस्तु एक वर्ग या इंटरफ़ेस के लिए casted जा सकता है।

आप एक BaseClass और फिर एक उपवर्ग है:

var obj = new SubClass(); 

obj is SubClass रिटर्न सच;

obj is BaseClass भी सत्य देता है;

+1

यदि आप वास्तविक प्रकार की तुलना करना चाहते हैं, तो 'command.GetType() का उपयोग करें। बराबर (टाइपोफ (एसक्यूएल कॉमांड))। – Jess

+0

उनके बीच परिवर्तित करने के लिए एक स्पष्ट कास्ट ऑपरेटर के साथ असंबंधित प्रकारों के बारे में क्या? –

6

एक is अभिव्यक्ति सही का आकलन करता है, तो प्रदान की अभिव्यक्ति में गैर-शून्य है, और प्रदान की वस्तु के कारण एक अपवाद फेंका जा करने के लिए बिना प्रदान की प्रकार के डाली जा सकती है।

Source

3

http://msdn.microsoft.com/en-us/library/scekt9xw%28v=vs.80%29.aspx

एक अभिव्यक्ति है सही का आकलन करता है, तो प्रदान की अभिव्यक्ति में गैर-शून्य है, और प्रदान की वस्तु के कारण एक अपवाद फेंका जा करने के लिए बिना प्रदान की प्रकार के डाली जा सकती है।

4

MSDN से:

एक अभिव्यक्ति है अगर सही का आकलन [...] अभिव्यक्ति टाइप करने के लिए

0

अगर (कुछ है एक्स) जांच करता है कि कुछ के अंतर्निहित प्रकार एक्स है डाली जा सकती है। यह एक्स पर कास्टिंग का समर्थन करता है, यह जांचने से काफी अलग है क्योंकि एक्सएक्स के प्रकार के बिना कई प्रकार का समर्थन कर सकता है।

इसके विपरीत के रूप में ऑपरेटर एक विशेष प्रकार के लिए एक रूपांतरण प्रयास करता है और प्रदान करती है अशक्त यदि स्रोत प्रकार लक्ष्य प्रकार की विरासत श्रृंखला के भीतर नहीं है।

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