Ho una semplice domanda sui delegati .net. Dire che ho qualcosa di simile:delegati C#, tempo di risoluzione riferimento
public void Invoke(Action<T> action)
{
Invoke(() => action(this.Value));
}
public void Invoke(Action action)
{
m_TaskQueue.Enqueue(action);
}
La prima funzione racchiude un riferimento a this.Value
. Durante il runtime, quando viene chiamato il primo metodo con parametro generico, fornirà in qualche modo this.Value
al secondo, ma come? Questi sono venuto in mente:
- chiamata per valore (struct) - il valore corrente di
this.Value
viene passato, per cui se ilm_TaskQueue
esegue esso 5 minuti più tardi, il valore non sarà nel suo stato di recente, si sarà qualunque cosa fosse al momento del primo riferimento. - Chiama con riferimento (tipo di riferimento) - quindi il più recente stato di
Value
farà riferimento durante l'esecuzione di azione, ma se cambiothis.Value
ad un altro riferimento prima dell'esecuzione di azione, sarà ancora rivolta verso la vecchia di riferimento - Chiamata per nome (entrambi) - dove
this.Value
verrà valutato quando viene richiamata l'azione. Credo che l'implementazione effettiva sarebbe in possesso di un riferimento athis
quindi valutareValue
su quello durante l'esecuzione effettiva del delegato poiché non vi è alcuna chiamata per nome.
Suppongo che sarebbe Call of name style ma non ho trovato alcuna documentazione, chiedendomi se si tratta di un comportamento ben definito. Questa classe è qualcosa come un attore in Scala o Erlang, quindi ho bisogno che sia sicuro. Non desidero immediatamente la funzione per dereferenziare Value
, che verrà eseguita in un thread sicuro per this
oggetto da m_TaskQueue
.
Grazie mille, è cristallino ora :) –