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.5 中,您可能希望使用Action委托而不是滚动您自己的委托,因为人们会更多地识别它。即使在 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 回答