पर IDISposable लागू करना मुझे नहीं लगता कि इस सवाल से पहले पूछा गया है। मैं एक सीलबंद वर्ग पर IDisposable
को लागू करने के सर्वोत्तम तरीके से थोड़ा उलझन में हूं- विशेष रूप से, एक सीलबंद वर्ग जो बेस क्लास से प्राप्त नहीं होता है। (यानी, एक "शुद्ध मुहरबंद वर्ग" जो मेरा बना हुआ शब्द है।)एक सीलबंद कक्षा
शायद आप में से कुछ मेरे साथ सहमत हैं कि IDisposable
लागू करने के लिए दिशानिर्देश बहुत भ्रमित हैं। उस ने कहा, मैं जानना चाहता हूं कि जिस तरह से मैं IDisposable
को लागू करना चाहता हूं वह पर्याप्त और सुरक्षित है।
मैं कुछ पी/आमंत्रण कोड कर रहा हूं जो IntPtr
Marshal.AllocHGlobal
के माध्यम से आवंटित करता है और स्वाभाविक रूप से, मैं अपने द्वारा बनाई गई अप्रबंधित स्मृति को साफ़ रूप से निपटाना चाहता हूं। तो मैं इस
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public sealed class MemBlock : IDisposable
{
IntPtr ptr;
int length;
MemBlock(int size)
{
ptr = Marshal.AllocHGlobal(size);
length = size;
}
public void Dispose()
{
if (ptr != IntPtr.Zero)
{
Marshal.FreeHGlobal(ptr);
ptr = IntPtr.Zero;
GC.SuppressFinalize(this);
}
}
~MemBlock()
{
Dispose();
}
}
की तरह कुछ के बारे में सोच रहा हूँ मैं यह सोचते हैं कि क्योंकि MemBlock
पूरी तरह से सील कर दिया है और कभी नहीं किया गया है अन्य वर्ग से निकला है कि एक virtual protected Dispose(bool disposing)
को लागू करने की जरूरत नहीं है कर रहा हूँ।
इसके अलावा, finalizer अत्यंत आवश्यक होता है? सभी विचारों का स्वागत है।
लेकिन निश्चित रूप से इस मामले में कि एक बेस क्लास से प्राप्त एक मुहरबंद वर्ग तो एक आभासी निपटान आवश्यक होगा - सही? – zebrabox
भी। फाइनलर का मतलब है फाइनेंजर कतार में जोड़ना और प्रभावी रूप से डबल कचरा इकट्ठा करने का ओवरहेड होना। अन-प्रबंधित संसाधनों का उपयोग करने के लिए भुगतान करने के लिए भारी जुर्माना लगता है। क्या प्रदर्शन हिट से बचने का कोई तरीका नहीं है? – zebrabox
उस स्थिति में, आप विधि को ओवरराइड करेंगे। आप 'सीलबंद' वर्ग में 'वर्चुअल' के रूप में किसी भी तरीके की घोषणा नहीं कर सकते हैं। यह एक कंपाइलर ** त्रुटि ** है। –