Tengo una simple pregunta sobre los delegados de .net. Decir que tengo algo como esto:C# delegados, tiempo de resolución de referencia
public void Invoke(Action<T> action)
{
Invoke(() => action(this.Value));
}
public void Invoke(Action action)
{
m_TaskQueue.Enqueue(action);
}
La primera función encierra una referencia a this.Value
. Durante el tiempo de ejecución, cuando se llama al primer método con parámetro genérico, proporcionará this.Value
de alguna manera al segundo, pero ¿cómo? Éstos vinieron a la mente:
- llamada por valor (struct) - el valor actual de
this.Value
se pasa, por lo que si elm_TaskQueue
lo ejecuta 5 minutos más tarde, el valor no será en su estado reciente, será lo que sea cuando se hace referencia por primera vez. - la llamada por referencia (tipo de referencia) - entonces el más reciente estado de
Value
se hará referencia durante la ejecución de la acción, pero si cambiothis.Value
a otra referencia antes de la ejecución de la acción, todavía estará apuntando a la edad de referencia - Llamar por nombre (ambos) - donde
this.Value
se evaluará cuando se llame a la acción. Creo que la implementación real tendría una referencia althis
y luego se evaluaráValue
durante la ejecución real del delegado, ya que no hay una llamada por nombre.
Supongo que sería un estilo Call of name pero no pudo encontrar ninguna documentación, por lo que me pregunto si se trata de un comportamiento bien definido. Esta clase es algo así como un Actor en Scala o Erlang, así que necesito que sea seguro para subprocesos. No deseo que la función Invoke
desreferencia Value
inmediatamente, que se hará en un hilo seguro para el objeto this
por m_TaskQueue
.
Muchas gracias, es claro como el cristal ahora :) –