Variabili e argomentiVariables and Arguments

In Windows Workflow Foundation (WF), le variabili rappresentano l'archiviazione dei dati mentre gli argomenti il flusso di dati dentro e fuori da un'attività.In Windows Workflow Foundation (WF), variables represent the storage of data and arguments represent the flow of data into and out of an activity. Un'attività dispone di un set di argomenti che costituiscono la firma dell'attività.An activity has a set of arguments and they make up the signature of the activity. Inoltre, un'attività può gestire un elenco di variabili a cui uno sviluppatore può aggiungere o rimuovere variabili durante la progettazione di un flusso di lavoro.Additionally, an activity can maintain a list of variables to which a developer can add or remove variables during the design of a workflow. Un argomento viene associato usando un'espressione che restituisce un valore.An argument is bound using an expression that returns a value.

VariabiliVariables

Le variabili sono percorsi di archiviazione per i datiVariables are storage locations for data. e vengono dichiarate come parte della definizione di un flusso di lavoro.Variables are declared as part of the definition of a workflow. Le variabili accettano valori in fase di esecuzione che vengono poi archiviati come parte dello stato di un'istanza del flusso di lavoro.Variables take on values at runtime and these values are stored as part of the state of a workflow instance. Una definizione di variabile specifica il tipo di variabile e, facoltativamente, il nome.A variable definition specifies the type of the variable and optionally, the name. Nel codice seguente viene mostrato come dichiarare una variabile, assegnarvi un valore usando un'attività Assign<T>, quindi come visualizzare il relativo valore nella console usando un'attività WriteLine.The following code shows how to declare a variable, assign a value to it using an Assign<T> activity, and then display its value to the console using a WriteLine activity.

// Define a variable named "str" of type string.  
Variable<string> var = new Variable<string>  
{  
    Name = "str"  
};  

// Declare the variable within a Sequence, assign  
// a value to it, and then display it.  
Activity wf = new Sequence()  
{  
    Variables = { var },  
    Activities =  
    {  
        new Assign<string>  
        {  
            To = var,  
            Value = "Hello World."  
        },  
        new WriteLine  
        {  
            Text = var  
        }  
    }  
};  

WorkflowInvoker.Invoke(wf);  

Un'espressione del valore predefinito può essere specificata facoltativamente come parte di una dichiarazione di variabile.A default value expression can optionally be specified as part of a variable declaration. Le variabili possono disporre anche di modificatori.Variables also can have modifiers. Se ad esempio una variabile è di sola lettura, può essere applicato il modificatore VariableModifiers di sola lettura.For example, if a variable is read-only then the read-only VariableModifiers modifier can be applied. Nell'esempio seguente viene creata una variabile di sola lettura con un valore predefinito assegnato.In the following example, a read-only variable is created that has a default value assigned.

// Define a read-only variable with a default value.  
Variable<string> var = new Variable<string>  
{  
    Default = "Hello World.",  
    Modifiers = VariableModifiers.ReadOnly  
};  

Ambito di variabiliVariable Scoping

La durata di una variabile in fase di esecuzione corrisponde alla durata dell'attività che la dichiara.The lifetime of a variable at runtime is equal to the lifetime of the activity that declares it. Quando un'attività viene completata, le relative variabili vengono pulite e non possono essere più usate come riferimento.When an activity completes, its variables are cleaned up and can no longer be referenced.

ArgomentiArguments

Gli autori di attività usano gli argomenti per definire la modalità in cui i dati fluiscono all'interno e all'esterno di un'attività.Activity authors use arguments to define the way data flows into and out of an activity. Ogni argomento ha una direzione specificata: In, Out o InOut.Each argument has a specified direction: In, Out, or InOut.

