जांचें कि क्या उदाहरण एक प्रकार का है


181

अगर cइसका उदाहरण है, यह जाँचने के लिए इसका उपयोग करना TForm

c.GetType().Name.CompareTo("TForm") == 0

वहाँ stringएक परम के रूप में एक का उपयोग करने के अलावा यह करने के लिए एक और अधिक सुरक्षित तरीका है CompareTo()?


20
मुझे निश्चित रूप से उम्मीद है कि आप इसे जावा में नहीं करेंगे। जावा के instanceofऔर C # के isबेहतर तरीके हैं।
पावरलॉर्ड

जवाबों:


410

यहाँ अलग-अलग उत्तरों के दो अलग-अलग अर्थ हैं।

आप देखना चाहते हैं तो एक उदाहरण के है कि क्या एक सही प्रकार तो

if (c.GetType() == typeof(TForm))

जाने का रास्ता है।

यदि आप जानना चाहते हैं कि क्या cएक उदाहरण TForm या एक उपवर्ग है तो उपयोग करें is/ as:

if (c is TForm)

या

TForm form = c as TForm;
if (form != null)

यह आपके मन में स्पष्ट है कि इनमें से कौन सा व्यवहार आप वास्तव में चाहते हैं।


7
एक छोटा नोट: "का उपयोग करें" यदि आप कलाकारों के परिणाम का उपयोग नहीं करना चाहते हैं और यदि आप करते हैं तो "के रूप में" का उपयोग करें।
अविराम फायरबर्गर

14
सी # 7 के साथ आप संयोजन कर सकते हैं isऔर asपैटर्न मिलान के साथ:if (x is TForm tf) {…
रिचर्ड

39
if(c is TFrom)
{
   // Do Stuff
}

या यदि आप cएक के रूप में उपयोग करने की योजना बनाते हैं TForm, तो निम्न उदाहरण का उपयोग करें:

var tForm = c as TForm;
if(tForm != null)
{
   // c is of type TForm
}

दूसरे उदाहरण केवल देखने हेतु जांचने की जरूरत है cप्रकार का है TFormएक बार। यदि आप देखते हैं कि यदि जाँच करें कि क्या cप्रकार है, TFormतो इसे डालें, सीएलआर एक अतिरिक्त जाँच से गुजरता है। यहाँ एक संदर्भ है

संपादित करें: जॉन स्कीट से चोरी

आप बनाना चाहते हैं यकीन है कि cकी है TFormऔर नहीं किसी भी वर्ग से इनहेरिट TForm, तो उपयोग

if(c.GetType() == typeof(TForm))
{
   // Do stuff cause c is of type TForm and nothing else
}

14

हां, "कीवर्ड" है:

if (c is TForm)
{
    ...
}

MSDN पर विवरण देखें: http://msdn.microsoft.com/en-us/library/scekt9xw(VS.80).aspx

जाँचता है कि क्या कोई वस्तु किसी प्रकार से संगत है। उदाहरण के लिए, यह निर्धारित किया जा सकता है कि क्या कोई वस्तु स्ट्रिंग प्रकार के साथ संगत है:


10

इसके अलावा, कुछ हद तक एक ही नस में

Type.IsAssignableFrom(Type c)

"सही है अगर c और वर्तमान प्रकार एक ही प्रकार का प्रतिनिधित्व करते हैं, या यदि वर्तमान प्रकार c की वंशानुक्रम पदानुक्रम में है, या यदि वर्तमान प्रकार एक इंटरफ़ेस है जो c लागू होता है, या यदि c एक सामान्य प्रकार का पैरामीटर और वर्तमान प्रकार है सी की बाधाओं में से एक का प्रतिनिधित्व करता है। "

यहाँ से: http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx


यह मेरा निजी पसंदीदा भी है। typeof(Class).IsAssignableFrom(object.getType())जावा instanceofऑपरेटर के समान ।
स्किडररनर

क्या यह गलत है यदि वे वंशानुगत पदानुक्रम की एक ही शाखा में नहीं हैं लेकिन एक रूपांतरण ऑपरेटर मौजूद है?
पॉल स्टेलियन

अच्छा सवाल @PaulStelian। मुझे यकीन नहीं है कि मेरे सिर के ऊपर से निकल जाएगा, लेकिन मेरा अनुमान है कि यह उस स्थिति में गलत होगा। कम से कम मेरा अपेक्षित व्यवहार तो यही होगा। संभवतः यदि एक अंतर्निहित रूपांतरण मौजूद है तो यह सच हो सकता है लेकिन यह अजीब होगा।
ब्रैड कनिंघम

कोई भी, जिसके पास विजुअल स्टूडियो है, उसने इसे आज़माया है?
पॉल स्टेलियन

1
@PaulStelian - यह गलत है। यह डॉक्टर लिंक का अनुसरण करके देखा जा सकता है, और यह देखते हुए कि रूपांतरण का कोई उल्लेख नहीं है। इसके बारे में सोचने का एक और तरीका यह है कि उन स्थितियों में T1.IsAssignableFrom(T2)रिटर्न trueजहां asऑपरेटर गैर-शून्य मान लौटाता है, उन प्रकारों के उदाहरण दिए गए हैं।
टूलमेकरसैट

9

यदि आप एक TForm के रूप में सी का उपयोग करना चाहते हैं, तो अन्य उत्तरों की तुलना में थोड़ा अधिक कॉम्पैक्ट:

if(c is TForm form){
    form.DoStuff();
}


2

जैसा कि दूसरों ने उल्लेख किया है, "कीवर्ड" है। हालाँकि, यदि आप बाद में इसे उस प्रकार से डालने जा रहे हैं, जैसे।

TForm t = (TForm)c;

फिर आपको "as" कीवर्ड का उपयोग करना चाहिए।

जैसे TForm t = c as TForm.

तब आप जांच कर सकते हैं

if(t != null)
{
 // put TForm specific stuff here
}

के साथ गठबंधन मत करो क्योंकि यह एक डुप्लिकेट चेक है।



-1
bool isValid = c.GetType() == typeof(TForm) ? true : false;

या सरल

bool isValid = c.GetType() == typeof(TForm);

IMHO: मैं एक प्रत्यक्ष करुणा (यानी। ==) से बचना होगा । विरासत का समर्थन करने वाली वस्तु या उन्मुख भाषाओं में जब तक आप यह नहीं जानते कि आपके विशिष्ट प्रकार को कभी भी sealedकक्षा के लिए विरासत में नहीं मिलेगा । इसके अलावा: एक टर्नरी ऑपरेटर की वापसी (स्थिर / स्थिर) बूलियन मूल्यों का उपयोग मुझे परेशान करता है, अगर यह एक switchबयान था तो मैं कम परेशान होऊंगा ।
स्किडरनर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.