C# 更新匿名方法中的ref参数

C# 更新匿名方法中的ref参数,c#,ref,anonymous-methods,C#,Ref,Anonymous Methods,在匿名方法中是否有更新ref参数的变通方法 我知道anonymous方法不允许访问外部作用域的ref参数,但还有其他方法吗?我正在为MessageStream使用外部库,因此无法更改委托的参数 void DoWork(ref int count) { MessageStream Stream = new MessageStream(); Stream.MessageReceived += (o, args) => { //Error cannot u

在匿名方法中是否有更新ref参数的变通方法

我知道anonymous方法不允许访问外部作用域的ref参数,但还有其他方法吗?我正在为MessageStream使用外部库,因此无法更改委托的参数

void DoWork(ref int count)
{
    MessageStream Stream = new MessageStream();
    Stream.MessageReceived += (o, args) =>
    {
        //Error cannot use ref or out parameter inside anonymous method
        count++;
    };
}

在您的情况下,没有解决此问题的可行方法:当
Stream.MessageReceived
事件触发时,
计数在
DoWork
函数的调用者中可能远远超出范围

在这种情况下,您应该将
计数
封装在一个对象中,并在事件处理程序和调用程序中保留对该对象的引用,如下所示:

class Counter {
    public int Value {get;private set;}
    public void Increment() {Value++;}
}
void DoWork(Counter count) {
    MessageStream Stream = new MessageStream();
    Stream.MessageReceived += (o, args) => {
        count.Increment();
    };
}

如果希望委托从外部作用域更新变量,请传递设置值的lambda,而不是通过
ref
传递计数

//shared var
private static int _count = 0;

//call your method
DoWork(() => _count++);  //instead of DoWork(ref _count);


void DoWork(Action countInc)
{
    MessageStream Stream = new MessageStream();
    Stream.Activated += (o, args) => countInc();
}

答案取决于您是否能够确保
流。MessageReceived
将在
DoWork
返回之前发出。你能肯定吗?你知道不安全的环境吗?如果没有,我会用这个贴出答案solution@faby我想我知道你在想什么,如果我是对的,那是行不通的。它通常会工作,但有时会失败,并且没有办法修复它以使其始终工作。为什么在该参数上有
ref
?你确定你需要它吗?这是非常罕见的看到它被使用。如果您能向我们展示更多关于如何使用它的信息,我们可能会建议另一种正确的方法。@hvd I kmow是的,这是Unsafe ContextObly Interlocated的问题。根据使用情况,增量在这里可能是合理的。我想这是唯一可以实现它的方法。一段代码按顺序重新编译。我希望一切都会好起来。