L'esecuzione del flusso di lavoro assicura le seguenti garanzie relativamente agli intervalli di spostamento dei dati all'interno e all'esterno di attività:The workflow runtime makes the following guarantees about the timing of data movement into and out of activities:

  1. Quando si avvia l'esecuzione di un'attività, vengono calcolati i valori di tutti i relativi argomenti di input e di input/output.When an activity starts executing, the values of all of its input and input/output arguments are calculated. Ad esempio, indipendentemente da quando viene chiamato il metodo Get, il valore restituito sarà quello calcolato dal runtime antecedente alla chiamata di Execute.For example, regardless of when Get is called, the value returned is the one calculated by the runtime prior to its invocation of Execute.

  2. Quando viene chiamato il metodo Set, il valore viene impostato immediatamente dal runtime.When Set is called, the runtime sets the value immediately.

  3. Facoltativamente gli argomenti possono avere il proprio EvaluationOrder specificato.Arguments can optionally have their EvaluationOrder specified. EvaluationOrder è un valore in base zero che specifica l'ordine in cui viene valutato l'argomento.EvaluationOrder is a zero-based value that specifies the order in which the argument is evaluated. Per impostazione predefinita, l'ordine di valutazione dell'argomento non è specificato e corrisponde al valore UnspecifiedEvaluationOrder.By default, the evaluation order of the argument is unspecified and is equal to the UnspecifiedEvaluationOrder value. Impostare la proprietà EvaluationOrder su un valore maggiore o uguale a zero per specificare un ordine di valutazione per questo argomento.Set EvaluationOrder to a value greater or equal to zero to specify an evaluation order for this argument. Windows Workflow Foundation valuta gli argomenti con un ordine di valutazione specificato crescente.Windows Workflow Foundation evaluates arguments with a specified evaluation order in ascending order. Si noti che gli argomenti con un ordine di valutazione non specificato vengono valutati prima di quelli aventi un ordine di valutazione specificato.Note that arguments with an unspecified evaluation order are evaluated before those with a specified evaluation order.

Un autore di attività può usare un meccanismo fortemente tipizzato per esporre gli argomenti.An activity author can use a strongly-typed mechanism for exposing its arguments. A tale scopo, vengono dichiarate proprietà di tipo InArgument<T>, OutArgument<T> e InOutArgument<T>.This is accomplished by declaring properties of type InArgument<T>, OutArgument<T>, and InOutArgument<T>. In questo modo un autore di attività può stabilire un contratto specifico sui dati in ingresso o in uscita da un'attività.This allows an activity author to establish a specific contract about the data going into and out of an activity.

Definizione di argomenti in un'attivitàDefining the Arguments on an Activity

Gli argomenti possono essere definiti in un'attività specificando proprietà di tipo InArgument<T>, OutArgument<T> e InOutArgument<T>.Arguments can be defined on an activity by specifying properties of type InArgument<T>, OutArgument<T>, and InOutArgument<T>. Nel codice seguente viene mostrato come definire gli argomenti per un'attività Prompt che include una stringa da visualizzare all'utente e restituisce una stringa che contiene la risposta dell'utente.The following code shows how to define the arguments for a Prompt activity that takes in a string to display to the user and returns a string that contains the user's response.

public class Prompt : Activity  
{  
    public InArgument<string> Text { get; set; }  
    public OutArgument<string> Response { get; set; }  
    // Rest of activity definition omitted.  
}  

Nota

Le attività che restituiscono un singolo valore possono derivare dagli oggetti Activity<TResult>, NativeActivity<TResult> o CodeActivity<TResult>.Activities that return a single value can derive from Activity<TResult>, NativeActivity<TResult>, or CodeActivity<TResult>. Queste attività dispongono di un oggetto OutArgument<T> ben definito denominato Result che contiene il valore restituito dell'attività.These activities have a well-defined OutArgument<T> named Result that contains the return value of the activity.

Uso di variabili e argomenti nei flussi di lavoroUsing Variables and Arguments in Workflows

