2009-12-15 11 views
5

निम्न कोड के संबंध में:सी #: "उपयोग" के साथ एक चर शुरू करना

using (SqlConnection sqlConnection = new SqlConnection(connectionString)) 
{ 
    code... 
} 

क्या SQLLonnection "उपयोग" के साथ प्रारंभ किया गया है, इसलिए इसे ब्रैकेट के बाद संदर्भित/नष्ट कर दिया गया है?

कृपया जहां आवश्यक हो वहां मेरी पूछताछ को सही करें।

उत्तर

8

using ऑब्जेक्ट पर Dispose() को सही ढंग से कॉल करने के लिए एक वाक्य रचनात्मक शॉर्टकट है।

ब्रेसिज़ में कोड निष्पादित करने के बाद, Dipose() स्वचालित रूप से using कथन में लिपटे ऑब्जेक्ट पर कॉल किया जाता है।

संकलन समय, ऊपर अपने कोड वास्तव में

{ 
    SqlConnection sqlConnection = new SqlConnection(connectionString); 
    try 
    { 
    // .. code 
    } 
    finally 
    { 
    if (sqlConnection!= null) 
     ((IDisposable)sqlConnection).Dispose(); 
    } 
} 

को विस्तार किया जाएगा आप देख सकते हैं कि यह एक आसान शॉर्टकट है।

+0

तो अगर मैं इस के लिए कैच खंड जोड़ने के लिए, आप एक कोशिश पकड़ करने के लिए "का उपयोग" शॉर्टकट बदलने की सिफारिश करेंगे चाहता था एक कोशिश पकड़ने में उपयोग करने के लिए अंत में या लपेटना? मेरा मानना ​​है कि उत्तरार्द्ध के साथ समस्याएं हैं, लेकिन मुझे यकीन नहीं है कि वे वास्तव में क्या हैं। –

+1

बस अपनी कोशिश को लपेटें .. उपयोग ब्लॉक के चारों ओर पकड़ें: {var db = new sqlConnection (connectionString)) का उपयोग करें {कोड ...} {panic ...} या इसके अंदर: (var db = new sqlConnection (कनेक्शनस्ट्रिंग)) {कोशिश करें {कोड ...} पकड़ें {दहशत ...}} - अगर आप "नया SqlConnection (कनेक्शनस्ट्रिंग)" द्वारा फेंक दिया अपवाद पकड़ना चाहते हैं या नहीं। –

+3

मैं कोशिश-पकड़ के अंदर उपयोग करूँगा। – TheSean

0

जब sqlConnection वैरिएबल दायरे से बाहर हो जाता है (ब्रैकेट किए गए ब्लॉक के अंत में), Dispose() विधि स्वचालित रूप से कॉल की जाएगी।

0

उपयोग कथन के बाद यह उस क्षेत्र से बाहर निकल जाएगा जो इसमें उपलब्ध है। ऑब्जेक्ट्स डिस्प्ले विधि को कॉल किया जाएगा, लेकिन ऑब्जेक्ट उस समय कचरा नहीं होगा।

तो इसका मतलब यह है कि यदि आपके पास ऑब्जेक्ट्स डिस्प्ले() विधि में साफ किए गए आइटम (फाइलें बंद हैं) हैं, तो वे उपयोग कथन समाप्त होने के तुरंत बाद साफ़ हो जाएंगे। यदि आपके पास इसके अलावा एक फाइनलाइज़र (~ YourClassName) है जो अन्य चीजें करता है, तो आप गारंटी नहीं दे सकते कि उस समय कॉल किया जाएगा।

6

हां। कथन का उपयोग सिर्फ वाक्यात्मक चीनी है, और जैसे

SqlConnection sqlConnection; 
try 
{ 
    sqlConnection = new SqlConnection(connectionString); 
    // code... 
} 
finally 
{ 
    if (sqlConnection != null) 
    sqlConnection.Dispose(); 
} 
+6

यह उस ब्लॉक में "sqlConnection" नाम भी स्कॉप्स करता है, इसलिए यदि आप इसे डिस्पोजेड किए जाने के बाद कोशिश करते हैं और इसका उपयोग करते हैं तो आपको एक कंपाइलर त्रुटि मिलती है। – ctford

+0

जानना अच्छा है। धन्यवाद। – Dathan

+0

यदि यह संकलित किया गया है, तो क्या आप 'प्रयोग' ब्लॉक के साथ अपवाद पकड़ सकते हैं? – contactmatt

2

का उपयोग कर उस पर एक भाषा निर्माण है कि एक IDisposable लेता है और कहता है निपटान() है कुछ में संकलक द्वारा अनुवाद किया है।

तो

using (SqlConnection sqlConnection = new SqlConnection(connectionString)) 
{ 
    code... 
} 

है मोटे तौर पर बराबर

SqlConnection sqlConnection = null; 
try { 
    sqlConnection = new SqlConnection(connectionString)); 
    code ... 
} finally { 
    if(sqlConnection != null) sqlConnection.Dispose(); 
} 
+2

+1। क्या हम पहले से ही एक नया वाक्यांश चुन सकते हैं !? – Dan

+0

@ डैन: सहमत! +1 –

+3

'सिंटेक्टिक चीनी' नए वाक्यविन्यास के लिए कला की अवधि है जो कि भाषा में पहले से ही एक अवधारणा की एक संक्षिप्त अभिव्यक्ति है। यह दूर नहीं जा रहा है। –

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