更新匿名方法内的ref参数

时间:2014-05-13 12:04:23

标签: c# ref anonymous-methods

是否有解决方法来更新匿名方法中的ref参数?

我知道匿名方法不允许访问外部作用域的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++;
    };
}

2 个答案:

答案 0 :(得分:5)

在您的情况下,此问题没有可行的解决办法:当Stream.MessageReceived事件触发时,count可能远远超出您DoWork的来电者的范围功能。

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

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

答案 1 :(得分:1)

如果要让委托从外部作用域更新变量,请传递一个设置值的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();
}