2010-06-29 30 views
6

ठीक है, तो मेरे पास माइक्रोसॉफ्ट से यह निफ्टी बिट कोड है, और मेरे पास थोड़ा सा हिचकी है जिसे मैं छुटकारा दिलाना चाहता हूं।परिवर्तनीय 'एक्स' घोषित किया गया है लेकिन कभी भी त्रुटि का उपयोग नहीं किया गया

मूल कोड कंसोल पर ChangeConflictException x प्रिंट करता है, लेकिन मैंने इस पंक्ति को मिटा दिया। अब, हर बार जब मैं इस कोड का उपयोग करता हूं, तो मुझे त्रुटि मिलती है: "परिवर्तनीय 'एक्स' घोषित किया जाता है लेकिन कभी भी इसका उपयोग नहीं किया जाता है"।

कोड की कार्यक्षमता को बनाए रखने के दौरान इस त्रुटि से छुटकारा पाने का सबसे प्रभावी तरीका क्या है?

//See http://msdn.microsoft.com/en-us/library/bb386918.aspx 
try 
{ 
    DB.SubmitChanges(ConflictMode.ContinueOnConflict); 
} 

catch (ChangeConflictException x) 
{ 
    foreach (ObjectChangeConflict occ in DB.ChangeConflicts) 
    { 
     occ.Resolve(RefreshMode.KeepChanges); 
    } 
} 
// Submit succeeds on second try. 
DB.SubmitChanges(ConflictMode.FailOnFirstConflict); 
+5

बस स्पष्ट करने के लिए, यह एक चेतावनी है, कोई त्रुटि नहीं, सही? – Robaticus

+3

@Robaticus - जब तक आप चेतावनियों के रूप में त्रुटियों को सक्षम नहीं करते हैं; पी –

+0

ओह स्नैप! लेकिन हाँ, मैं इसे एक त्रुटि चेतावनी देने के लिए गलत था। – sooprise

उत्तर

22

कंपाइलर सही है; यह बस के रूप में अच्छी तरह से हो सकता है:

catch (ChangeConflictException) 
{ 
    foreach (ObjectChangeConflict occ in DB.ChangeConflicts) 
    { 
     occ.Resolve(RefreshMode.KeepChanges); 
    } 
} 

जो अपवाद जो कि ब्लॉक में प्रवेश को सीमित करता है, लेकिन इसके लिए एक चर की घोषणा नहीं करता है। वेरिएबल उपयोगी है यदि आप का मान मानना ​​चाहते हैं, इसे लॉग करें या इसे किसी अन्य अपवाद में लपेटें। बस पूर्णता के लिए (यहां लागू नहीं होता है) आम तौर पर एक पुनः-फेंक throw;, throw x; (स्टैक-ट्रेस को संरक्षित करने के लिए) होना चाहिए।

+0

ठीक है, मुझे संदेह है कि आप 'x' को हटा सकते हैं, लेकिन मेरे लिए यह बताने के लिए कोड बहुत जटिल है कि क्या यह कोई महत्वपूर्ण बदलाव करता है या नहीं। धन्यवाद! – sooprise

3

हालांकि इस मामले में आप आसानी से 'एक्स' वैरिएबल से छुटकारा पा सकते हैं (जैसा कि मार्क द्वारा उल्लिखित है)। आम तौर पर, उन परिदृश्यों के लिए जहां मेरे पास ये चेतावनियां हैं और मैं कोड को बदल नहीं सकता (जैसे प्रतिबिंब द्वारा कुछ क्षेत्रों का उपयोग करना) मैं आमतौर पर सशर्त संकलन विधि को कॉल करने के लिए कुछ भी नहीं करना पसंद करता हूं जो ऐसी परेशान चेतावनियों को दबाता है।

नीचे कोड। सशर्त विशेषता के बारे में MSDN से

catch (ChangeConflictException x) 
    { 
    DoNothingWith(x);// This suppress the 'x' not used warning 
    foreach (ObjectChangeConflict occ in DB.ChangeConflicts) 
    { 
     occ.Resolve(RefreshMode.KeepChanges); 
    } 
    } 

    [Conditional("Debug")] 
    public static void DoNothingWith(object obj){ 

    } 

संदर्भ: "कॉल करने के लिए एक सशर्त विधि या तो शामिल या इस प्रतीक कॉल के बिंदु पर परिभाषित किया गया है जो इस पर निर्भर छोड़े गए हैं प्रतीक परिभाषित किया गया है, तो कॉल शामिल है। ; अन्यथा, कॉल (कॉल के पैरामीटर के मूल्यांकन सहित) छोड़ा जाता है। "

+0

आप यह भी कर सकते हैं: 'x = x'। –

+4

@ लोडमास्टर: कृपया कक्षा को समझाएं कि इसे "अप्रयुक्त स्थानीय" चेतावनी से कैसे छुटकारा मिल रहा है, इसे "स्थानीय को स्वयं सौंपा गया है" चेतावनी एक सुधार है। –

+0

उम, ठीक है, मुझे नहीं लगता था कि संकलक इसे पकड़ लेगा। –

1
#pragma warning disable 0168 

catch (ChangeConflictException x) 
{ 
    // code here 
} 

#pragma warning enable 0168 
संबंधित मुद्दे

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