2011-12-02 24 views
6

एसओ पर बहुत से लोगों ने बताया कि मुझे using कथन का अधिक उपयोग करना चाहिए। तो मैं अभ्यास कर रहा हूँ।कथन का उपयोग करते समय उपयोग किया जाना चाहिए?

समस्या यह है कि मैं यह तय नहीं कर सकता कि इसका उपयोग कब करें और इसका उपयोग न करें। जब मुझे लगता है कि मैं इसे का उपयोग करना चाहिए, तो मैं इस तरह के इस उदाहरण में त्रुटियों मिल (। पुनश्च HashPhrase एक वर्ग मुझे के द्वारा बनाई गई है):

 using (HashPhrase hash = new HashPhrase()) 
     { 
      connection.ConnectionString = 
       "Provider=Microsoft.ACE.OLEDB.12.0;" + 
       "Data Source=" + filePath + ";" + 
       "Persist Security Info=False;" + 
       "Jet OLEDB:Database Password=" + hash.ShortHash(pass) + ";"; 
     } 

लेकिन यह मुझे एक त्रुटि देता है: 'Password_Manager.HashPhrase': type used in a using statement must be implicitly convertible to 'System.IDisposable'

लेकिन में इस उदाहरण यह ठीक काम करता है:

using (OleDbConnection connection = new OleDbConnection()) 
    { 
     connection.ConnectionString = 
      "Provider=Microsoft.ACE.OLEDB.12.0;" + 
      "Data Source=" + filePath + ";" + 
      "Persist Security Info=False;" + 
      "Jet OLEDB:Database Password=" + hash.ShortHash(pass) + ";"; 

     using (OleDbCommand command = new OleDbCommand(sql, connection)) 
     { 
      try 
      { 
       connection.Open(); 
       command.ExecuteNonQuery(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Error: " + ex.Message); 
      } 
     } 
    } 

कोई त्वरित दिशा-निर्देश कैसे जब using बयान इस्तेमाल किया जाना चाहिए निर्धारित करने के लिए कर रहे हैं?

उत्तर

14

आपका प्रश्न पहले से ही उत्तर पर छूता है।

यदि प्रकार IDisposable इंटरफ़ेस लागू करता है तो आपको जब भी संभव हो तो using का उपयोग करना चाहिए (यानी, जब तक कि कोई अनिवार्य कारण न हो)।

और यदि प्रकार IDisposable लागू नहीं करता है तो आप using का उपयोग नहीं कर सकते हैं, और संकलक आपको बताएगा, जैसा कि आप पहले ही खोज चुके हैं।

+0

यह समझ में आता है। – HelpNeeder

+1

@downvoter: क्या आप डाउनवोट के लिए अपने कारणों की व्याख्या करना चाहते हैं? संदर्भ के लिए – LukeH

4

जब भी कक्षाइंटरफ़ेस लागू करती है तो आपको using कथन का उपयोग करना चाहिए।

ऑब्जेक्ट की Dispose विधि को किसी भी संसाधन को रिहा करने के लिए हमेशा कॉल करने के लिए ऑब्जेक्ट को 0 -विधि को ऑब्जेक्ट को लपेटने के लिए ऑब्जेक्ट को लपेटने के लिए यह एक शॉर्टेंड है, भले ही कोई अपवाद फेंक दिया गया हो।

जांचने के लिए, विजुअल स्टूडियो में कक्षा का नाम राइट-क्लिक करें और ऑब्जेक्ट ब्राउज़र में इसे खोलने के लिए घोषणा पर जाएं। फिर आप आसानी से जांच सकते हैं कि कक्षा या उसके मूल प्रकार IDISposable लागू करते हैं या नहीं।

+0

+1 :) – HelpNeeder

4

using (var r = new R()) 
{ 
    // use r 
} 

वर्ग R में IDisposing इंटरफ़ेस को लागू करना चाहिए।

2

यह देखने का सबसे आसान तरीका यह है कि ऑब्जेक्ट IDISposable इंटरफ़ेस लागू करता है या नहीं। तो, प्रश्न में ऑब्जेक्ट/क्लास पर राइट क्लिक करें, ड्रॉपडाउन से परिभाषा पर जाएं (या F12 दबाएं), और देखें कि कक्षा IDISposable लागू करती है या नहीं। नोट, एक कक्षा में जो कई इंटरफेस/अन्य कक्षाओं को लागू करता है, आपको वास्तव में उन कक्षाओं की जांच करने की आवश्यकता हो सकती है ताकि वे यह देख सकें कि क्या वे आईडीस्पोज़ेबल को भी लागू करते हैं या नहीं।

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