2010-03-02 8 views
9

कई जीडीआई + कक्षाएं IDISposable लागू करती हैं, लेकिन मुझे यकीन नहीं है कि मुझे निपटान कब करना चाहिए। उदाहरण के लिए यह स्पष्ट है कि मैं new या Graphics.CreateGraphics जैसी स्थिर विधियों के साथ बना हूं। लेकिन संपत्तियों के बारे में क्या है जो संपत्ति गेटर्स द्वारा लौटाए जाते हैं? मैं अक्सर इस तरह कोड लिखने:जब आप जीडीआई + संसाधनों का निपटान करते हैं?

var oldRgn = g.Clip; 
using (var rectRegion = new Region(rectangle)) 
{ 
    g.Clip = rectRegion; 
    // draw something 
} 
g.Clip = oldRgn; 

एम आई oldRgn उसके बाद निपटान के लिए माना जाता? मेरा मेमोरी प्रोफाइलर मुझे बताता है कि अगर मैं नहीं करता तो अनजान उदाहरण हैं। और परावर्तक में कार्यान्वयन को देखकर तो कम से कम इस बात की पुष्टि है कि गेटर जाहिरा तौर पर हर बार यह लागू है एक नया उदाहरण बनाता है:

// Graphics.Clip code from Reflector: 
public Region get_Clip() 
{ 
    Region wrapper = new Region(); 
    int status = SafeNativeMethods.Gdip.GdipGetClip(new HandleRef(this, this.NativeGraphics), new HandleRef(wrapper, wrapper.nativeRegion)); 
    if (status != 0) 
    { 
     throw SafeNativeMethods.Gdip.StatusException(status); 
    } 
    return wrapper; 
} 

मैं MSDN में इस बारे में कुछ भी नहीं मिला, और दस्तावेज में नमूने कभी नहीं लग रहे हैं कुछ भी निपटाने के लिए।

+0

उपयोग ब्लॉक में "g.clip = oldRgn" को स्थानांतरित करने का प्रयास करें। –

उत्तर

2

सामान्यतः, यदि कक्षा IDisposable है, तो आपको ऑब्जेक्ट की आवश्यकता होने पर .Dispose विधि को कॉल करना होगा।

इसके अलावा, MSDN लाइब्रेरी का कहना है:

को संशोधित क्षेत्र वस्तु क्लिप संपत्ति द्वारा लौटे ग्राफिक्स वस्तु के साथ बाद ड्राइंग प्रभावित नहीं करता। क्लिप क्षेत्र को बदलने के लिए, क्लिप संपत्ति मान को नई क्षेत्र वस्तु के साथ प्रतिस्थापित करें।

जिसका अर्थ है, आपको oldRgn का निपटान करना होगा।

+0

मैंने अब एमएसडीएन अनुच्छेद चार बार पढ़ा है, लेकिन मुझे अभी भी कनेक्शन नहीं दिख रहा है। 'ब्रश। रेड 'के बारे में भी यही कहा जा सकता है; गेटटर एक डिस्पोजेबल वस्तु देता है; ऑब्जेक्ट को संशोधित करने से बाद के चित्र को प्रभावित नहीं होता है। लेकिन क्या इसका मतलब है कि जब भी मैं गेटटर का आह्वान करता हूं तो मुझे 'ब्रश.रेड' का निपटान करना पड़ता है? – Niki

+2

क्योंकि 'ब्रश.रेड' एक स्थिर संपत्ति है, संभावना है कि आपको ऑब्जेक्ट को निपटाने की आवश्यकता नहीं होगी। अन्यथा, संपत्ति स्थैतिक क्यों होगी? यह वैश्विक पहुंच और संसाधन पुन: उपयोग के लिए अक्सर उपयोग की गई वस्तु को सहेजने के लिए किया जाता है। यह और आपके प्रारंभिक प्रश्न के बीच यह अंतर है। हालांकि, किसी भी अनिश्चितता के मामले में प्रतिबिंब का उपयोग करना हमेशा समझ में आता है। – Kerido

+0

तो अनिवार्य रूप से, कोई नियम नहीं है - आपको यह पता लगाने के लिए हमेशा स्रोत को देखना होगा कि क्या आपको संपत्ति गेटटर के परिणाम का निपटान करना है या नहीं। और अस्पष्ट मामलों में जीसी पर शर्त लगाओ। मुझे डर था, लेकिन वैसे भी आपके जवाब के लिए धन्यवाद। – Niki

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