Metodo di chiamata in un oggetto usa e getta all'inizio di un'istruzione "using"

2

Quando usiamo l'istruzione lock , essenzialmente fa un Monitor.Enter all'inizio del blocco e un Monitor.Exit alla fine del blocco. Questo processo viene gestito automaticamente dal runtime.

Un comportamento simile si trova alla fine del blocco using , chiama il metodo Dispose di IDisposable .

La mia domanda è che, se esiste un modo per chiamare automaticamente un metodo nell'oggetto usa e getta all'inizio del blocco using .

Il motivo per cui voglio farlo è che ho implementato un ObservableCollection<T> personalizzato con 2 metodi aggiuntivi: BeginUpdate e EndUpdate . Sono utilizzati per segnalare un processo di aggiornamento in batch. La raccolta non aumenterà l'evento modificato della raccolta finché non viene chiamato EndUpdate .

Anche se è perfettamente corretto chiamare i 2 metodi manualmente all'inizio e alla fine del processo batch, ma sarebbe davvero bello se potessi fare qualcosa del genere:

using(myCollection)
  foreach(var item in anotherBigList)
    myCollection.Add(item);
    
posta Leon Zhou 22.05.2015 - 09:12
fonte

1 risposta

8

Per prima cosa non mi piace usare IDisposable sulla collezione attuale. Confonde il vero significato di Monouso.

Lo farei in questo modo:

public class CollectionUpdateContext<T>: IDisposable // can also be inner class of custom collection
{
    public CollectionUpdateContext(ObservableCollection<T> inner)
    {
        inner.BeginUpdate();
    }

    public Dispose()
    {
        inner.EndUpdate();
    }
}

public class CustomCollection<T> : ObservableCollection<T>
{
    // whatever code of custom collection

    CollectionUpdateContext<T> Updating() // this can be also as extension method
    {
        return new CollectionUpdateContext<T>(this);
    }
}

using(myCollection.Updating())
  foreach(var item in anotherBigList)
    myCollection.Add(item);

In questo modo, è chiaro che il blocco usando è correlato alla meccanica di aggiornamento della tua collezione. Inoltre, poiché IDisposable non è nella raccolta personalizzata, costringe il programmatore a chiamare il metodo Updating . Infine, non confonde la raccolta personalizzata aggiungendo IDisposable , che ha un significato diverso.

    
risposta data 22.05.2015 - 09:52
fonte

Leggi altre domande sui tag