6

次のメソッドはコンパイルされません。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;
}

この動作を取得する最良の方法は何ですか? (スレッドセーフな辞書に関するアドバイスは控えてください。この質問は、一般的な out パラメータの問題を解決することを目的としています)。

4

2 に答える 2

11
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.5Actionでは、人々がそれをより認識できるようになるため、独自にロールする代わりにデリゲートを使用することをお勧めします。2.0 でも、たくさんのvoid Foo()デリゲートがあります: ThreadStartMethodInvokerなど - しかし、Action従うのが最も簡単です ;-p

于 2008-12-21T20:45:51.867 に答える
1

簡単な答えは、メソッド内のロジックをコピーすることです。しかし、DRY の原則を拡張し、両方のメソッド内で動作を維持する必要があります。

public Boolean TryGetValue(TKey key, out TValue value)
{
    internalLock.AcquireReaderLock(Timeout.Infine);
    try
    {
        return dictionary.TryGetValue(key, out value);
    }
    finally
    {
        internalLock.ReleaseReaderLock();
    }
}
于 2008-12-21T20:42:06.757 に答える