【问题标题】:How to circumvent using an out parameter in an anonymous method block?如何规避在匿名方法块中使用 out 参数?
【发布时间】:2008-12-21 20:40:56
【问题描述】:

以下方法无法编译。 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参数问题)。

【问题讨论】:

    标签: c# anonymous-methods out-parameters


    【解决方案1】:
    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

    【讨论】:

    • 抱歉原版出现问题;固定
    • 我在 .NET 2.0 中看到了 delegate void Action<T>(T obj),但它对 对象进行了操作。我需要围绕一个动作进行操作。因此,delegate void Proc()。我可以将其命名为 delegate void Action() 以保持一致。
    【解决方案2】:

    简单的答案是复制方法内部的逻辑。但是随后我们扩展了 DRY 原则,并且必须在这两种方法中保持行为。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 2011-05-13
      • 2016-01-20
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多