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

发布于 2024-07-09 22:16:55 字数 424 浏览 12 评论 0原文

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

获得这种行为的最佳方法是什么? (请不要提供有关线程安全字典的建议,这个问题旨在解决一般的输出参数问题)。

The following method does not compile. Visual Studio warns "An out parameter may not be used within an anonymous method". The WithReaderLock(Proc action) method takes a delegate void Proc().

public Boolean TryGetValue(TKey key, out TValue value)
{
    Boolean got = false;
    WithReaderLock(delegate
    {
        got = dictionary.TryGetValue(key, out value);
    });
    return got;
}

What's the best way to get this behavior? (Please refrain from providing advice on threadsafe dictionaries, this question is intended to solve the out parameter problem in general).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

风苍溪 2024-07-16 22:16:55
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

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;
}

(edited - small bug)

For info, in .NET 3.5 you might want to use the Action delegate instead of rolling your own, since people will recognise it more. Even in 2.0, there are lots of void Foo() delegates: ThreadStart, MethodInvoker, etc - but Action is the easiest to follow ;-p

以往的大感动 2024-07-16 22:16:55

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

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

The simple answer is to just copy the logic inside the method. But then we stretch the DRY principle and have to maintain behavior inside both methods.

public Boolean TryGetValue(TKey key, out TValue value)
{
    internalLock.AcquireReaderLock(Timeout.Infine);
    try
    {
        return dictionary.TryGetValue(key, out value);
    }
    finally
    {
        internalLock.ReleaseReaderLock();
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文