在我的特定用例中,我有几个地方可以互换地使用Interlocked.Increment
和Interlocked.Decrement
,所以我想将逻辑合并到一个方法中,并传递正确的方法来调用,作为论点:
if (Interlocked.Increment(ref x) == something)
{
DoThis();
}
else
{
DoThat();
}
我做的另一个地方:
if (Interlocked.Decrement(ref x) == something)
{
DoThis();
}
else
{
DoThat();
}
这个想法是巩固成:
void Foo(Action<ref int> interlockedOp)
{
if (interlockedOp(ref x) == something)
{
DoThis();
}
else
{
DoThat();
}
}
但是Action<ref int>
部分没有编译。
还有其他方法可以达到这个目的吗?
答案 0 :(得分:2)
即使编译Action<ref int>
,它也行不通。 Increment
/ Decrement
返回一个值。你甚至使用了返回值。 Func<ref int, int>
,如果已编译,则会执行此操作,但您仍然无法在该上下文中使用ref
。
使用自定义委托类型,很容易。
delegate int InterlockedOp(ref int location);