2012-04-28 10 views
5

मैंक्या की "का उपयोग"

public DataTable ExectNonActQuery(string spname, SqlCommand command) 
{ 
    using (DataTable dt = new DataTable()) 
    { 
     cmd = command; 
     cmd.Connection = GetConnection(); 
     cmd.CommandText = spname; 
     cmd.CommandType = CommandType.StoredProcedure; 
     da.SelectCommand = cmd; 
     da.Fill(dt); 
     return (dt); 
    } 
} 

और

public DataTable ExectNonActQuery(string spname, SqlCommand command) 
{ 
    DataTable dt = new DataTable(); 
    cmd = command; 
    cmd.Connection = GetConnection(); 
    cmd.CommandText = spname; 
    cmd.CommandType = CommandType.StoredProcedure; 
    da.SelectCommand = cmd; 
    da.Fill(dt); 
    return (dt); 
    } 
} 

मैं वास्तव में समझने के लिए एक नई वस्तु बनाने का उपयोग करने का लाभ यह है चाहता हूँ के बीच अंतर को समझना चाहते हैं लाभ है "का उपयोग "के बजाय यह सीधे बनाने इस

DataTable dt = new DataTable(); 
+8

क्या आपने ['उपयोग'] (http://msdn.microsoft.com/en-us/library/yh598w02 (v = vs.80) .aspx) पर प्रलेखन पढ़ा है? यदि हां, तो आपके प्रश्न क्या हैं? –

+0

डेटाटेबल के लिए अंतर शून्य है। लेकिन डेटाटेबल इस में दुर्लभ अपवादों में से एक है। –

उत्तर

11

using गारंटी देता है कि वस्तु पर निपटान किया जाता है की तरह कथन का उपयोग के अंत

आप .Dispose (कह सकते हैं) मैन्युअल बजाय, लेकिन using के साथ, यह निपटारा किया जाएगा, भले ही आप इस तरह भूल के रूप में एक अपवाद

फेंक और आप अपने खुद के गलतियों से सुरक्षित हैं, कॉल करने के लिए कॉल करने से पहले वैरिएबल, या वैरिएबल को पुन: असाइन करना।

यह सब दस्तावेज में:

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

संपादित करें: भी, के रूप में dasblinkenlight अन्य जवाब में बताते हैं, एक वस्तु के निपटान के रूप में आप इसे एक समारोह से लौटने एक बुरा विचार है

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

देखें Should I Dispose() DataSet and DataTable?

तो अपने विशिष्ट उदाहरण में व्यावहारिक मतभेद शायद शून्य कर रहे हैं।

जहां भी व्यावहारिक रूप से कथन का उपयोग करके IDISposables को लपेटना आम तौर पर अच्छा अभ्यास है। (एक वस्तु एक समारोह के अंदर निर्माण करने और फिर पहुँचा कि समारोह के बाहर है, तो यह संभव नहीं है।)

+1

निपटान भाई द्वारा आपका क्या मतलब है ?? – kashif

+0

क्या आप मुझे बता सकते हैं कि मुझे क्या लाभ मिलेगा यदि मैं दूसरे प्रश्न – kashif

+0

@ कशिफ की बजाय अपने प्रश्न के पहले उदाहरण का उपयोग करता हूं: देखें [आईडीस्पोजेबल] (http://msdn.microsoft.com/en-us/library/system.idisposable .aspx) पहले उदाहरण में आपको जो मिलता है उस पर dasblinkenlight का उत्तर भी देखें। इस मामले में कुछ भी अच्छा नहीं है – HugoRune

15

आपका पहला उदाहरण गलत है: using(var ...) सुनिश्चित करता है कि IDisposable.Dispose चर बाहर निकलने पर using अंदर घोषित पर कहा जाता है। इसलिए आपका पहला उदाहरण ऑब्जेक्ट का निपटारा करता है, जो लगभग निश्चित रूप से गलत है।

सामान्य तौर पर, using ब्लॉक मोटे तौर पर इस के बराबर है:

var x = new MyDisposable(); 
try { 
    // Do something with x 
} finally { 
    x.Dispose(); 
} 

चूंकि यह सी # में एक बहुत ही आम पैटर्न है, एक विशेष वाक्य रचना आपकी सुविधा के लिए प्रदान की जाती है।

1

MSDN से,

एक गुंजाइश को परिभाषित करता है, जिनमें से एक वस्तु या वस्तुओं निपटारा किया जाएगा बाहर।

आपको उपयोग की गई वस्तु के स्मृति/संसाधनों को निपटाने के बारे में चिंता करने की आवश्यकता नहीं है।उपयोग कथन उस का ख्याल रखेगा। नियंत्रण ब्लॉक के अंदर परिभाषित वैरिएबल स्वचालित रूप से using कथन बाहरी ब्लॉक (दायरा) से बाहर निकलने के बाद स्वचालित रूप से निपटाया जाएगा।

TYpical उदाहरण एक SQL कनेक्शन है। आम तौर पर आपको बंद विधि को कॉल करके अपने लेनदेन के बाद कनेक्शन को स्पष्ट रूप से बंद करना होगा। लेकिन उपयोग करने वाले स्टेटमेनेट का उपयोग करके, आपको इसके बारे में चिंता करने की ज़रूरत नहीं है। इसकी देखभाल की जाएगी।

सीएलआर सीएलआर मेमोरी फ्रीिंग करता है जो सीएलआर कचरा संग्रह करने का फैसला करता है .. using कथन का उपयोग करके, हम स्मृति/संसाधन को मैन्युअल रूप से इस्तेमाल कर रहे हैं। यदि कोई अपवाद फेंक दिया जाता है अपने datatable वस्तु निपटारा किया जाएगा

3
using (DataTable dt = new DataTable()) 

इस मामले में

DataTable dt = new DataTable(); 
try 
{ 
} 
finally 
{ 
    dt.Dispose() 
} 

तो के बराबर है। यह उपयोग किए बिना अपने मामले में केवल निपटारा हो जाएगा जब कचरा कलेक्टर यह एकत्रित करेगा अगर finalizer DataTable वर्ग

1

जब एक using कथन का उपयोग आप अलग वस्तुओं बनाने के लिए नहीं कर रहे हैं परिभाषित किया गया है।

एक उपयोग कथन बस एक ऑब्जेक्ट को लपेटता है जो IDISposable विरासत में आता है। जब आप टाइप

using (DataTable dt = new DataTable()) { }

DataTable dt = new DataTable() से वापसी मान जो कथन का उपयोग में चला जाता है, डीटी के लिए एक संदर्भ है।

तो यह भी तरह

DataTable dt = new DataTable(); 
using (dt) { } 

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

1

उपयोग में एक प्रकार की घोषणा करने के लिए आईडीस्पोज़ेबल को लागू करने के लिए एक प्रकार की आवश्यकता होती है जैसे कि ऑब्जेक्ट का परिभाषित दायरा समाप्त हो जाता है, ऑब्जेक्ट टाइप में परिभाषित डिस्पोजेड विधि की मदद से साफ हो जाता है।

यह वास्तव में बहुत ही रोचक है क्योंकि संकलक स्वयं कोशिश में अनुवाद का उपयोग करता है .. अंतिम रूप से कथन, जैसे कि यह स्थिरांक को उनके मूल्यों में अनुवाद करता है। तो & का उपयोग करने का व्यवहार .. आखिरकार रनटाइम पर समान है :)।

गहराई में और अधिक समझने के लिए नीचे दिए गए लिंक का उपयोग करें: http://www.codeproject.com/Articles/6564/Understanding-the-using-statement-in-C

मुझे आशा है कि यह मदद करता है।

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