【发布时间】:2020-01-01 23:48:50
【问题描述】:
我将 System.Action 作为参数传递给一个方法,该方法执行一些冗长的操作并希望在调用列表中添加更多内容在 Action 已传递: p>
class Class1
{
private System.Action onDoneCallback;
void StartAsyncOperation(System.Action onDoneCallback)
{
this.onDoneCallback = onDoneCallback;
// do lengthy stuff
}
void MuchLater()
{
this.onDoneCallBack?.Invoke();
}
}
class Class2
{
public System.Action action;
void DoStuff()
{
action += () => print ("a");
new Class1().StartAsyncOperation(action);
}
{
// ... much later in another place but still before StartAsyncOperation ends
action += () => print ("b");
}
}
但是,仅调用在将 Action 作为参数传递之前使用 += 添加的内容。所以,在这个例子中,它只会打印"a",而不是"b"。
这让我觉得System.Action 在作为参数传递时是复制的(就像原始类型,例如int 会)。所以,后面做+=的时候,对SomeAsyncOperation里面的action的本地副本没有影响。
我想过用ref 传递System.Action。但是,我需要将其作为成员变量存储在Class1 中,并且我无法将成员变量设置为ref!
所以,基本上,问题是:在回调已通过且冗长的操作已在路上但尚未结束之后,如何将更多内容添加到回调的调用列表中。
编辑:
最终替换
new Class1().StartAsyncOperation(action);
与
new Class1().StartAsyncOperation(() => action?.Invoke());
【问题讨论】:
-
穴居人解决方案:不要传
action,传() => action()。 -
很好,成功了,谢谢!如果您愿意,请将其写为答案,以便我接受。
-
很高兴。这个问题让我很高兴:我从来不知道你可以像这样“连接”代表。
标签: c# reference delegates action ref