2017-02-10 16 views
11

ऐसा लगता है कि Set Object = Nothing इस कोड में Fs वस्तु नष्ट नहीं किया था:एक वस्तु को नष्ट करने के लिए कैसे

Sub Test2() 
    Dim Fs As New FileSystemObject 
    Set Fs = Nothing 
    MsgBox Fs.Drives.Count ' this line works 
End Sub 

अंतिम पंक्ति कोई त्रुटि के साथ काम करता !. इसका मतलब है Fs ऑब्जेक्ट अभी भी मौजूद है, है ना?

तो Fs ऑब्जेक्ट को कैसे नष्ट करें।

+1

इसे दायरे से बाहर जाने दें? आपको इसे नष्ट करने की आवश्यकता क्यों महसूस होती है? – Comintern

+0

@Comintern, मैं TrueCrypt वॉल्यूम में सहेजी गई टेक्स्ट फ़ाइल को लिखने के लिए इस ऑब्जेक्ट का उपयोग करता हूं, और इसका उपयोग करने के बाद मैं इस वॉल्यूम को तोड़ नहीं सकता, शायद अगर मैं इसे नष्ट कर दूं तो मैं इस वॉल्यूम को खाली कर सकता हूं। – Fadi

+1

संभावित डुप्लिकेट [वीबीए: एक नई वस्तु घोषित करने के दो तरीकों से अंतर? (यह समझने की कोशिश कर रहा है कि मेरा समाधान क्यों काम करता है)] (http: // stackoverflow।कॉम/प्रश्न/2478097/vba-difference-in-two-ways-of-declaring-a-new-object-try-to-understand-why) क्यों – Comintern

उत्तर

13

एक और तरीका है एक वस्तु की उचित विनाश सुनिश्चित करने के लिए, (यानी एक स्थानीय चर घोषित नहीं करते हैं) एक With ब्लॉक करने के लिए अपने ऑब्जेक्ट संदर्भ उपज के लिए है:

Sub Test() 
    With New FileSystemObject 
     MsgBox .Drives.Count 
    End With 
End Sub 

वस्तु ही कभी With ब्लॉक के अंदर मौजूद है, और जब निष्पादन End With टोकन तक पहुँच जाता है, यदि आप इसे एक कस्टम वर्ग मॉड्यूल के साथ की कोशिश आपको पता चलेगा कि वर्ग 'Class_Terminate हैंडलर, चलाता है प्रभावी रूप से उचित विनाश की पुष्टि वस्तु का।

As New मोड़, as was already explained के लिए, यदि आप Nothing कि गुंजाइश के अंदर करने के लिए ऑब्जेक्ट संदर्भ सेट करना चाहते हैं, As New साथ यह घोषणा नहीं करते हैं, क्योंकि VBA Nothing को ऑब्जेक्ट संदर्भ सेट हो जाएगा, लेकिन यह भी खुशी से होगा ("मददगार") जैसे ही आप इसे दोबारा संदर्भित करते हैं, आपके लिए एक नया उदाहरण बनाएं, केवल यह सत्यापित करने के लिए कि ऑब्जेक्ट Is Nothing है।

RD website's inspection results

(नोट:

साइड ध्यान दें, यह (कष्टप्रद) काउंटर सहज ज्ञान युक्त व्यवहार विशेष रूप से क्या Rubberduck के वस्तु चर के लिए तर्क के पीछे है आत्म सौंपा कोड निरीक्षण है अगर आप कोड आप, निरीक्षण करने के लिए चाहते हैं पता है कि यह वास्तविक VBE में बहुत तेजी से वेबसाइट)

पर से रन (मिल गया है अगर यह पहले से स्पष्ट नहीं था: मैं रबरडक परियोजना के साथ काफी शामिल हूं)

+0

बहुत धन्यवाद @ मैट्स मग। उपयोगकर्ता 3598756 और ज़ेर्क उत्तर बहुत अच्छे हैं और मेरी मदद करते हैं, लेकिन मुझे लगता है कि आपका उत्तर सबसे अच्छा है और अन्य उपयोगकर्ताओं की सहायता के लिए स्वीकार्य उत्तर होना चाहिए। – Fadi

+0

हम्म, मेरा मतलब यह नहीं था कि यहां एक चेकमार्क चुराया जाए, केवल * अतिरिक्त * जानकारी प्रदान करने के लिए - वैसे भी धन्यवाद! –

+0

मुझे 'डिम' के बारे में पता था, फिर 'सेट' और मेरा प्रश्न पोस्ट करने से पहले इसका परीक्षण करें, लेकिन मैं आपके उत्तर जैसे अतिरिक्त जानकारी की तलाश में था, धन्यवाद। – Fadi

9

यह संशोधित कोड ठीक काम करता प्रतीत होता है। एक ही रेखा पर मंद/नए के साथ एक नुकीला लगता है। उम्मीद है कि कोई और तर्क के रूप में एक बेहतर विचार दे सकता है।

जैसा कि अन्य ने टिप्पणी की है, यदि यह सब के भीतर एक मंद है तो उप-पूरा होने के बाद इसे एकत्र किया जाएगा।

Sub Test2() 
    Dim Fs As FileSystemObject 
    Set Fs = New FileSystemObject 
    Set Fs = Nothing 
End Sub 
+0

धन्यवाद @ ज़ेर्क। – Fadi

17

यह "& इन्स्तांत की घोषणा" पैटर्न के साथ क्या करना होगा, सबसे अधिक बार एक "से परहेज किया" पैटर्न

के रूप में संबोधित यदि आप उन्हें अलग हो गए, आप के लिए यह निर्धारित करने के बाद Nothing मिलती है:

Sub Test2() 
    Dim Fs As FileSystemObject 
    Set Fs = New FileSystemObject 
    Set Fs = Nothing 
    MsgBox Fs.Drives.Count ' this line DOESN'T work 
End Sub 
+0

बहुत बहुत उपयोगकर्ता 3598756 धन्यवाद, और मुझे खेद है, लेकिन मुझे लगता है कि @ मैट्स मग एक महान उत्तर पोस्ट करता है। – Fadi

+2

मुझे ऐसा भी लगता है। – user3598756

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