2011-03-07 14 views
19

क्या कोई मुझे बता सकता है कि चेक किया गयाअनचेक ब्लॉक?
और मुझे प्रत्येक का उपयोग कब करना चाहिए?सी # चेक ब्लॉक

उत्तर

34

अंकगणित अतिप्रवाह; उदाहरण के लिए:

int i = int.MaxValue -10; 
checked {  
    i+= 20; // boom: OverflowException 
      // "Arithmetic operation resulted in an overflow." 
} 

तो checked का उपयोग करके ऐसी आकस्मिक अतिप्रवाह नहीं करना चाहती/लपेट के आसपास एक समस्या है, और बजाय एक अपवाद देखना होगा।

unchecked ओवरफ्लो को अनुमति देने के लिए स्पष्ट रूप से मोड सेट करता है; डिफॉल्ट unchecked है जब तक आप संकलक को अन्यथा नहीं बताते - या तो कोड (उपरोक्त) या एक कंपाइलर स्विच (/checked सीएससी में) के माध्यम से।

+0

यह पुराना है लेकिन क्या हम इसके बजाय कोशिश/पकड़ का उपयोग नहीं कर सकते? बस केस परिदृश्य का पता लगाने की कोशिश कर रहा है। – Si8

+2

@ Si8 नोप; यहां पूरा बिंदु ** कारण ** एक त्रुटि है; डिफ़ॉल्ट रूप से सी # अनचेक अंकगणित का उपयोग करता है, इसलिए अतिप्रवाह चुपचाप होता है। कोशिश/पकड़ जोड़ने से कुछ भी नहीं होगा अगर यह कभी नहीं फेंकता। यह 'चेक किया गया 'जोड़ रहा है जो * इसे ओवरफ्लो –

+0

पर फेंकने के लिए धन्यवाद देता है। – Si8

12

MSDN से

सी # बयानों में या तो जाँच या अनियंत्रित संदर्भ निष्पादित कर सकते हैं। चेक किए गए संदर्भ में, अंकगणित ओवरफ़्लो अपवाद उठाता है। एक अनचेक संदर्भ में, अंकगणित ओवरफ़्लो अनदेखा किया गया है और परिणाम छोटा कर दिया गया है।

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

अब, आपका संदर्भ अनचेक या चेक किया गया है या नहीं, आपके कंपाइलर विकल्पों पर निर्भर करता है। इसलिए यदि आप संदर्भ को मैन्युअल रूप से ओवरराइड करना चाहते हैं, तो मैं अन्यथा अनचेक संदर्भ में एक चेक ऑपरेशन निष्पादित करता हूं या इसके विपरीत, आपको इन कीवर्ड का उपयोग करना चाहिए।

अधिक जानकारी और उदाहरण ऊपर दिए गए लिंक का पालन करें।

+0

तो अनचेक ब्लॉक के लिए क्या अच्छा है? –

+1

अनचेक ब्लॉक तब से अच्छे होते हैं जब आप ओवरफ्लो को बस लपेटना चाहते हैं, जैसे हैशकोड की गणना करते समय। –

+0

@Yochai - मेरा अद्यतन उत्तर देखें। –

3

अंकगणित अतिप्रवाह/अंडरफ्लो स्थितियों को संभालने के लिए उपयोग किए गए ब्लॉक का उपयोग किया गया। एक उदाहरण के लिए:

मान लीजिए कि आप एक छोटी प्रकार मान (एक संकुचन रूपांतरण कहा जाता है) में एक पूर्णांक मूल्य में परिवर्तित करना चाहते हैं। इंट टाइप वैरिएबल में मूल्य सीमा 2,147,483,648 से 2,147,483,647 हो सकती है। लेकिन लघु केवल -32,768 से 32,767 हो सकता है।

इसी कारण से कम चर के पास एक संभावित चर के सभी संभावित मान नहीं हो सकते हैं। कुछ कैसे करते हैं, तो एक निम्न उदाहरण के रूप में कास्ट कर सकते हैं:

   int y = 1000000000; 
       short x = (short)y; 

जाहिर है कि आप देख सकते y का मूल्य एक छोटी चर के लिए मान्य मानों के बाहर है। तो अंकगणित अतिप्रवाह स्थिति होती है।

डिफ़ॉल्ट रूप से सी # उपरोक्त कोड के लिए कोई अपवाद नहीं फेंकता है। लेकिन कुछ अपवाद हैं जो आप अपवाद फेंक सकते हैं और इसे संभाल सकते हैं। में उस मामले ब्लॉक जाँच काम

में आता है
 try 
     { 
      checked 
      { 
       int y = 1000000000; 
       short x = (short)y; 
      } 
     } 
     catch (OverflowException ex) 
     { 
      MessageBox.Show("hey, we got a overflow/underflow situation"); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error"); 
     } 

कैच ब्लॉक एक अतिप्रवाह अपवाद फेंकने के कारण होता है, यदि कास्टिंग एक अतिप्रवाह/अधःप्रवाह स्थिति का कारण बना। इस मामले में यह त्रुटि संदेश

अगर हम अधःप्रवाह/अतिप्रवाह त्यागना चाहते

अनियंत्रित ब्लॉक उपयोग कर रहे हैं जब एक रूपांतरण हुआ है और जारी रखने के लिए "हे, हम एक अतिप्रवाह/अधःप्रवाह स्थिति मिल गया" से पता चलता ऑपरेशन।

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