Как обойти использование параметра out в блоке анонимного метода?

StackOverflow https://stackoverflow.com/questions/384918

Вопрос

Следующий метод не компилируется.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();
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top