用新的类实例解释lambda表达式

时间:2017-06-08 00:11:20

标签: c# lambda interface delegates botframework

Echo bot with state example Post([FromBody] Activity activity)方法调用Func<IDialog<object>>中键入delegate:

await Conversation.SendAsync(activity, () => new EchoDialog());

其中EchoDialogprotected int count = 1;成员,该成员计算对Task StartAsync()的每次调用。只有new EchoDialog()只执行一次才能纠正错误,因此lambda每次调用await Conversation.SendAsync()时都会处理同一个对象。所以lambda只创建了一次并且对于每个Post([FromBody] Activity activity)调用保持不变,对吧? lambda如何在这里工作?提前谢谢!

在Troelsen书中找不到正确的答案,:) Stackoverflow,MS docs等。

1 个答案:

答案 0 :(得分:2)

每次执行委托时都会创建一个新的install,这将是EchoDialog的实现细节。基本上,您将方法定义传递给SendAsync,它会调用该方法一次或多次。每次调用委托时,SendAsync右侧的代码都将被执行。

如果您想确保为所有通话返回相同的 =>实例,您可以这样做:

EchoDialog

这将每次返回var myDialog = new EchoDialog(); await Conversation.SendAsync(activity, () => myDialog); 实例,而不是每次都创建一个新实例。

更新

根据the documentation of Conversation.SendAsyc,委托(称为参数myDialog)仅针对新会话进行调用,MakeRoot对象被序列化并存储以供将来调用那次谈话。

  

仅为新会话调用MakeRoot工厂方法,因为现有会话具有IMessageActivity数据中序列化的对话框堆栈和状态。