變數與參數是 WF 4.0 資料流向的核心。本文詳細說明 In、Out、In/Out 三種參數方向與變數的綁定行為差異。
| 方向 | 外部值傳入 | 內部修改影響外部 | 適用場景 |
|---|---|---|---|
| In | 是 | 否 | 唯讀輸入 |
| Out | 否 | 是 | 唯寫輸出 |
| In/Out | 是 | 是 | 雙向傳遞 |
public sealed class InChangeActivity : CodeActivity
{
public InArgument<string> MyIn { get; set; }
protected override void Execute(CodeActivityContext context)
{
var s1 = context.GetValue(this.MyIn);
Console.WriteLine("傳入值:{0}", s1);
context.SetValue(MyIn, Guid.NewGuid().ToString()); // 內部修改
var s2 = context.GetValue(this.MyIn);
Console.WriteLine("內部修改:{0}", s2);
}
}
工作流:變數 myVariable="初始值" → Assign 設值 → 綁定 InChangeActivity.MyIn → 列印變數值。
結果:外部變數值不變,內部修改不影響外部。

public sealed class OutChangeActivity : CodeActivity
{
public OutArgument<string> MyOut { get; set; }
protected override void Execute(CodeActivityContext context)
{
var s1 = context.GetValue(this.MyOut); // 預設 null
Console.WriteLine("傳入值:{0}", s1);
context.SetValue(MyOut, Guid.NewGuid().ToString());
var s2 = context.GetValue(this.MyOut);
Console.WriteLine("內部修改:{0}", s2);
}
}
結果:外部變數初始值不傳入內部,內部設值會更新外部變數。

public sealed class InOutChangeActivity : CodeActivity
{
public InOutArgument<string> MyInOut { get; set; }
protected override void Execute(CodeActivityContext context)
{
var s1 = context.GetValue(this.MyInOut);
Console.WriteLine("傳入值:{0}", s1);
context.SetValue(MyInOut, Guid.NewGuid().ToString());
var s2 = context.GetValue(this.MyInOut);
Console.WriteLine("內部修改:{0}", s2);
}
}
結果:外部值傳入內部,內部修改同步更新外部變數。
