2013-07-08 8 views
8
नहीं है

इस कोड पर विचार करें:क्यों अशक्त स्ट्रिंग एक स्ट्रिंग वस्तु

class Program 
     { 
      static void Main(string[] args) 
      { 

       string s = null; 
       bool b = s is string; 
       Console.WriteLine(b); 
      } 
     } 

ऊपर कोड s is string में लेकिन ख false है।

वास्तव में स्ट्रिंग के रूप में है, मुझे यह परिणाम क्यों मिलता है?

संकलक का यह व्यवहार क्यों है?

+6

's', एक स्ट्रिंग नहीं है, यह एक अशक्त संदर्भ है। अगर यह किसी चीज़ को संदर्भित करता है, तो कुछ एक स्ट्रिंग होगी। –

+3

हालांकि 'बूल बी = टाइपोफ स्ट्रिंग है;' अपेक्षित परिणाम – Robert

+0

नहीं मिलेगा, मुझे शून्य रिफ्रेंस नहीं मिलेगा –

उत्तर

5

अपने कथन का मूल्यांकन करते समय, रनटाइम को पहले का पालन करना चाहिए जिसके संदर्भ में चर संदर्भित है। केवल तब यह संदर्भित वस्तु का मूल्यांकन कर सकता है कि यह वास्तव में एक स्ट्रिंग है या नहीं।

चूंकि null संदर्भ किसी ऑब्जेक्ट को संदर्भित करता है, यह एक स्ट्रिंग नहीं है। वास्तव में, यह कुछ भी नहीं है।

ऑपरेटर Type ऑब्जेक्ट का उपयोग कर सकते हैं जो किसी संदर्भित ऑब्जेक्ट की तुलना करने के बजाय स्ट्रिंग से मेल खाता है, यदि यह आपका अंतिम लक्ष्य है।

यह वास्तव में यह बहुत ही विषय पर एक ब्लॉग पोस्ट में एरिक Lippert द्वारा दिए गए विशेष उदाहरण है:

मैंने देखा है कि ऑपरेटर सी # में असंगत है। इसे देखें:

string s = null; // Clearly null is a legal value of type string 
bool b = s is string; // But b is false! 

इसके साथ क्या चल रहा है?

- http://ericlippert.com/2013/05/30/what-the-meaning-of-is-is/

+0

मैं नहीं देख रहा हूं कि इस स्थिति में 'टाइपोफ़' ऑपरेटर किसी भी मदद के लिए कैसे होगा। –

+3

@ m-y अगर ओपी स्ट्रिंग के 'टाइप' ऑब्जेक्ट की तलाश में है, तो वह 'is' ऑपरेटर के बजाय 'typeof' का उपयोग कर सकता है। –

2

परिवर्तनीय s एक संदर्भ है जो स्मृति में स्ट्रिंग के स्थान पर संभावित रूप से इंगित कर सकता है, हालांकि आपने इसे अभी तक एक स्ट्रिंग पर इंगित नहीं किया है - यह 'शून्य' को इंगित करता है। जब आप s is string से पूछते हैं तो आप कह रहे हैं 'संदर्भ s स्मृति में स्ट्रिंग के स्थान पर इंगित करता है' और आपके मामले में उत्तर 'नहीं' है।

1

अशक्त कीवर्ड एक शाब्दिक कि, एक अशक्त संदर्भ का प्रतिनिधित्व करता है कि एक किसी भी वस्तु का उल्लेख नहीं करता है। s अशक्त है -

http://msdn.microsoft.com/en-us/library/edakx9da.aspx

s is string क्योंकि sstring का एक उदाहरण को संदर्भित नहीं करती गलत है।

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