Как обойти использование параметра out в блоке анонимного метода? - PullRequest
6 голосов
/ 21 декабря 2008

Следующий метод не компилируется. Visual Studio предупреждает: «Выходной параметр нельзя использовать в анонимном методе». Метод 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;
}

Какой лучший способ получить такое поведение? (Пожалуйста, воздержитесь от предоставления рекомендаций по многопоточным словарям, этот вопрос предназначен для решения общей проблемы с параметрами).

Ответы [ 2 ]

11 голосов
/ 21 декабря 2008
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

1 голос
/ 21 декабря 2008

Простой ответ - просто скопировать логику внутри метода. Но затем мы растягиваем принцип СУХОЙ и должны поддерживать поведение внутри обоих методов.

public Boolean TryGetValue(TKey key, out TValue value)
{
    internalLock.AcquireReaderLock(Timeout.Infine);
    try
    {
        return dictionary.TryGetValue(key, out value);
    }
    finally
    {
        internalLock.ReleaseReaderLock();
    }
}
...