如何避免在匿名方法块中使用out参数?

时间:2008-12-21 20:40:57

标签: c# anonymous-methods out-parameters

以下方法无法编译。 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;
}

获得此行为的最佳方式是什么? (请不要提供有关线程安全词典的建议,这个问题的目的是解决一般的参数问题。)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

简单的答案就是复制方法中的逻辑。但后来我们延长了DRY原则并且必须在两种方法中保持行为。

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