Nell'esempio seguente viene mostrato come vengono usati variabili e argomenti in un flusso di lavoro.The following example shows how variables and arguments are used in a workflow. Il flusso di lavoro è una sequenza che dichiara tre variabili: var1, var2 e var3.The workflow is a sequence that declares three variables: var1, var2, and var3. La prima attività nel flusso di lavoro è un'attività Assign che assegna il valore di variabile var1 alla variabile var2.The first activity in the workflow is an Assign activity that assigns the value of variable var1 to the variable var2. Questa attività è seguita da un'attività WriteLine che stampa il valore della variabile var2.This is followed by a WriteLine activity that prints the value of the var2 variable. La successiva è un'altra attività Assign che assegna il valore di variabile var2 alla variabile var3.Next is another Assign activity that assigns the value of variable var2 to the variable var3. Infine è disponibile un'altra attività WriteLine che stampa il valore della variabile var3.Finally there is another WriteLine activity that prints the value of the var3 variable. La prima attività Assign usa gli oggetti InArgument<string> e OutArgument<string> che rappresentano in modo esplicito le associazioni per gli argomenti dell'attività.The first Assign activity uses InArgument<string> and OutArgument<string> objects that explicitly represent the bindings for the activity's arguments. L'oggetto InArgument<string> viene usato per Value in quanto il valore passa nell'attività Assign<T> attraverso il relativo argomento Value; l'oggetto OutArgument<string> viene usato per To in quanto il valore passa dall'argomento To alla variabile.InArgument<string> is used for Value because the value is flowing into the Assign<T> activity through its Value argument, and OutArgument<string> is used for To because the value is flowing out of the To argument into the variable. La seconda attività Assign esegue la stessa operazione più compatta, ma con sintassi equivalente che usa cast impliciti.The second Assign activity accomplishes the same thing with more compact but equivalent syntax that uses implicit casts. Anche le attività WriteLine usano la sintassi compatta.The WriteLine activities also use the compact syntax.

// Declare three variables; the first one is given an initial value.  
Variable<string> var1 = new Variable<string>()  
{  
    Default = "one"  
};  
Variable<string> var2 = new Variable<string>();  
Variable<string> var3 = new Variable<string>();  

// Define the workflow  
Activity wf = new Sequence  
{  
    Variables = { var1, var2, var3 },  
    Activities =   
    {  
        new Assign<string>()  
        {  
            Value = new InArgument<string>(var1),  
            To = new OutArgument<string>(var2)  
        },  
        new WriteLine() { Text = var2 },  
        new Assign<string>()  
        {  
            Value = var2,  
            To = var3  
        },  
        new WriteLine() { Text = var3 }  
    }  
};  

WorkflowInvoker.Invoke(wf);  

Uso di variabili e argomenti in attività basate su codiceUsing Variables and Arguments in Code-Based Activities

Negli esempi precedenti viene mostrato come usare argomenti e variabili in flussi di lavoro e attività dichiarative.The previous examples show how to use arguments and variables in workflows and declarative activities. Gli argomenti e le variabili vengono usati anche in attività basate su codice.Arguments and variables are also used in code-based activities. Dal punto di vista concettuale l'uso è molto simile.Conceptually the usage is very similar. Le variabili rappresentano l'archivio dati all'interno dell'attività, mentre gli argomenti rappresentano il flusso di dati all'interno o all'esterno dell'attività e vengono associati dall'autore del flusso di lavoro alle altre variabili o argomenti nel flusso di lavoro che rappresentano il punto dal quale o verso il quale fluiscono i dati.Variables represent data storage within the activity, and arguments represent the flow of data into or out of the activity, and are bound by the workflow author to other variables or arguments in the workflow that represent where the data flows to or from. Per ottenere o impostare il valore di una variabile o di un argomento in un'attività, deve essere usato un contesto di attività che rappresenta l'ambiente di esecuzione corrente dell'attività.To get or set the value of a variable or argument in an activity, an activity context must be used that represents the current execution environment of the activity. Questo viene passato nel metodo Execute dell'attività dall'esecuzione del flusso di lavoro.This is passed into the Execute method of the activity by the workflow runtime. In questo esempio viene definita un'attività Add personalizzata che dispone di due argomenti In.In this example, a custom Add activity is defined that has two In arguments. Per accedere al valore degli argomenti, vengono usati il metodo Get e il contesto passato dall'esecuzione del flusso di lavoro.To access the value of the arguments, the Get method is used and the context that was passed in by the workflow runtime is used.

public sealed class Add : CodeActivity<int>  
{  
    [RequiredArgument]  
    public InArgument<int> Operand1 { get; set; }  

    [RequiredArgument]  
    public InArgument<int> Operand2 { get; set; }  

    protected override int Execute(CodeActivityContext context)  
    {  
        return Operand1.Get(context) + Operand2.Get(context);  
    }  
}  

Per ulteriori informazioni sull'utilizzo di argomenti, variabili ed espressioni di codice, vedere creazione di flussi di lavoro, attività ed espressioni tramite codice imperativo e argomenti necessari e gruppi di Overload.For more information about working with arguments, variables, and expressions in code, see Authoring Workflows, Activities, and Expressions Using Imperative Code and Required Arguments and Overload Groups.