【问题标题】:Confusion about the Argument< T > and Variable< T > in .NET 4.0 Workflow Foundation关于 .NET 4.0 Workflow Foundation 中的 Argument<T> 和 Variable<T> 的混淆
【发布时间】:2013-09-16 07:51:02
【问题描述】:

我在 .NET 4.0 中使用 Windows Workflow Foundation。以下是我遇到的一些语法/语义混淆。

我有 2 种等效的方式来声明分配活动以将值分配给工作流变量 (varIsFreeShipping)。

(1) 在设计器中使用 XAML。

(2) 使用代码。

但在方法 2 中,我似乎正在创建一个 new OutArgument 并为其分配值,而不是 original 变量 varIsFreeShipping。而 OutArgument 和 Variable 是完全不同的类型。

那么分配给这个新 Argument 的值怎么会最终到达原来的 Variable 呢?

这种模式在 WF 4.0 中似乎很常见。有人能解释一下吗?

谢谢!

【问题讨论】:

  • ...经过多年的子知识,幸运的是我正在研究更基础的东西。

标签: .net-4.0 workflow-foundation-4 workflow-foundation


【解决方案1】:

其实第二(2)个方法可以写成:

Then = new Assign<bool>
{
    To = varIsFreeShipping,
    Value = true
}

这一切都有效,因为 OutArgument<T> 可以通过 Variable<T> 使用 implicit operator 进行初始化。

在您的第一个 (1) 分配中,使用编辑器,这就是幕后发生的事情;变量正在隐式从 Variable 转换为 OutArgument。

WF4 主要在 Activity from/to Variable、OutArgument from/to Variable 等上使用了alot 的隐式运算符。如果你看的话,它们都代表位于某处的一段数据(已经评估或未评估)。和 C# 中的完全一样,例如:

public int SomeMethod(int a)
{
    var b = a;
    return a;
}

您可以将参数分配给变量,但您也可以将相同的变量作为 out 参数返回。这就是您对 Assign 活动所做的事情(使用变量 varIsFreeShipping 作为活动的输出参数)。

这回答了你的问题?

【讨论】:

  • 查看更多关于隐式关键字here
  • 感谢您的回复。我可以理解隐式转换器运算符。我的问题是那么分配给这个新参数的值如何最终到达原始变量?我们可以说参数和变量都引用了同一块内存吗?因为这是我能想到的唯一可能的原因。
  • 请记住,WF 正在尝试复制一种编程语言,您可以通过该语言执行代码,为其提供所有必要的元数据和逻辑。在这种特殊情况下,WF 具有Location<T> 的概念。更具体地说,我打赌 OutArgument 正在使用 VariableReference<T> 活动。 Location 和 VariableReference 都试图复制 pointers(某处的一块内存)的概念,其中所做的所有更改都会反映到指向它的变量或参数。
  • 因此,当您为 OutArgument 提供一个变量时,它会保存其位置(使用 VariableReference)。从那时起,当您实际上为 OutArgument 赋值时,您将赋值给 Location 引用而不是变量本身。
  • 我现在同意你的看法。我会继续挖掘。谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
相关资源
最近更新 更多