referencia - uso del parametro out sin asignar c#
¿Cómo eludir el uso de un parámetro out en un bloque de método anónimo? (2)
El siguiente método no compila. Visual Studio advierte "Un parámetro out no se puede usar dentro de un método anónimo". El WithReaderLock(Proc action)
toma un delegate void Proc()
.
public Boolean TryGetValue(TKey key, out TValue value)
{
Boolean got = false;
WithReaderLock(delegate
{
got = dictionary.TryGetValue(key, out value);
});
return got;
}
¿Cuál es la mejor manera de obtener este comportamiento? (Por favor absténgase de proporcionar consejos sobre diccionarios de escritura en hilo, esta pregunta tiene como objetivo resolver el problema de los parámetros de salida en general).
La respuesta simple es copiar la lógica dentro del método. Pero luego estiramos el principio DRY y tenemos que mantener el comportamiento dentro de ambos métodos.
public Boolean TryGetValue(TKey key, out TValue value)
{
internalLock.AcquireReaderLock(Timeout.Infine);
try
{
return dictionary.TryGetValue(key, out value);
}
finally
{
internalLock.ReleaseReaderLock();
}
}
public bool TryGetValue(TKey key, out TValue value)
{
bool got = false;
TValue tmp = default(TValue); // for definite assignment
WithReaderLock(delegate
{
got = dictionary.TryGetValue(key, out tmp);
});
value = tmp;
return got;
}
(editado - pequeño error)
Para obtener información, en .NET 3.5 es posible que desee utilizar el delegado de Action
en lugar de rodar el suyo, ya que las personas lo reconocerán más. Incluso en 2.0, hay muchos delegados void Foo()
ThreadStart
: ThreadStart
, MethodInvoker
, etc., pero Action
es el más fácil de seguir ;-p