2010-05-20 9 views
5

उदाहरण के लिए। आइए कहें कि हमारे पास एक फॉर्म पर एक स्टैपपैन है। यह ग्रिड और लेबल दोनों से भरा है। मैं सभी ग्रिड के माध्यम से लूप करना चाहता हूं और उन पर कुछ ऑपरेशन करना चाहता हूं लेकिन लेबल्स को बरकरार रखना छोड़ देता हूं। फिलहाल मैं इसे इस तरह से कर रहा हूं।"as" का उपयोग करके और एक शून्य वापसी की उम्मीद

foreach(UIElement element in m_stacker.Children) 
{ 
    Grid block = element as Grid; 
    if(block != null) 
    { 
     //apply changes here 
    } 
} 

तो मैं इस तथ्य अशक्त रिटर्न कि "के रूप में" अगर यह आवश्यक प्रकार में डाला नहीं कर सकते हैं का उपयोग कर रहा हूँ। क्या यह ठीक काम है या क्या इस समस्या का बेहतर समाधान है?

+7

असल में, यह शायद 'as' के लिए सबसे आम उपयोग केस है। –

+0

सभी प्रतिक्रिया लोगों के लिए धन्यवाद। मैं "जैसा" दिखने के लिए सही काम की तरह दिखता हूं। – DrLazer

उत्तर

8

हां, यह करने का सही तरीका है ("लागू करने वाले परिवर्तनों" पर विचार करने से कास्ट परिणाम का उपयोग करने की आवश्यकता होगी)।

हालांकि, यदि आप कास्ट रिटर्न वैल्यू का उपयोग नहीं करेंगे, तो आप बस is का उपयोग कर सकते हैं।

is और फिर casting again with the cast operator (parenthesis) is frowned upon का उपयोग करना।

2

यह ठीक काम करेगा। आप क्या कर सकते हैं हालांकि सिर्फ "है" का उपयोग करें।

foreach(UIElement element in m_stacker.Children) 
{ 
    if(element is Grid) 
    { 
     //apply changes here 
    } 
} 
+1

केवल तभी यदि आपको 'ग्रिड' के गुणों और विधियों तक पहुंच की आवश्यकता नहीं है। – ChrisF

+0

यह स्पष्ट है कि आपको इसे कास्ट करने की आवश्यकता है। :) – sovanesyan

13

OfType() के बारे में क्या?

foreach(var grid in m_stacker.Children.OfType<Grid>()) { ... } 

ही प्रकार ग्रिड के बच्चों से अधिक हो जाएगा ताकि पाश, इसलिए डाली या बिल्कुल भी प्रकार की जांच करने के लिए कोई जरूरत नहीं।

+3

वास्तव में, 'ऑफ टाइप () 'आंतरिक रूप से वही कर रहा है। ;-) – Oliver

+3

@ ऑलिवर: लेकिन कोड अधिक पठनीय दिखता है और इस तरह छोटा है। – tanascius

+1

'ऑफटाइप' संग्रह में किसी प्रकार के तत्वों को फ़िल्टर करने का एक अच्छा तरीका है। हालांकि, यदि आप एक ही संग्रह में विभिन्न वस्तुओं के साथ अलग-अलग चीजें करना चाहते हैं ('var g = o ग्रिड के रूप में; यदि (g! = Null) {/ * ऐसा करें * /} और {var c = o कैनवास के रूप में; यदि (सी! = शून्य) {/ * वह करें * /}} '), आपको संग्रह को 'ऑफटाइप' के साथ कुछ बार फिर से करना होगा - और जब आपके पास संग्रह के बजाए एक ही ऑब्जेक्ट होता है, तो यह नहीं होता है एक विकल्प। –

2

यदि आप block को Grid के रूप में उपयोग करने जा रहे हैं तो यह कोड करने का बिल्कुल सही तरीका है।

if (element is Grid) 
{ 
    Grid block = element as Grid; 
    // Do stuff 
} 

if (element is Grid) 
{ 
    Grid block = (Grid)element; 
    // Do stuff 
} 

इन से किसी भी कार्य न करें:

is का उपयोग कर (मेरे विचार से) जाँच हो रही है कम पठनीय कोड निम्न दो बुरा उदाहरण में दर्शाया गया है पैदा करता है।

आप कह रहे हैं कि तत्व एक ग्रिड है तो इसे कास्ट करें।

+0

कोड विश्लेषण की सिफारिश की गई है जैसा आपने लिखा था। सबसे अच्छा तरीका यह है कि ऑपरेटर 'as' का उपयोग करने और 'null' की जांच करने के लिए लगता है। – abatishchev

+0

@abatishchev - सहमत - मैं हाइलाइट कर रहा था कि आपको ** ** क्या नहीं करना चाहिए। – ChrisF

+0

मैं सहमत हूं।हालांकि, 'है' का उपयोग करने में बिल्कुल कुछ भी गलत नहीं है, मुझे लगता है कि 'जैसा' ज्यादातर स्थितियों में निश्चित रूप से बेहतर है। –

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