2009-10-30 4 views
7

क्या कोड की निम्न दो स्निपेट के बीच अंतर है:'उपयोग' और स्कॉइंग के बीच अंतर?

using (Object o = new Object()) 
{ 
    // Do something 
} 

और

{ 
    Object o = new Object(); 
    // Do something 
} 

मैं एक बहुत अधिक using उपयोग शुरू कर दिया है, लेकिन मैं के रूप में उत्सुक हूँ क्या वास्तव में लाभ के रूप में की तुलना में कर रहे हैं वस्तुओं को स्कॉइंग करने के लिए।

संपादित करें: उपयोगी छोटी-मोटी बातें मैं इस से ले लिया:

जॉन स्कीट:

ध्यान दें कि यह किसी भी तरह से, आकार या रूप में कचरा संग्रहण के लिए मजबूर नहीं है। कचरा संग्रह और त्वरित संसाधन क्लीन-अप कुछ हद तक ऑर्थोगोनल हैं।

विल Eddins टिप्पणी:

जब तक आपकी वर्ग IDisposable इंटरफ़ेस को लागू करता है, और एक निपटान() फ़ंक्शन है, तो आप का उपयोग कर का उपयोग नहीं करते।

उत्तर

20

पहले टुकड़ा ब्लॉक के अंत में Dispose कॉल - आप इसे प्रकार जो IDisposable लागू के साथ ही कर सकते हैं, और यह मूल रूप से में Dispose कॉल एक अंत में, ब्लॉक ताकि आप प्रकार जो संसाधनों सफाई की जरूरत के साथ उपयोग कर सकते हैं ऊपर, उदाहरण के लिए

using (TextReader reader = File.OpenText("test.txt")) 
{ 
    // Use reader to read the file 
} 
// reader will be disposed, so file handle released 

ध्यान दें कि यह किसी भी तरह से, आकार या रूप में नहीं बल कचरा संग्रहण करता है। कचरा संग्रह और त्वरित संसाधन क्लीन-अप कुछ हद तक ऑर्थोगोनल हैं।

असल में, आपको using कथन का उपयोग बहुत अधिक कुछ भी करने के लिए करना चाहिए जो IDisposable लागू करता है और कौन सा कोड ब्लॉक (सफाई के मामले में) के लिए ज़िम्मेदारी ले रहा है।

+0

क्या यह कहना उचित है कि यह अधिकतर लागू होता है जब आपको अपने वर्ग के अप्रबंधित संसाधनों को साफ करने की आवश्यकता होती है? या यह पूरी तरह से प्रबंधित कक्षाओं पर भी लागू होता है? कचरा संग्रह के संबंध में नोट के लिए –

+0

+1, मुझे हमेशा इसे भूलने की प्रवृत्ति है ... – jdehaan

+0

ठीक है तो डेटा की संरचना को स्टोर करने के लिए उपयोग की जाने वाली एक सामान्य वस्तु को उपयोग खंड से कोई लाभ नहीं दिखाई देगा, लेकिन एक भारी वस्तु जो लागू करता है पहचानने योग्य होगा? – Kelsey

3

using के अंत में ऑब्जेक्ट का निपटारा हो जाता है (ऑब्जेक्ट जो आप कोष्ठक के अंदर डालते हैं उसे IDISposable लागू करना होता है)। ऑब्जेक्ट अपवाद मामलों में भी निपटान हो जाता है। और आपको कुछ समय में जीसी को ऐसा करने की प्रतीक्षा नहीं करनी है (आप इसे नियंत्रित करते हैं)।

संपादित करें: scoping का नुकसान कर रहे हैं:

  • आप वस्तु के स्वभाव को नियंत्रित नहीं करते
  • भले ही आप अपने दायरे के अंत में निपटाने कहेंगे, इसे सुरक्षित अपवाद नहीं होगा
1

IDisposable और निर्धारणीय संसाधन विध्वंस के संबंध में दस्तावेज़ देखें।

सीधे शब्दों में using{} ब्लॉक के अंत में, आप कर सकते हैं मज़बूती से आवंटित संसाधन (उदा पास फ़ाइल हैंडल, डेटाबेस कनेक्शन की निपटाने आदि पर डाल दिया,)

0

using केवल आईडीस्पोजेबल इंटरफ़ेस के कार्यान्वयन की आवश्यकता है, और दायरे के अंत में निपटान विधि को कॉल करता है।

उचित ढंग से वस्तुओं का निपटान करने के बारे में बहुत सारे तर्कसंगत तर्कों के लिए, वहां कई अन्य धागे हैं।

3

बस सचमुच अंतर दिखाने के लिए ...

using (FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate)) 
{ 
    //stuff with file stream 
} 

रूप में ही है ...

{ 
    FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate); 

    try 
    { 
    //stuff with filestream 
    } 
    finally 
    { 
    if (fileStream != null) 
     ((IDisposable)fileStream).Dispose(); 
    } 
} 

जहां के रूप में

के रूप में यह है
{ 
    FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate); 
    fileStream.Dispose(); 
} 

है।

+0

+1। – Kelsey

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

  • कोई संबंधित समस्या नहीं^_^