2012-07-03 15 views
25

क्यों इस काम करता हैGetType() या typeof() का उपयोग कब और कहाँ करें?

if (mycontrol.GetType() == typeof(TextBox)) 
{} 

और यह नहीं है?

Type tp = typeof(mycontrol); 

लेकिन इस

Type tp = mycontrol.GetType(); 

मैं अपने आप को प्रकार की जाँच के लिए is ऑपरेटर का उपयोग काम करता है लेकिन मेरी समझ में विफल रहता है जब मैं typeof() और GetType()

कहां और कब GetType() या typeof() उपयोग करने के लिए प्रयोग करते हैं?

+1

इस काम से आपका क्या मतलब है ... और यह नहीं ...? –

+1

@ anouar204: उन्हें अपने आईडीई में आज़माएं। –

+4

'compile'' काम नहीं करता है 'काम' –

उत्तर

61

typeofसंकलन-समय (या कम से कम एक सामान्य प्रकार पैरामीटर) पर ज्ञात एक प्रकार प्राप्त करने के लिए एक ऑपरेटर है। typeof का ऑपरेशन हमेशा एक प्रकार या प्रकार पैरामीटर का नाम है - कभी एक मान (उदा। एक चर) के साथ एक अभिव्यक्ति। अधिक जानकारी के लिए C# language specification देखें।

GetType() एक ऐसी विधि है जिसे आप अलग-अलग ऑब्जेक्ट्स पर कॉल करते हैं, निष्पादन-समय ऑब्जेक्ट का प्रकार प्राप्त करने के लिए।

ध्यान दें कि जब तक आप केवल बिल्कुल TextBox (बजाय उपवर्गों के उदाहरण) के उदाहरण चाहते हैं आप आमतौर पर उपयोग करेंगे:

if (myControl is TextBox) 
{ 
    // Whatever 
} 

या

TextBox tb = myControl as TextBox; 
if (tb != null) 
{ 
    // Use tb 
} 
+2

आपकी लाइन ''टाइपऑफ का ऑपरेशन हमेशा एक प्रकार या प्रकार पैरामीटर का नाम होता है - कभी भी एक मान (उदाहरण के लिए एक चर) के साथ अभिव्यक्ति नहीं है मेरे प्रश्न का सही जवाब। मेरी मदद करने के लिए धन्यवाद। –

5

आप इसे करने के लिए आसान लग सकता है is keyword का उपयोग करें:

if (mycontrol is TextBox) 
+0

यह उत्तर मैं सब से अधिक खोज रहा हूं और मुझे यह पता है। –

+5

@ निखिल अग्रवाल: यदि आप पहले से ही कुछ जानते हैं जो आपके प्रश्न का स्पष्ट उत्तर है, तो आपको लोगों के समय को बर्बाद करने से बचने के लिए सवाल में ऐसा कहना चाहिए। कृपया http://tinyurl.com/so-hints –

+1

@ जोनस्केट पढ़ें: मैं कीवर्ड का उपयोग करता हूं लेकिन टाइपऑफ() और GetType() में परेशान था –

7

typeOf एक सी # कीवर्ड है जिसका उपयोग तब किया जाता है जब आपके पास कक्षा का नाम होता है। इसकी गणना संकलन समय पर की जाती है और इस प्रकार एक उदाहरण पर उपयोग नहीं किया जा सकता है, जिसे रनटाइम पर बनाया गया है। GetType ऑब्जेक्ट क्लास का एक तरीका है जिसे किसी उदाहरण पर उपयोग किया जा सकता है।

23

typeof संकलन समय पर ज्ञात एक प्रकार के नाम पर लागू होता है। इसे जेनेरिक टाइप पैरामीटर पर भी लागू किया जा सकता है। GetType रनटाइम पर किसी ऑब्जेक्ट पर लागू होता है। दोनों स्थितियों में परिणाम System.Type प्रकार का एक वस्तु है जिसमें एक प्रकार पर मेटा-सूचना होती है।

यदि आपके पास

string s = "hello"; 

इन दो पंक्तियों को वैध

Type t1 = typeof(string); 
Type t2 = s.GetType(); 

और यह तुलना पैदावार true

t1 == t2     ==> true 

लेकिन

कर रहे हैं
object obj = "hello"; 

इन दो पंक्तियों को मान्य हैं

Type t1 = typeof(object); 
Type t2 = obj.GetType(); // ==> string! 

और यह तुलना पैदावार false

t1 == t2     ==> false 

यानी, चर obj का संकलन समय प्रकार (स्थिर प्रकार) नहीं क्रम रूप में ही है obj द्वारा संदर्भित ऑब्जेक्ट का प्रकार (गतिशील प्रकार) टाइप करें। (यहाँ "डायनामिक" कीवर्ड dynamic कोई लेना देना नहीं है!)


परीक्षण प्रकार

अगर, हालांकि, आप केवल जानने के लिए कि mycontrol एक TextBox तो आप बस

परीक्षण कर सकते हैं चाहता हूँ
if (mycontrol is TextBox) 

ध्यान दें कि यह पूरी तरह से

के बराबर नहीं है

क्योंकि mycontrol में एक प्रकार का प्रकार हो सकता है जो TextBox से लिया गया है। उस मामले में पहली तुलना true और दूसरा false उत्पन्न करती है! सबसे पहले और आसान संस्करण अधिकांश मामलों में ठीक है, क्योंकि TextBox से प्राप्त नियंत्रण में TextBox सबकुछ प्राप्त होता है, शायद इसमें अधिक जोड़ता है और इसलिए TextBox पर असाइनमेंट असाइनमेंट है।

public class MySpecializedTextBox : TextBox 
{ 
} 

MySpecializedTextBox specialized = new MySpecializedTextBox(); 
if (specialized is TextBox)  ==> true 

if (specialized.GetType() == typeof(TextBox))  ==> false 

कास्टिंग

आप निम्नलिखित परीक्षण एक डाली से पालन किया है और टी नल है ...

if (obj is T) { 
    T x = (T)obj; // The casting tests, whether obj is T again! 
    ... 
} 

... आप इसे बदल सकते हैं। ..

T x = obj as T; 
if (x != null) { 
    ... 
} 

यह जांच कर रहा है कि कोई मान किसी दिए गए प्रकार और कास्टिंग का है (जिसमें यह वही परीक्षण शामिल है) दोनों लंबे विरासत श्रृंखलाओं के लिए समय ले सकते हैं। as ऑपरेटर का उपयोग करके null के लिए एक परीक्षण के बाद अधिक प्रदर्शन किया जा रहा है।

सी # 7 से शुरू हो रहा है।0 आप पैटर्न मिलान का उपयोग करके कोड को सरल बना सकते हैं:

if (obj is T t) { 
    // t is a variable of type T 
    ... 
} 
संबंधित मुद्दे