2010-07-06 18 views
7

का उपयोग करके मैं वास्तव में इसे अपने सिर से बाहर करना चाहता हूं। कृपया कोड नीचे देखें:सी # कथन

using (DataTable resultTable = DBUtility.GetSingleDBTableResult(connectionString, "SELECT * FROM MyDBTable")) { 
    List<string> resultsList = new List<string>(); 
    foreach (DataRow dataRow in resultTable.Rows) { 
     resultsList.Add(dataRow[0].ToString()); 
    } 
    return resultsList; 
} 

datatable निपटाए है? क्या कोई यह समझा सकता है कि इसका प्रयास कैसे करें/कैच/आखिरकार ब्लॉक में किया जाता है? एमएसडीएन का कहना है कि यदि कोई अपवाद हुआ, तो निपटान विधि अभी भी बुलाई जाएगी लेकिन रिटर्न स्टेटमेंट के बारे में क्या होगा?

या मैं बस नीचे दिए गए कोड का उपयोग करना चाहिए:

List<string> resultsList = new List<string>(); 
using (DataTable resultTable = DBUtility.GetSingleDBTableResult(connectionString, "SELECT * FROM MyDBTable")) { 
    foreach (DataRow dataRow in resultTable.Rows) { 
     resultsList.Add(dataRow[0].ToString()); 
    } 
} 
return resultsList; 

शायद, दूसरा एक प्रयोग किया जाना चाहिए, लेकिन मैं सिर्फ ज्ञान की जरूरत है :)। कृपया समझाएँ। धन्यवाद।

+1

भी आप चाहते हैं, निपटान परवाह किए बिना कहा जाएगा अपनी वापसी रखो। 'प्रयोग' आपका दोस्त है! – Chris

उत्तर

5

using बयान बस वाक्यात्मक चीनी है और यह/अंत में ब्लॉक कोशिश में अनुवाद किया जाता है। अपने कोड से शुरू करना, यहां बताया गया है कि सी # कंपाइलर using ब्लॉक का प्रयास/आखिरकार ब्लॉक में कैसे करेगा।

 try 
     { 
      DataTable resultTable = DBUtility.GetSingleDBTableResult(connectionString, "SELECT * FROM MyDBTable"); 
      List<string> resultsList = new List<string>(); 
      foreach (DataRow dataRow in resultTable.Rows) 
      { 
       resultsList.Add(dataRow[0].ToString()); 
      } 
      return resultsList; 
     } 
     finally 
     { 
      resultTable.Dispose(); 
     } 

आप कोड से देख सकते हैं, resultTable यकीन के लिए बदले बयान की परवाह किए बिना निपटारा हो जाता है। उपयोग ब्लॉक केवल यह सुनिश्चित करता है कि वस्तु के दायरे के बाद निपटान हो जाए।

आपका पहला कोड मुझे ठीक दिखता है और उसे बदलने की आवश्यकता नहीं है।

1

दोनों मामलों में डेटाटेबल का निपटारा किया गया है (.Dispose कहा जाता है)।

यह एक try/finally में अनुवाद किया है, Dispose साथ finally में बुलाया जा रहा है। अंत में, जैसा कि नाम का तात्पर्य है, तब भी कहा जाता है जब आप return पर कॉल करते हैं।

4

Using पकड़ अपवाद नहीं है, यह केवल .Dispose() कॉल की गारंटी देता है।

ResourceType resource; 
try 
{ 
    resource = new ResourceType(); 
    /* The insides of the using block */ 
} 
finally 
{ 
    resource.Dispose(); 
} 

.Dispose() कॉल हमेशा मूल्यांकन किया जाएगा:

इसका कारण यह है

using (ResourceType resource = new ResourceType()) के बराबर है है। Dispose कॉल का मूल्यांकन भी किया जाता है यदि आप अपने using ब्लॉक (इससे पहले "वास्तव में" रिटर्न) में वापस आते हैं। Dispose कॉल का मूल्यांकन भी किया जाता है यदि कोई अपवाद फेंक दिया जाता है।

हालांकि, अगर एक अपवाद फेंक दिया जाता है, कि अपवाद अभी भी कोड के बाद लाइनों मूल्यांकन किया जा रहा से रोक देगा (.Dispose() के अपवाद के साथ जो हमेशा का मूल्यांकन किया है)।

जैसे, एक अपवाद तब होता है, अपने return अपने बयानों में से किसी में वापस नहीं होगा, लेकिन आपके DataTable अभी भी निपटारा किया जाएगा।

आप एक वापसी की गारंटी चाहते हैं होता है, एक त्रुटि तब होती है, जब भी आप इस तरह कुछ करना चाहता हूँ:

List resultsList = new List(); 
try 
{ 
    using (DataTable resultTable = DBUtility.GetSingleDBTableResult(connectionString, "SELECT * FROM MyDBTable")) 
    { 
     foreach (DataRow dataRow in resultTable.Rows) 
     { 
      resultsList.Add(dataRow[0].ToString()); 
     } 
    } 
} 
catch 
{ 
} 
return resultsList; 
1

आपके दोनों उदाहरणों में, Dispose कहा जाएगा। ऐसा इसलिए है क्योंकि उपयोग कथन एक कोशिश/आखिरकार ब्लॉक में फैलता है।

विभिन्न परिदृश्यों (संदर्भ प्रकारों, गैर-शून्य मूल्य प्रकार, और गतिशील प्रकारों के लिए) को खोजने के लिए C# Language Specification (8.13 उपयोग कथन) पढ़ें।

DataTable के बाद से एक संदर्भ प्रकार है, अपने पहले नमूना निम्न के विस्तार होगा:

{ 
    DataTable resultTable = DBUtility.GetSingleDBTableResult(connectionString, "SELECT * FROM MyDBTable"); 
    try { 
     List<string> resultsList = new List<string>(); 
     foreach (DataRow dataRow in resultTable.Rows) { 
      resultsList.Add(dataRow[0].ToString()); 
     } 
     return resultsList; 
    } 
    finally { 
     if (resultTable != null) ((IDisposable)resultTable).Dispose(); 
    } 
} 
संबंधित मुद्दे