Как обойти использование параметра out в блоке анонимного метода?
-
23-08-2019 - |
Вопрос
Следующий метод не компилируется.Visual Studio предупреждает: «Параметр out нельзя использовать в анонимном методе».А WithReaderLock(Proc action)
метод принимает delegate void Proc()
.
public Boolean TryGetValue(TKey key, out TValue value)
{
Boolean got = false;
WithReaderLock(delegate
{
got = dictionary.TryGetValue(key, out value);
});
return got;
}
Каков наилучший способ добиться такого поведения?(Пожалуйста, воздержитесь от советов по потокобезопасным словарям, этот вопрос предназначен для решения проблемы с выходными параметрами в целом).
Решение
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;
}
(отредактировано - небольшая ошибка)
Для информации: в .NET 3.5 вы можете использовать Action
делегируйте вместо того, чтобы создавать свои собственные, поскольку люди будут лучше это узнавать.Даже в 2.0 их много. void Foo()
делегаты: ThreadStart
, MethodInvoker
, и т. д. - но Action
проще всего следовать ;-p
Другие советы
Простой ответ — просто скопировать логику внутри метода.Но тогда мы расширяем принцип DRY и должны поддерживать поведение внутри обоих методов.
public Boolean TryGetValue(TKey key, out TValue value)
{
internalLock.AcquireReaderLock(Timeout.Infine);
try
{
return dictionary.TryGetValue(key, out value);
}
finally
{
internalLock.ReleaseReaderLock();
}
}