2010-12-27 7 views

उत्तर

23

आप केवल typeof() का उपयोग कर सकते हैं जब आप संकलन समय पर उस प्रकार को जानते हैं, और आप संबंधित Type ऑब्जेक्ट प्राप्त करने का प्रयास कर रहे हैं। (हालांकि टाइप एक सामान्य प्रकार पैरामीटर हो सकता है, उदाहरण के लिए typeof(T) एक प्रकार के पैरामीटर T के साथ कक्षा में।) typeof का उपयोग करने के लिए उपलब्ध उस प्रकार के किसी भी उदाहरण की आवश्यकता नहीं है। typeof के लिए ऑपरेंड हमेशा नाम एक प्रकार या प्रकार पैरामीटर का होता है। यह एक चर या ऐसा कुछ भी नहीं हो सकता है।

अब object.GetType() के साथ तुलना करें। इससे उस वस्तु का वास्तविक प्रकार प्राप्त होगा जिसे इसे बुलाया जाता है। इसका मतलब यह है:

  • आप संकलन समय पर प्रकार पता करने की जरूरत नहीं है (और आमतौर पर तुम नहीं)
  • आप वहाँ की जरूरत है प्रकार का एक उदाहरण के लिए मुझे क्या (अन्यथा आप के रूप में कुछ भी नहीं पर GetType)
  • कॉल करने के लिए वास्तविक प्रकार अपने कोड के लिए सुलभ होने की जरूरत नहीं है - उदाहरण के लिए, यह एक अलग विधानसभा में एक आंतरिक प्रकार हो सकता है

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

7

GetType() रनटाइम पर काम करता है, typeof() एक संकलन-समय ऑपरेटर है।

तो,

// untested, schematic 
void ShowType(Object x) 
{ 
    Write(x.GetType().Name); // depends on actual type 
    // typeof(x) won't actually compile 
    Write(typeof(x).Name); // always System.Object 
} 

ShowType("test"); 

System.String और System.Object प्रिंट होगा।

एक बेहतर उदाहरण के लिए this question देखें।

+4

दरअसल, 'टाइपोफ़' का उपयोग किसी उदाहरण के साथ नहीं किया जा सकता है, इसलिए टाइप टाइप (x) 'संकलित नहीं होगा। –

+0

@ रोमेन: आप सही हैं, एक टिप्पणी जोड़ा। आप जेनेरिक विधि का उपयोग करके इसे कुछ हद तक प्रदर्शित कर सकते हैं। –

+0

टाइपऑफ (उदाहरण) संकलित नहीं होगा? – Gishu

2

गेटटाइप ऑब्जेक्ट पर वर्चुअल विधि है - इसका मतलब है कि किसी वर्ग का उदाहरण दिया गया है, तो आप संबंधित प्रकार ऑब्जेक्ट को पुनर्प्राप्त कर सकते हैं।

टाइपोफ एक सी # ऑपरेटर है - इसका उपयोग संकलन समय लुकअप करने के लिए किया जाता है यानी क्लास नाम का प्रतिनिधित्व करने वाले प्रतीक को देखते हुए, इसके लिए टाइप ऑब्जेक्ट पुनर्प्राप्त करें।

if (typeof(String) == "test".GetType()) 
0

यह बिल्कुल वैसा ही नहीं है, और समस्या प्रकट होता है जब आप विरासत का उपयोग करें।

आईई।: Page से

WebPage1 इनहेरिट करती है, और यह एक Object से भी विरासत, इसलिए यदि आप (new WebPage1()).GetType() == typeof(object) के लिए परीक्षण यह गलत वापस आ जाएंगे, क्योंकि प्रकार विभिन्न रहे हैं, लेकिन जब आप is ऑपरेटर यह सच है मदद से इसका परीक्षण। क्योंकि (new WebPage1()) प्रकार WebPage1 की एक वस्तु एक Page और एक object है, और यह भी

((new WebPage1()) is object) सच है।

प्रकार भिन्न हो सकते हैं, लेकिन is चेक करता है यदि आप इस प्रकार पर सुरक्षित रूप से डाली जा सकते हैं।

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