2009-09-14 13 views
5

क्या कोई चर ".NET भाषा में स्कोप खो देता है जैसे ही स्वचालित रूप से" अंतिम रूप से "अंतिम रूप देने/विनाशक कोड चलाने का कोई तरीका है? ऐसा लगता है कि चूंकि कचरा कलेक्टर अनिश्चित समय पर चलता है, इसलिए जैसे ही परिवर्तक गुंजाइश खो देता है, विनाशक कोड नहीं चलाया जाता है। मुझे एहसास है कि मैं आईडीस्पोजेबल से उत्तराधिकारी हो सकता हूं और स्पष्ट रूप से कॉल कर सकता हूं, मेरी ऑब्जेक्ट पर निपटान करें, लेकिन मैं उम्मीद कर रहा था कि गैर-ऑफ-सॉल्यूशन हो सकता है, जिस तरह से गैर- नेट सी ++ ऑब्जेक्ट विनाश को संभालता है।जब कोई ऑब्जेक्ट स्कोप से बाहर हो जाता है तो कोड चलाया जा सकता है .Net?

वांछित व्यवहार (सी #):

public class A { 
    ~A { [some code I would like to run] } 
} 

public void SomeFreeFunction() { 
    SomeFreeSubFunction(); 
    // At this point, I would like my destructor code to have already run. 
} 

public void SomeFreeSubFunction() { 
    A myA = new A(); 
} 

कम वांछनीय:

public class A : IDisposable { 
    [ destructor code, Dispose method, etc. etc.] 
} 

public void SomeFreeFunction() { 
    SomeFreeSubFunction(); 
} 

public void SomeFreeSubFunction() { 
    A myA = new A(); 
    try { 
     ... 
    } 
    finally { 
     myA.Dispose(); 
    } 
} 

उत्तर

9

निर्माण का उपयोग कर के सबसे करीब आता है कि आप क्या चाहते:

using (MyClass o = new MyClass()) 
{ 
... 
} 

निपटान() है

using(FileStream stream = new FileStream("string", FileMode.Open)) 
{ 
    // Some code 
} 

यह करने के लिए संकलक ने ले ली है स्वचालित रूप से बुलाया जाता है, भले ही कोई अपवाद हुआ हो। लेकिन आपकी कक्षा को IDISposable लागू करना है।

लेकिन इसका मतलब यह नहीं है कि वस्तु स्मृति से हटा दी गई है। उस पर आपका कोई नियंत्रण नहीं है।

+0

(+1) ध्यान दें कि "उपयोग" निपटान विधि का उपयोग करने के लिए शॉर्टेंड है और विशेष रूप से विनाशक का उपयोग करने और स्मृति से वस्तु को हटाने के लिए नहीं है। –

4

कीवर्ड एक वस्तु IDisposable को लागू करने के साथ प्रयोग कर सिर्फ इतना है कि नहीं करता है।

उदाहरण के लिए:

FileStream stream = new FileStream("string", FileMode.Open); 
try 
{ 
    // Some code 
} 
finally 
{ 
    stream.Dispose(); 
} 
3

दुर्भाग्य से, नहीं।

आपका सर्वोत्तम विकल्प IDisposable को IDisposable pattern के साथ लागू करना है।

+0

यह भी देखें http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=88e62cdf-5919-4ac7-bc33-20c06ae539ae – TrueWill

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

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