2010-03-02 12 views
9

Molte classi GDI + implementano IDisposable, ma non sono sicuro quando dovrei chiamare Dispose. È chiaro per istanze che creo con new o metodi statici come Graphics.CreateGraphics. Ma per quanto riguarda gli oggetti che vengono restituiti dai getter di proprietà? Mi capita spesso di scrivere il codice in questo modo:Quando si smaltiscono le risorse GDI +?

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

faccio a smaltire oldRgn dopo? Il mio profilo di memoria mi dice che ci sono istanze non disposte se non lo faccio. E guardando l'attuazione riflettore almeno conferma che il getter apparentemente crea una nuova istanza ogni volta che viene invocato:

// 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; 
} 

non ho trovato nulla in MSDN, ei campioni nella documentazione non sembrano mai per smaltire qualsiasi cosa.

+0

Provare a spostare "g.Clip = oldRgn" nel blocco using. –

risposta

2

In generale, se la classe è IDisposable, è necessario chiamare il metodo .Dispose quando l'oggetto non è necessario.

Inoltre, la libreria MSDN dice:

modifica l'oggetto restituito Regione dalla struttura della clip non influisce successiva disegno con la grafica oggetto. Per modificare l'area della clip, sostituire il valore della proprietà Clip con un nuovo oggetto Regione .

Il che significa che DEVE essere smaltito oldRgn.

+0

Ho letto il paragrafo MSDN quattro volte, ma continuo a non vedere la connessione. Lo stesso si potrebbe dire per 'Brushes.Red'; Il getter restituisce un oggetto usa e getta; la modifica dell'oggetto non influisce sul disegno successivo. Ma questo significa che devo eliminare 'Brushes.Red' ogni volta che invoco il getter? – Niki

+2

Poiché 'Brushes.Red' è una proprietà statica, è probabile che non sia necessario disporre dell'oggetto. Altrimenti, perché la proprietà sarebbe statica? È fatto per salvare un oggetto a cui si accede frequentemente per l'accesso globale e il riutilizzo delle risorse. Questa è la differenza tra questa e la tua domanda iniziale. Tuttavia, ha sempre senso utilizzare Reflector in caso di incertezza. – Kerido

+0

Quindi, in sostanza, non c'è una regola: devi sempre guardare la fonte per scoprire se è necessario disporre del risultato di un getter di proprietà. E scommetti sul GC in casi non chiari. Lo temevo, ma grazie comunque per la tua risposta. – Niki

Problemi correlati