VariablesVariables

Las variables representan ubicaciones de almacenamiento.Variables represent storage locations. Cada variable tiene un tipo que determina qué valores se pueden almacenar en la variable.Every variable has a type that determines what values can be stored in the variable. C# es un lenguaje con seguridad de tipos y el compilador de C# garantiza que los valores almacenados en variables siempre son del tipo adecuado.C# is a type-safe language, and the C# compiler guarantees that values stored in variables are always of the appropriate type. El valor de una variable se puede cambiar mediante una asignación o mediante el uso de la ++ y -- operadores.The value of a variable can be changed through assignment or through use of the ++ and -- operators.

Debe ser una variable asignado definitivamente (asignación definitiva) antes de que se puede obtener su valor.A variable must be definitely assigned (Definite assignment) before its value can be obtained.

Como se describe en las secciones siguientes, las variables son asignado inicialmente o inicialmente sin asignar.As described in the following sections, variables are either initially assigned or initially unassigned. Una variable asignada inicialmente tiene un valor inicial bien definido y siempre se considera asignado definitivamente.An initially assigned variable has a well-defined initial value and is always considered definitely assigned. Una variable no asignada inicialmente no tiene ningún valor inicial.An initially unassigned variable has no initial value. Para que una variable no asignada inicialmente se considera asignado definitivamente en una determinada ubicación, se debe producir una asignación a la variable en cada ruta de acceso de ejecución posibles que dan lugar a esa ubicación.For an initially unassigned variable to be considered definitely assigned at a certain location, an assignment to the variable must occur in every possible execution path leading to that location.

Categorías de variablesVariable categories

C# define siete categorías de variables: variables estáticas, variables de instancia, elementos de matriz, parámetros de valor, los parámetros de referencia, parámetros de salida y variables locales.C# defines seven categories of variables: static variables, instance variables, array elements, value parameters, reference parameters, output parameters, and local variables. Las secciones siguientes describen cada una de estas categorías.The sections that follow describe each of these categories.

En el ejemploIn the example

class A
{
    public static int x;
    int y;

    void F(int[] v, int a, ref int b, out int c) {
        int i = 1;
        c = a + b++;
    }
}

x es una variable estática, y es una variable de instancia, v[0] es un elemento de matriz, a es un parámetro de valor, b es un parámetro de referencia, c es un parámetro de salida, y i es una variable local.x is a static variable, y is an instance variable, v[0] is an array element, a is a value parameter, b is a reference parameter, c is an output parameter, and i is a local variable.

Variables estáticasStatic variables

Un campo declarado con el static modificador se denomina un variable estática.A field declared with the static modifier is called a static variable. Una variable estática entra en existencia antes de la ejecución del constructor estático (constructores estáticos) para su tipo contenedor y deja de existir cuando deja de existir el dominio de aplicación asociado.A static variable comes into existence before execution of the static constructor (Static constructors) for its containing type, and ceases to exist when the associated application domain ceases to exist.

El valor inicial de una variable estática es el valor predeterminado (los valores predeterminados) del tipo de variable.The initial value of a static variable is the default value (Default values) of the variable's type.

Para fines de comprobación de asignación definitiva, una variable estática se considera asignado inicialmente.For purposes of definite assignment checking, a static variable is considered initially assigned.

Variables de instanciaInstance variables

Un campo declarado sin el static modificador se denomina un variable de instancia.A field declared without the static modifier is called an instance variable.

Variables de instancia en clasesInstance variables in classes

Una variable de instancia de una clase entra en existencia cuando se crea una nueva instancia de esa clase y deja de existir cuando no hay ninguna referencia a esa instancia y se ha ejecutado el destructor de la instancia (si existe).An instance variable of a class comes into existence when a new instance of that class is created, and ceases to exist when there are no references to that instance and the instance's destructor (if any) has executed.

El valor inicial de una variable de instancia de una clase es el valor predeterminado (los valores predeterminados) del tipo de variable.The initial value of an instance variable of a class is the default value (Default values) of the variable's type.

Con el fin de comprobación de asignación definitiva, una variable de instancia de una clase se considera asignado inicialmente.For the purpose of definite assignment checking, an instance variable of a class is considered initially assigned.

Variables de instancia en structsInstance variables in structs

Una variable de instancia de una estructura tiene exactamente la misma duración que la variable de estructura a la que pertenece.An instance variable of a struct has exactly the same lifetime as the struct variable to which it belongs. En otras palabras, cuando una variable de tipo struct entra en la existencia o deja de existir, lo hacer demasiado de las variables de instancia de la estructura.In other words, when a variable of a struct type comes into existence or ceases to exist, so too do the instance variables of the struct.

El estado de asignación inicial de una variable de instancia de una estructura es el mismo que el de la variable de estructura.The initial assignment state of an instance variable of a struct is the same as that of the containing struct variable. En otras palabras, cuando una variable de estructura se considera asignada inicialmente, lo son demasiado sus variables de instancia, y cuando una variable de estructura se considera inicialmente sin asignar, sus variables de instancia del mismo modo están asignados.In other words, when a struct variable is considered initially assigned, so too are its instance variables, and when a struct variable is considered initially unassigned, its instance variables are likewise unassigned.

Elementos de matrizArray elements

Los elementos de una matriz nazcan cuando se crea una instancia de matriz y dejan de existir cuando no hay referencias a esa instancia de matriz.The elements of an array come into existence when an array instance is created, and cease to exist when there are no references to that array instance.

El valor inicial de cada uno de los elementos de una matriz es el valor predeterminado (los valores predeterminados) del tipo de los elementos de matriz.The initial value of each of the elements of an array is the default value (Default values) of the type of the array elements.

Con el fin de comprobación de asignación definitiva, un elemento de matriz se considera asignado inicialmente.For the purpose of definite assignment checking, an array element is considered initially assigned.

Parámetros de valorValue parameters

Un parámetro declarado sin un ref o out modificador es un parámetro value.A parameter declared without a ref or out modifier is a value parameter.

Un parámetro de valor entra en existencia al invocar el miembro de función (método, constructor de instancia, operador o descriptor de acceso) o una función anónima al que pertenece el parámetro y se inicializa con el valor del argumento especificado en la invocación.A value parameter comes into existence upon invocation of the function member (method, instance constructor, accessor, or operator) or anonymous function to which the parameter belongs, and is initialized with the value of the argument given in the invocation. Un parámetro de valor normalmente deja de existir cuando se devuelve el miembro de función o función anónima.A value parameter normally ceases to exist upon return of the function member or anonymous function. Sin embargo, si el valor del parámetro se captura mediante una función anónima (expresiones de función anónima), su duración se extiende al menos hasta que el delegado o árbol de expresión que se crea a partir de esa función anónima es apto para colección de elementos no utilizados.However, if the value parameter is captured by an anonymous function (Anonymous function expressions), its life time extends at least until the delegate or expression tree created from that anonymous function is eligible for garbage collection.

Con el fin de comprobación de asignación definitiva, un parámetro de valor se considera asignado inicialmente.For the purpose of definite assignment checking, a value parameter is considered initially assigned.

Parámetros de referenciaReference parameters

Un parámetro declarado con un ref modificador es un hacer referencia al parámetro.A parameter declared with a ref modifier is a reference parameter.

Un parámetro de referencia no crea una nueva ubicación de almacenamiento.A reference parameter does not create a new storage location. En su lugar, un parámetro de referencia representa la misma ubicación de almacenamiento que la variable especificada como argumento en el miembro de función o la invocación de función anónima.Instead, a reference parameter represents the same storage location as the variable given as the argument in the function member or anonymous function invocation. Por lo tanto, el valor de un parámetro de referencia es siempre el mismo que la variable subyacente.Thus, the value of a reference parameter is always the same as the underlying variable.

Se aplican las siguientes reglas de asignación definitiva a los parámetros de referencia.The following definite assignment rules apply to reference parameters. Tenga en cuenta las distintas reglas de los parámetros de salida que se describe en parámetros de salida.Note the different rules for output parameters described in Output parameters.

  • Una variable debe asignarlo definitivamente (asignación definitiva) antes de que se puede pasar como un parámetro de referencia en una invocación de función miembro o un delegado.A variable must be definitely assigned (Definite assignment) before it can be passed as a reference parameter in a function member or delegate invocation.
  • Dentro de un miembro de función o función anónima, un parámetro de referencia se considera asignado inicialmente.Within a function member or anonymous function, a reference parameter is considered initially assigned.

Dentro de un método de instancia o un descriptor de acceso de instancia de un tipo de estructura, el this palabra clave se comporta exactamente como un parámetro de referencia de tipo struct (este acceso).Within an instance method or instance accessor of a struct type, the this keyword behaves exactly as a reference parameter of the struct type (This access).

Parámetros de salidaOutput parameters

Un parámetro declarado con un out modificador es un parámetro de salida.A parameter declared with an out modifier is an output parameter.

Un parámetro de salida no crea una nueva ubicación de almacenamiento.An output parameter does not create a new storage location. En su lugar, un parámetro de salida representa la misma ubicación de almacenamiento que la variable especificada como argumento en la invocación de función miembro o un delegado.Instead, an output parameter represents the same storage location as the variable given as the argument in the function member or delegate invocation. Por lo tanto, el valor de un parámetro de salida es siempre el mismo que la variable subyacente.Thus, the value of an output parameter is always the same as the underlying variable.

Se aplican las siguientes reglas de asignación definitiva a los parámetros de salida.The following definite assignment rules apply to output parameters. Tenga en cuenta las distintas reglas de los parámetros de referencia se describe en hacen referencia a parámetros.Note the different rules for reference parameters described in Reference parameters.

  • Una variable no debe estar asignada definitivamente antes de que se puede pasar como un parámetro de salida en un miembro de función o la invocación de delegado.A variable need not be definitely assigned before it can be passed as an output parameter in a function member or delegate invocation.
  • Tras la finalización normal de una invocación de miembro o un delegado de función, cada variable que se pasó como un parámetro de salida se considera asignado en esa ruta de acceso de ejecución.Following the normal completion of a function member or delegate invocation, each variable that was passed as an output parameter is considered assigned in that execution path.
  • Dentro de un miembro de función o función anónima, un parámetro de salida se considera inicialmente sin asignar.Within a function member or anonymous function, an output parameter is considered initially unassigned.
  • Cada parámetro de salida de un miembro de función o función anónima debe asignarlo definitivamente (asignación definitiva) antes de la función miembro o función anónima vuelve con normalidad.Every output parameter of a function member or anonymous function must be definitely assigned (Definite assignment) before the function member or anonymous function returns normally.

Dentro de un constructor de instancia de un tipo de estructura, el this palabra clave se comporta exactamente como un parámetro de salida de tipo struct (este acceso).Within an instance constructor of a struct type, the this keyword behaves exactly as an output parameter of the struct type (This access).

Variables localesLocal variables

Un variable local se declara mediante un local_variable_declaration, lo que puede producirse en un bloque, un for_statement, un switch_statement o un using_statement; o por un foreach_statement o un specific_catch_clause para un try_statement.A local variable is declared by a local_variable_declaration, which may occur in a block, a for_statement, a switch_statement or a using_statement; or by a foreach_statement or a specific_catch_clause for a try_statement.

La duración de una variable local es la parte de la ejecución del programa durante el cual almacenamiento garantiza que se va a reservar para él.The lifetime of a local variable is the portion of program execution during which storage is guaranteed to be reserved for it. Esta duración se extiende al menos desde la entrada en el bloque, for_statement, switch_statement, using_statement, foreach_statement, o specific_catch_clause con el que está asociado, hasta la ejecución de ese bloque, for_statement, switch_statement, using_statement, foreach_statement, o specific_catch_clause extremos de ninguna manera.This lifetime extends at least from entry into the block, for_statement, switch_statement, using_statement, foreach_statement, or specific_catch_clause with which it is associated, until execution of that block, for_statement, switch_statement, using_statement, foreach_statement, or specific_catch_clause ends in any way. (Escriba un texto delimitado bloque o llamar a un método se suspende, pero no finaliza, la ejecución del elemento actual bloque, for_statement, switch_statement , using_statement, foreach_statement, o specific_catch_clause.) Si se captura la variable local mediante una función anónima (capturan las variables externas), su duración se extiende al menos hasta que el árbol de expresión o delegado creado a partir de la función anónima, junto con cualquier otro objeto que vienen a referencia a la variable capturada, son aptas para la recolección.(Entering an enclosed block or calling a method suspends, but does not end, execution of the current block, for_statement, switch_statement, using_statement, foreach_statement, or specific_catch_clause.) If the local variable is captured by an anonymous function (Captured outer variables), its lifetime extends at least until the delegate or expression tree created from the anonymous function, along with any other objects that come to reference the captured variable, are eligible for garbage collection.

Si el elemento primario bloque, for_statement, switch_statement, using_statement, foreach_statement, o specific_catch_clause se escribe de forma recursiva, se crea una nueva instancia de la variable local cada hora y su local_variable_initializer, si existe, se evalúa. cada vez.If the parent block, for_statement, switch_statement, using_statement, foreach_statement, or specific_catch_clause is entered recursively, a new instance of the local variable is created each time, and its local_variable_initializer, if any, is evaluated each time.

Una variable local introducida por un local_variable_declaration no se inicializa automáticamente y, por tanto, no tiene ningún valor predeterminado.A local variable introduced by a local_variable_declaration is not automatically initialized and thus has no default value. Con el fin de comprobación de asignación definitiva, una variable local introducidos por un local_variable_declaration se considera inicialmente sin asignar.For the purpose of definite assignment checking, a local variable introduced by a local_variable_declaration is considered initially unassigned. Un local_variable_declaration puede incluir un local_variable_initializer, en cuyo caso la variable se considera asignada definitivamente solo después de la expresión de inicialización ( Las instrucciones de declaración).A local_variable_declaration may include a local_variable_initializer, in which case the variable is considered definitely assigned only after the initializing expression (Declaration statements).

Dentro del ámbito de una variable local introducido por un local_variable_declaration, es un error en tiempo de compilación para hacer referencia a la variable local en una posición textual que precede a su local_variable_declarator.Within the scope of a local variable introduced by a local_variable_declaration, it is a compile-time error to refer to that local variable in a textual position that precedes its local_variable_declarator. Si la declaración de variable local es implícita (declaraciones de variable Local), también es un error hacer referencia a la variable dentro de su local_variable_declarator.If the local variable declaration is implicit (Local variable declarations), it is also an error to refer to the variable within its local_variable_declarator.

Una variable local introducida por un foreach_statement o un specific_catch_clause se considera asignado definitivamente en todo su ámbito.A local variable introduced by a foreach_statement or a specific_catch_clause is considered definitely assigned in its entire scope.

La duración real de una variable local es depende de la implementación.The actual lifetime of a local variable is implementation-dependent. Por ejemplo, un compilador puede determinar estáticamente que solo se usa una variable local en un bloque de una pequeña parte de ese bloque.For example, a compiler might statically determine that a local variable in a block is only used for a small portion of that block. Con este análisis, el compilador podría generar código que es el resultado en el almacenamiento de la variable tiene una duración más corta que su bloque contenedor.Using this analysis, the compiler could generate code that results in the variable's storage having a shorter lifetime than its containing block.

El almacenamiento al que hace referencia una variable de referencia local se reclama independientemente de la duración de esa variable de referencia local (administración de memoria automática).The storage referred to by a local reference variable is reclaimed independently of the lifetime of that local reference variable (Automatic memory management).

Valores predeterminadosDefault values

Las siguientes categorías de variables se inicializan automáticamente en sus valores predeterminados:The following categories of variables are automatically initialized to their default values:

  • Variables estáticas.Static variables.
  • Variables de instancia de instancias de clase.Instance variables of class instances.
  • Elementos de la matriz.Array elements.

El valor predeterminado de una variable depende del tipo de la variable y se determina como sigue:The default value of a variable depends on the type of the variable and is determined as follows:

  • Para una variable de un value_type, el valor predeterminado es el mismo que el valor calculado por el value_typedel constructor predeterminado (constructores predeterminados).For a variable of a value_type, the default value is the same as the value computed by the value_type's default constructor (Default constructors).
  • Para una variable de un reference_type, el valor predeterminado es null.For a variable of a reference_type, the default value is null.

Inicialización de los valores predeterminados normalmente se consigue haciendo que el Administrador de memoria o el recolector de elementos no utilizados inicializar la memoria para todos los bits cero antes de está asignada para su uso.Initialization to default values is typically done by having the memory manager or garbage collector initialize memory to all-bits-zero before it is allocated for use. Por este motivo, es conveniente utilizar todos los bits cero para representar la referencia nula.For this reason, it is convenient to use all-bits-zero to represent the null reference.

Asignación definitivaDefinite assignment

En una ubicación especificada en el código ejecutable de un miembro de función, una variable se dice que asignado definitivamente si el compilador puede probar, mediante un análisis de flujo estático concreto (reglas precisas para determinar definitiva asignación), que la variable se ha inicializado automáticamente o ha sido el destino de al menos una asignación.At a given location in the executable code of a function member, a variable is said to be definitely assigned if the compiler can prove, by a particular static flow analysis (Precise rules for determining definite assignment), that the variable has been automatically initialized or has been the target of at least one assignment. De manera informal se ha indicado, las reglas de asignación definitiva son:Informally stated, the rules of definite assignment are:

La especificación formal subyacente a las reglas informales anteriores se describe en variables asignadas inicialmente, inicialmente sin asignar variables, y reglas precisas para determinar asignación definitiva.The formal specification underlying the above informal rules is described in Initially assigned variables, Initially unassigned variables, and Precise rules for determining definite assignment.

Los Estados de asignación definitiva de variables de instancia de un struct_type variable se realiza un seguimiento individual y también colectivo.The definite assignment states of instance variables of a struct_type variable are tracked individually as well as collectively. En adicionales a las reglas anteriores, las reglas siguientes se aplican a struct_type variables y sus variables de instancia:In additional to the rules above, the following rules apply to struct_type variables and their instance variables:

  • Una variable de instancia se considera asignada definitivamente si lo contiene struct_type variable se considera asignado definitivamente.An instance variable is considered definitely assigned if its containing struct_type variable is considered definitely assigned.
  • Un struct_type variable se considera asignado definitivamente si cada uno de sus variables de instancia se considera asignado definitivamente.A struct_type variable is considered definitely assigned if each of its instance variables is considered definitely assigned.

Asignación definitiva es un requisito en los contextos siguientes:Definite assignment is a requirement in the following contexts:

  • Una variable debe estar asignada definitivamente en cada ubicación donde se obtiene su valor.A variable must be definitely assigned at each location where its value is obtained. Esto garantiza que nunca se producen valores no definidos.This ensures that undefined values never occur. Se considera la aparición de una variable en una expresión para obtener el valor de la variable, excepto cuandoThe occurrence of a variable in an expression is considered to obtain the value of the variable, except when
    • la variable es el operando izquierdo de una asignación simple,the variable is the left operand of a simple assignment,
    • la variable se pasa como parámetro de salida, othe variable is passed as an output parameter, or
    • la variable es un struct_type variable y se produce como el operando izquierdo de un acceso de miembro.the variable is a struct_type variable and occurs as the left operand of a member access.
  • Una variable debe estar asignada definitivamente en cada ubicación donde se pasa como un parámetro de referencia.A variable must be definitely assigned at each location where it is passed as a reference parameter. Esto garantiza que el miembro de función que se invoca puede tener en cuenta el parámetro de referencia asignado inicialmente.This ensures that the function member being invoked can consider the reference parameter initially assigned.
  • Todos los parámetros de salida de un miembro de función deben asignarlo definitivamente en cada ubicación donde se devuelve el miembro de función (a través de un return instrucción o a través de la ejecución llega al final del cuerpo de miembro de función).All output parameters of a function member must be definitely assigned at each location where the function member returns (through a return statement or through execution reaching the end of the function member body). Esto garantiza que los miembros de función no devuelven valores no definidos en los parámetros de salida, lo que permite al compilador que considere la posibilidad de una invocación de miembros de función que toma una variable como un parámetro de salida equivalente a una asignación a la variable.This ensures that function members do not return undefined values in output parameters, thus enabling the compiler to consider a function member invocation that takes a variable as an output parameter equivalent to an assignment to the variable.
  • El this variable de un struct_type constructor de instancia debe asignarlo definitivamente en cada ubicación donde se devuelve ese constructor de instancia.The this variable of a struct_type instance constructor must be definitely assigned at each location where that instance constructor returns.

Variables asignadas inicialmenteInitially assigned variables

Las siguientes categorías de variables se clasifican como asignadas inicialmente:The following categories of variables are classified as initially assigned:

  • Variables estáticas.Static variables.
  • Variables de instancia de instancias de clase.Instance variables of class instances.
  • Variables de instancia de variables de estructura asignadas inicialmente.Instance variables of initially assigned struct variables.
  • Elementos de la matriz.Array elements.
  • Parámetros de valor.Value parameters.
  • Parámetros de referencia.Reference parameters.
  • Las variables declaradas en un catch cláusula o foreach instrucción.Variables declared in a catch clause or a foreach statement.

Variables inicialmente sin asignarInitially unassigned variables

Las siguientes categorías de variables se clasifican como inicialmente sin asignar:The following categories of variables are classified as initially unassigned:

  • Variables de instancia de struct inicialmente sin asignar variables.Instance variables of initially unassigned struct variables.
  • Parámetros de salida, incluida la this variable de constructores de instancia de struct.Output parameters, including the this variable of struct instance constructors.
  • Las variables locales, excepto los declarados en un catch cláusula o foreach instrucción.Local variables, except those declared in a catch clause or a foreach statement.

Reglas precisas para determinar la asignación definitivaPrecise rules for determining definite assignment

Con el fin de determinar que cada variable utilizada se asigna definitivamente, el compilador debe usar un proceso que es equivalente a la descrita en esta sección.In order to determine that each used variable is definitely assigned, the compiler must use a process that is equivalent to the one described in this section.

El compilador procesa el cuerpo de cada miembro de función que tiene una o más variables inicialmente sin asignar.The compiler processes the body of each function member that has one or more initially unassigned variables. Para cada variable inicialmente sin asignar v, el compilador determina un estado de asignación definitiva para v en cada uno de los siguientes puntos en el miembro de función:For each initially unassigned variable v, the compiler determines a definite assignment state for v at each of the following points in the function member:

  • Al principio de cada instrucciónAt the beginning of each statement
  • En el punto final (puntos finales y alcance) de cada instrucciónAt the end point (End points and reachability) of each statement
  • En cada arco que transfiere el control a otra instrucción o al punto final de una instrucciónOn each arc which transfers control to another statement or to the end point of a statement
  • Al principio de cada expresiónAt the beginning of each expression
  • Al final de cada expresiónAt the end of each expression

El estado de asignación definitiva de v puede ser:The definite assignment state of v can be either:

  • Asigna definitivamente.Definitely assigned. Indica que todos los flujos de control posibles en este punto, v se ha asignado un valor.This indicates that on all possible control flows to this point, v has been assigned a value.
  • No asignado definitivamente.Not definitely assigned. El estado de una variable al final de una expresión de tipo bool, el estado de una variable que no se ha asignado definitivamente mayo (pero no necesariamente) se dividen en uno de los subestados siguientes:For the state of a variable at the end of an expression of type bool, the state of a variable that isn't definitely assigned may (but doesn't necessarily) fall into one of the following sub-states:
    • Se asigna definitivamente después de una expresión es true.Definitely assigned after true expression. Este estado indica que v se asigna definitivamente si la expresión booleana se evalúa como true, pero no se asigna necesariamente si la expresión booleana se evalúa como false.This state indicates that v is definitely assigned if the boolean expression evaluated as true, but is not necessarily assigned if the boolean expression evaluated as false.
    • Se asigna definitivamente después de una expresión es false.Definitely assigned after false expression. Este estado indica que v se asigna definitivamente si la expresión booleana se evalúa como false, pero no se asigna necesariamente si la expresión booleana se evalúa como true.This state indicates that v is definitely assigned if the boolean expression evaluated as false, but is not necessarily assigned if the boolean expression evaluated as true.

Las siguientes reglas determinan cómo el estado de una variable v viene determinada en cada ubicación.The following rules govern how the state of a variable v is determined at each location.

Reglas generales para las instruccionesGeneral rules for statements

  • v no se asigna definitivamente al principio de un cuerpo de función miembro.v is not definitely assigned at the beginning of a function member body.
  • v se asigna definitivamente al principio de cualquier instrucción inalcanzable.v is definitely assigned at the beginning of any unreachable statement.
  • El estado de asignación definitiva de v al principio de cualquier otra instrucción se determina comprobando el estado de asignación definitiva de v en todas las transferencias de flujo de control que tienen como destino el principio de la que instrucción.The definite assignment state of v at the beginning of any other statement is determined by checking the definite assignment state of v on all control flow transfers that target the beginning of that statement. Si (y sólo si) v se asigna definitivamente en todas estas transferencias de flujo de control, a continuación, v se asigna definitivamente al principio de la instrucción.If (and only if) v is definitely assigned on all such control flow transfers, then v is definitely assigned at the beginning of the statement. El conjunto de transferencias de flujo de control posibles se determina en la misma manera que el alcance de la instrucción de comprobación (puntos finales y alcance).The set of possible control flow transfers is determined in the same way as for checking statement reachability (End points and reachability).
  • El estado de asignación definitiva de v en el punto final de un bloque, checked, unchecked, if, while, do, for, foreach, lock, using, o switch viene determinado por la comprobación del estado de asignación definitiva de v en todas las transferencias de flujo de control que tienen como destino el punto final de esa instrucción.The definite assignment state of v at the end point of a block, checked, unchecked, if, while, do, for, foreach, lock, using, or switch statement is determined by checking the definite assignment state of v on all control flow transfers that target the end point of that statement. Si v se asigna definitivamente en todas estas transferencias de flujo de control, a continuación, v se asigna definitivamente en el punto final de la instrucción.If v is definitely assigned on all such control flow transfers, then v is definitely assigned at the end point of the statement. En caso contrario, v no se asigna definitivamente en el punto final de la instrucción.Otherwise; v is not definitely assigned at the end point of the statement. El conjunto de transferencias de flujo de control posibles se determina en la misma manera que el alcance de la instrucción de comprobación (puntos finales y alcance).The set of possible control flow transfers is determined in the same way as for checking statement reachability (End points and reachability).

Instrucciones de bloque checked y uncheckedBlock statements, checked, and unchecked statements

El estado de asignación definitiva de v en el control de transferencia de la primera instrucción de la lista de instrucciones en el bloque (o al punto final del bloque, si la lista de instrucciones está vacía) es el mismo que la instrucción de asignación definitiva de v antes del bloque, checked, o unchecked instrucción.The definite assignment state of v on the control transfer to the first statement of the statement list in the block (or to the end point of the block, if the statement list is empty) is the same as the definite assignment statement of v before the block, checked, or unchecked statement.

Instrucciones de expresiónExpression statements

Para una instrucción de expresión stmt que consta de la expresión expr:For an expression statement stmt that consists of the expression expr:

  • v tiene el mismo estado de asignación definitiva al principio de expr como al principio de stmt.v has the same definite assignment state at the beginning of expr as at the beginning of stmt.
  • Si v si asigna definitivamente al final de expr, se asigna definitivamente en el punto final de stmt; en caso contrario, no se asigna definitivamente en el punto final de stmt.If v if definitely assigned at the end of expr, it is definitely assigned at the end point of stmt; otherwise; it is not definitely assigned at the end point of stmt.

Instrucciones de declaraciónDeclaration statements

  • Si stmt es una instrucción de declaración sin inicializadores, a continuación, v tiene el mismo estado de asignación definitiva en el punto final de stmt como al principio de stmt.If stmt is a declaration statement without initializers, then v has the same definite assignment state at the end point of stmt as at the beginning of stmt.
  • Si stmt es una instrucción de declaración con inicializadores, a continuación, el estado de asignación definitiva para v se determina como si stmt eran una lista de instrucciones, con una asignación instrucción para cada declaración con un inicializador (en el orden de declaración).If stmt is a declaration statement with initializers, then the definite assignment state for v is determined as if stmt were a statement list, with one assignment statement for each declaration with an initializer (in the order of declaration).

Si las instruccionesIf statements

Para un if instrucción stmt del formulario:For an if statement stmt of the form:

if ( expr ) then_stmt else else_stmt
  • v tiene el mismo estado de asignación definitiva al principio de expr como al principio de stmt.v has the same definite assignment state at the beginning of expr as at the beginning of stmt.
  • Si v se asigna definitivamente al final de expr, a continuación, se asigna definitivamente en la transferencia de flujo de control a then_stmt y cualquiera else_stmt o para el punto de conexión de stmt si no hay ninguna cláusula else.If v is definitely assigned at the end of expr, then it is definitely assigned on the control flow transfer to then_stmt and to either else_stmt or to the end-point of stmt if there is no else clause.
  • Si v tiene el estado "asignado definitivamente después de una expresión true" al final de expr, a continuación, se asigna definitivamente en la transferencia de flujo de control a then_stmty no asignado definitivamente en la transferencia de flujo de control como else_stmt o para el punto de conexión de stmt si no hay ninguna cláusula else.If v has the state "definitely assigned after true expression" at the end of expr, then it is definitely assigned on the control flow transfer to then_stmt, and not definitely assigned on the control flow transfer to either else_stmt or to the end-point of stmt if there is no else clause.
  • Si v tiene el estado "asignado definitivamente después de una expresión false" al final de expr, a continuación, se asigna definitivamente en la transferencia de flujo de control a else_stmty no se asigna definitivamente en la transferencia de flujo de control a then_stmt.If v has the state "definitely assigned after false expression" at the end of expr, then it is definitely assigned on the control flow transfer to else_stmt, and not definitely assigned on the control flow transfer to then_stmt. Se asigna definitivamente en el punto final de stmt solo si se asigna definitivamente en el punto final de then_stmt.It is definitely assigned at the end-point of stmt if and only if it is definitely assigned at the end-point of then_stmt.
  • En caso contrario, v no se considera asignado definitivamente en la transferencia de flujo de control como el then_stmt o else_stmt, o para el punto de conexión de stmt si no hay ninguna cláusula else.Otherwise, v is considered not definitely assigned on the control flow transfer to either the then_stmt or else_stmt, or to the end-point of stmt if there is no else clause.

Instrucciones switchSwitch statements

En un switch instrucción stmt con una expresión de control expr:In a switch statement stmt with a controlling expression expr:

  • El estado de asignación definitiva de v al principio de expr es el mismo que el estado de v al principio de stmt.The definite assignment state of v at the beginning of expr is the same as the state of v at the beginning of stmt.
  • El estado de asignación definitiva de v transferencia a una lista de instrucciones switch puede obtener acceso al bloque en el flujo de control es el mismo que el estado de asignación definitiva de v al final de expr.The definite assignment state of v on the control flow transfer to a reachable switch block statement list is the same as the definite assignment state of v at the end of expr.

Instrucciones whileWhile statements

Para un while instrucción stmt del formulario:For a while statement stmt of the form:

while ( expr ) while_body
  • v tiene el mismo estado de asignación definitiva al principio de expr como al principio de stmt.v has the same definite assignment state at the beginning of expr as at the beginning of stmt.
  • Si v se asigna definitivamente al final de expr, a continuación, se asigna definitivamente en la transferencia de flujo de control a while_body y para el punto final de stmt.If v is definitely assigned at the end of expr, then it is definitely assigned on the control flow transfer to while_body and to the end point of stmt.
  • Si v tiene el estado "asignado definitivamente después de una expresión true" al final de expr, a continuación, se asigna definitivamente en la transferencia de flujo de control a while_body, pero no se asigna definitivamente en el punto final de stmt.If v has the state "definitely assigned after true expression" at the end of expr, then it is definitely assigned on the control flow transfer to while_body, but not definitely assigned at the end-point of stmt.
  • Si v tiene el estado "asignado definitivamente después de una expresión false" al final de expr, a continuación, se asigna definitivamente en la transferencia de flujo de control para el punto final de stmt , pero no asignado definitivamente en la transferencia de flujo de control a while_body.If v has the state "definitely assigned after false expression" at the end of expr, then it is definitely assigned on the control flow transfer to the end point of stmt, but not definitely assigned on the control flow transfer to while_body.

Siga las instruccionesDo statements

Para un do instrucción stmt del formulario:For a do statement stmt of the form:

do do_body while ( expr ) ;
  • v tiene el mismo estado de asignación definitiva en la transferencia de flujo de control desde el principio del stmt a do_body como al principio de stmt.v has the same definite assignment state on the control flow transfer from the beginning of stmt to do_body as at the beginning of stmt.
  • v tiene el mismo estado de asignación definitiva al principio de expr como en el punto final de do_body.v has the same definite assignment state at the beginning of expr as at the end point of do_body.
  • Si v se asigna definitivamente al final de expr, a continuación, se asigna definitivamente en la transferencia de flujo de control para el punto final de stmt.If v is definitely assigned at the end of expr, then it is definitely assigned on the control flow transfer to the end point of stmt.
  • Si v tiene el estado "asignado definitivamente después de una expresión false" al final de expr, a continuación, se asigna definitivamente en la transferencia de flujo de control para el punto final de stmt .If v has the state "definitely assigned after false expression" at the end of expr, then it is definitely assigned on the control flow transfer to the end point of stmt.

Para las instruccionesFor statements

Asignación definitiva buscando un for instrucción del formulario:Definite assignment checking for a for statement of the form:

for ( for_initializer ; for_condition ; for_iterator ) embedded_statement

se realiza como si hubiera escrito la instrucción:is done as if the statement were written:

{
    for_initializer ;
    while ( for_condition ) {
        embedded_statement ;
        for_iterator ;
    }
}

Si el for_condition se omite de la for instrucción y, a continuación, la evaluación de asignación definitiva continúa como si for_condition se reemplazaron con true en la expansión anterior .If the for_condition is omitted from the for statement, then evaluation of definite assignment proceeds as if for_condition were replaced with true in the above expansion.

Break, continue y las instrucciones gotoBreak, continue, and goto statements

El estado de asignación definitiva de v en la transferencia de flujo de control causada por un break, continue, o goto instrucción es el mismo que el estado de asignación definitiva de v en el a partir de la instrucción.The definite assignment state of v on the control flow transfer caused by a break, continue, or goto statement is the same as the definite assignment state of v at the beginning of the statement.

Throw (instrucciones)Throw statements

Para una instrucción stmt del formularioFor a statement stmt of the form

throw expr ;

El estado de asignación definitiva de v al principio de expr es el mismo que el estado de asignación definitiva de v al principio de stmt.The definite assignment state of v at the beginning of expr is the same as the definite assignment state of v at the beginning of stmt.

Instrucciones returnReturn statements

Para una instrucción stmt del formularioFor a statement stmt of the form

return expr ;
  • El estado de asignación definitiva de v al principio de expr es el mismo que el estado de asignación definitiva de v al principio de stmt.The definite assignment state of v at the beginning of expr is the same as the definite assignment state of v at the beginning of stmt.
  • Si v es un parámetro output, a continuación, se debe asignarlo definitivamente cualquiera:If v is an output parameter, then it must be definitely assigned either:
    • una vez exprafter expr
    • o al final de la finally block de un try - finally o try - catch - finally que rodea el return instrucción.or at the end of the finally block of a try-finally or try-catch-finally that encloses the return statement.

Para una instrucción stmt del formulario:For a statement stmt of the form:

return ;
  • Si v es un parámetro output, a continuación, se debe asignarlo definitivamente cualquiera:If v is an output parameter, then it must be definitely assigned either:
    • before stmtbefore stmt
    • o al final de la finally block de un try - finally o try - catch - finally que rodea el return instrucción.or at the end of the finally block of a try-finally or try-catch-finally that encloses the return statement.

Instrucciones try-catchTry-catch statements

Para una instrucción stmt del formulario:For a statement stmt of the form:

try try_block
catch(...) catch_block_1
...
catch(...) catch_block_n
  • El estado de asignación definitiva de v al principio de try_block es el mismo que el estado de asignación definitiva de v al principio de stmt.The definite assignment state of v at the beginning of try_block is the same as the definite assignment state of v at the beginning of stmt.
  • El estado de asignación definitiva de v al principio de catch_block_i (para cualquier i) es el mismo que el estado de asignación definitiva de val principio de stmt.The definite assignment state of v at the beginning of catch_block_i (for any i) is the same as the definite assignment state of v at the beginning of stmt.
  • El estado de asignación definitiva de v en el punto final de stmt está asignado definitivamente si (y sólo si) v se asigna definitivamente en el punto final de try_block y cada catch_block_i (para cada i de 1 a n).The definite assignment state of v at the end-point of stmt is definitely assigned if (and only if) v is definitely assigned at the end-point of try_block and every catch_block_i (for every i from 1 to n).

Instrucciones try-finallyTry-finally statements

Para un try instrucción stmt del formulario:For a try statement stmt of the form:

try try_block finally finally_block
  • El estado de asignación definitiva de v al principio de try_block es el mismo que el estado de asignación definitiva de v al principio de stmt.The definite assignment state of v at the beginning of try_block is the same as the definite assignment state of v at the beginning of stmt.
  • El estado de asignación definitiva de v al principio de finally_block es el mismo que el estado de asignación definitiva de v al principio de stmt .The definite assignment state of v at the beginning of finally_block is the same as the definite assignment state of v at the beginning of stmt.
  • El estado de asignación definitiva de v en el punto final de stmt está asignado definitivamente si (y sólo si) al menos uno de los siguientes es true:The definite assignment state of v at the end-point of stmt is definitely assigned if (and only if) at least one of the following is true:
    • v se asigna definitivamente en el punto final de try_blockv is definitely assigned at the end-point of try_block
    • v se asigna definitivamente en el punto final de finally_blockv is definitely assigned at the end-point of finally_block

Si una transferencia de flujo de control (por ejemplo, un goto instrucción) se realiza alguna que comienza en try_blocky termina fuera de try_block, a continuación, v también es considera asignado definitivamente en esa transferencia de flujo de control si v se asigna definitivamente en el punto final de finally_block.If a control flow transfer (for example, a goto statement) is made that begins within try_block, and ends outside of try_block, then v is also considered definitely assigned on that control flow transfer if v is definitely assigned at the end-point of finally_block. (Esta condición no es exclusiva: si v se asigna definitivamente por otra razón en esta transferencia de flujo de control, a continuación, se considera asignado definitivamente.)(This is not an only if—if v is definitely assigned for another reason on this control flow transfer, then it is still considered definitely assigned.)

Instrucciones try-catch-finallyTry-catch-finally statements

Análisis de asignación definitiva para un try - catch - finally instrucción del formulario:Definite assignment analysis for a try-catch-finally statement of the form:

try try_block
catch(...) catch_block_1
...
catch(...) catch_block_n
finally *finally_block*

se realiza como si la instrucción fuera un try - finally instrucción envolvente un try - catch instrucción:is done as if the statement were a try-finally statement enclosing a try-catch statement:

try {
    try try_block
    catch(...) catch_block_1
    ...
    catch(...) catch_block_n
}
finally finally_block

En el ejemplo siguiente se muestra cómo los diferentes bloques de un try instrucción (la instrucción try) afectan a la asignación definitiva.The following example demonstrates how the different blocks of a try statement (The try statement) affect definite assignment.

class A
{
    static void F() {
        int i, j;
        try {
            goto LABEL;
            // neither i nor j definitely assigned
            i = 1;
            // i definitely assigned
        }

        catch {
            // neither i nor j definitely assigned
            i = 3;
            // i definitely assigned
        }

        finally {
            // neither i nor j definitely assigned
            j = 5;
            // j definitely assigned
            }
        // i and j definitely assigned
        LABEL:;
        // j definitely assigned

    }
}

Instrucciones foreachForeach statements

Para un foreach instrucción stmt del formulario:For a foreach statement stmt of the form:

foreach ( type identifier in expr ) embedded_statement
  • El estado de asignación definitiva de v al principio de expr es el mismo que el estado de v al principio de stmt.The definite assignment state of v at the beginning of expr is the same as the state of v at the beginning of stmt.
  • El estado de asignación definitiva de v en la transferencia de flujo de control a embedded_statement o hasta el punto final de stmt es el mismo que el estado de v al final de expr.The definite assignment state of v on the control flow transfer to embedded_statement or to the end point of stmt is the same as the state of v at the end of expr.

Las instrucciones usingUsing statements

Para un using instrucción stmt del formulario:For a using statement stmt of the form:

using ( resource_acquisition ) embedded_statement
  • El estado de asignación definitiva de v al principio de resource_acquisition es el mismo que el estado de v al principio de stmt.The definite assignment state of v at the beginning of resource_acquisition is the same as the state of v at the beginning of stmt.
  • El estado de asignación definitiva de v en la transferencia de flujo de control a embedded_statement es el mismo que el estado de v al final de resource_ adquisición.The definite assignment state of v on the control flow transfer to embedded_statement is the same as the state of v at the end of resource_acquisition.

Instrucciones de bloqueoLock statements

Para un lock instrucción stmt del formulario:For a lock statement stmt of the form:

lock ( expr ) embedded_statement
  • El estado de asignación definitiva de v al principio de expr es el mismo que el estado de v al principio de stmt.The definite assignment state of v at the beginning of expr is the same as the state of v at the beginning of stmt.
  • El estado de asignación definitiva de v en la transferencia de flujo de control a embedded_statement es el mismo que el estado de v al final de expr.The definite assignment state of v on the control flow transfer to embedded_statement is the same as the state of v at the end of expr.

Instrucciones yieldYield statements

Para un yield return instrucción stmt del formulario:For a yield return statement stmt of the form:

yield return expr ;
  • El estado de asignación definitiva de v al principio de expr es el mismo que el estado de v al principio de stmt.The definite assignment state of v at the beginning of expr is the same as the state of v at the beginning of stmt.
  • El estado de asignación definitiva de v al final de stmt es el mismo que el estado de v al final de expr.The definite assignment state of v at the end of stmt is the same as the state of v at the end of expr.
  • Un yield break instrucción no tiene ningún efecto sobre el estado de asignación definitiva.A yield break statement has no effect on the definite assignment state.

Reglas generales para las expresiones simplesGeneral rules for simple expressions

La siguiente regla se aplica a estos tipos de expresiones: literales (literales), nombres simples (nombres simples), expresiones de acceso a miembro (acceso a miembros), las expresiones de acceso base no indizada (Base acceso), typeof expresiones (el operador typeof), expresiones de valor predeterminado (expresiones de valor predeterminado ) y nameof expresiones (expresiones Nameof).The following rule applies to these kinds of expressions: literals (Literals), simple names (Simple names), member access expressions (Member access), non-indexed base access expressions (Base access), typeof expressions (The typeof operator), default value expressions (Default value expressions) and nameof expressions (Nameof expressions).

  • El estado de asignación definitiva de v al final de este tipo de expresión es el mismo que el estado de asignación definitiva de v al principio de la expresión.The definite assignment state of v at the end of such an expression is the same as the definite assignment state of v at the beginning of the expression.

Reglas generales para expresiones con expresiones incrustadasGeneral rules for expressions with embedded expressions

Las reglas siguientes se aplican a estos tipos de expresiones: las expresiones entre paréntesis (las expresiones entre paréntesis), las expresiones de acceso de elemento (acceso de elemento) base, obtener acceso a las expresiones con indexación (Base acceso), aumentar y disminuir las expresiones (operadores postfijos de incremento y decremento, prefijo de incremento y decremento operadores), las expresiones de conversión (expresiones de conversión), unario +, -, ~, * expresiones, binarias +, -, *, /, %, <<, >>, <, <=, >, >=, ==, !=, is, as, &, |, ^ expresiones (operadores aritméticos, operadores de desplazamiento, operadores de comprobación de tipos y relacionales Operadores lógicos), compuesta de expresiones de asignación (asignación compuesta), checked y unchecked expresiones (checked y unchecked operadores), además de las expresiones de creación de matriz y un delegado (el operador new).The following rules apply to these kinds of expressions: parenthesized expressions (Parenthesized expressions), element access expressions (Element access), base access expressions with indexing (Base access), increment and decrement expressions (Postfix increment and decrement operators, Prefix increment and decrement operators), cast expressions (Cast expressions), unary +, -, ~, * expressions, binary +, -, *, /, %, <<, >>, <, <=, >, >=, ==, !=, is, as, &, |, ^ expressions (Arithmetic operators, Shift operators, Relational and type-testing operators, Logical operators), compound assignment expressions (Compound assignment), checked and unchecked expressions (The checked and unchecked operators), plus array and delegate creation expressions (The new operator).

Cada una de estas expresiones tiene uno o más subexpresiones que se evalúan incondicionalmente en un orden fijo.Each of these expressions has one or more sub-expressions that are unconditionally evaluated in a fixed order. Por ejemplo, el archivo binario % operador evalúa el lado izquierdo del operador y, después, en el lado derecho.For example, the binary % operator evaluates the left hand side of the operator, then the right hand side. Una operación de indización evalúa la expresión indizada y, a continuación, evalúa cada una de las expresiones de índice, en orden de izquierda a derecha.An indexing operation evaluates the indexed expression, and then evaluates each of the index expressions, in order from left to right. Para una expresión expr, que tiene las subexpresiones e1, e2,..., eN, evaluada en ese orden:For an expression expr, which has sub-expressions e1, e2, ..., eN, evaluated in that order:

  • El estado de asignación definitiva de v al principio de e1 es el mismo que el estado de asignación definitiva al principio de expr.The definite assignment state of v at the beginning of e1 is the same as the definite assignment state at the beginning of expr.
  • El estado de asignación definitiva de v al principio de ei (i mayor que uno) es el mismo que el estado de asignación definitiva al final de la subexpresión anterior.The definite assignment state of v at the beginning of ei (i greater than one) is the same as the definite assignment state at the end of the previous sub-expression.
  • El estado de asignación definitiva de v al final de expr es el mismo que el estado de asignación definitiva al final de eNThe definite assignment state of v at the end of expr is the same as the definite assignment state at the end of eN

Expresiones de invocación y expresiones de creación de objetoInvocation expressions and object creation expressions

Para una expresión de invocación expr del formulario:For an invocation expression expr of the form:

primary_expression ( arg1 , arg2 , ... , argN )

o una expresión de creación de objeto del formulario:or an object creation expression of the form:

new type ( arg1 , arg2 , ... , argN )
  • Para una expresión de invocación, el estado de asignación definitiva de v antes primary_expression es el mismo que el estado de v antes expr.For an invocation expression, the definite assignment state of v before primary_expression is the same as the state of v before expr.
  • Para una expresión de invocación, el estado de asignación definitiva de v antes arg1 es el mismo que el estado de v después primary_expression.For an invocation expression, the definite assignment state of v before arg1 is the same as the state of v after primary_expression.
  • Para una expresión de creación de objeto, el estado de asignación definitiva de v antes arg1 es el mismo que el estado de v antes expr.For an object creation expression, the definite assignment state of v before arg1 is the same as the state of v before expr.
  • Para cada argumento argi, el estado de asignación definitiva de v después argi viene determinada por las reglas de expresión normales, se omitirá cualquier ref o outmodificadores.For each argument argi, the definite assignment state of v after argi is determined by the normal expression rules, ignoring any ref or out modifiers.
  • Para cada argumento argi para cualquier i mayor que uno, el estado de asignación definitiva de v antes argi es el mismo que el estado de v después de la anterior arg.For each argument argi for any i greater than one, the definite assignment state of v before argi is the same as the state of v after the previous arg.
  • Si la variable v se pasa como un out argumento (es decir, un argumento del formulario out v) en cualquiera de los argumentos y, a continuación, el estado de v después expr se ha asignado definitivamente.If the variable v is passed as an out argument (i.e., an argument of the form out v) in any of the arguments, then the state of v after expr is definitely assigned. En caso contrario, el estado de v después expr es el mismo que el estado de v después argN.Otherwise; the state of v after expr is the same as the state of v after argN.
  • Inicializadores de matriz (expresiones de creación de matriz), inicializadores de objeto (inicializadores de objeto), los inicializadores de colección (inicializadores de colección) y los inicializadores de objeto anónimo (expresiones de creación de objeto anónimo), el estado de asignación definitiva viene determinada por la expansión que estas construcciones se definen en términos de.For array initializers (Array creation expressions), object initializers (Object initializers), collection initializers (Collection initializers) and anonymous object initializers (Anonymous object creation expressions), the definite assignment state is determined by the expansion that these constructs are defined in terms of.

Expresiones de asignación simpleSimple assignment expressions

Para una expresión expr del formulario w = expr_rhs:For an expression expr of the form w = expr_rhs:

  • El estado de asignación definitiva de v antes expr_rhs es el mismo que el estado de asignación definitiva de v antes expr.The definite assignment state of v before expr_rhs is the same as the definite assignment state of v before expr.
  • El estado de asignación definitiva de v después expr viene determinada por:The definite assignment state of v after expr is determined by:
    • Si w es la misma variable como v, a continuación, el estado de asignación definitiva de v después expr se asigna definitivamente.If w is the same variable as v, then the definite assignment state of v after expr is definitely assigned.
    • En caso contrario, si la asignación se produce dentro del constructor de instancia de un tipo de estructura, si w es un acceso de propiedad que designa una propiedad implementada automáticamente P en la instancia que se está construyendo y v es el campo de respaldo oculto de P, a continuación, el estado de asignación definitiva de v después expr definitivamente asignado.Otherwise, if the assignment occurs within the instance constructor of a struct type, if w is a property access designating an automatically implemented property P on the instance being constructed and v is the hidden backing field of P, then the definite assignment state of v after expr is definitely assigned.
    • En caso contrario, el estado de asignación definitiva de v después expr es el mismo que el estado de asignación definitiva de v después expr_rhs.Otherwise, the definite assignment state of v after expr is the same as the definite assignment state of v after expr_rhs.

& & (AND condicional) expresiones&& (conditional AND) expressions

Para una expresión expr del formulario expr_first && expr_second:For an expression expr of the form expr_first && expr_second:

  • El estado de asignación definitiva de v antes expr_first es el mismo que el estado de asignación definitiva de v antes expr.The definite assignment state of v before expr_first is the same as the definite assignment state of v before expr.
  • El estado de asignación definitiva de v antes expr_second se asigna definitivamente si el estado de v después expr_first sea asignado definitivamente o "asignado definitivamente después de una expresión true".The definite assignment state of v before expr_second is definitely assigned if the state of v after expr_first is either definitely assigned or "definitely assigned after true expression". En caso contrario, no se asigna definitivamente.Otherwise, it is not definitely assigned.
  • El estado de asignación definitiva de v después expr viene determinada por:The definite assignment state of v after expr is determined by:
    • Si expr_first es una expresión constante con el valor false, a continuación, el estado de asignación definitiva de v después expr es igual que la asignación definitiva estado de v después expr_first.If expr_first is a constant expression with the value false, then the definite assignment state of v after expr is the same as the definite assignment state of v after expr_first.
    • De lo contrario, si el estado de v después expr_first se asigna definitivamente, a continuación, el estado de v después expr se asigna definitivamente.Otherwise, if the state of v after expr_first is definitely assigned, then the state of v after expr is definitely assigned.
    • De lo contrario, si el estado de v después expr_second se asigna definitivamente y el estado de v después expr_first "definitivamente asignado después de una expresión false", entonces el estado de v después expr se asigna definitivamente.Otherwise, if the state of v after expr_second is definitely assigned, and the state of v after expr_first is "definitely assigned after false expression", then the state of v after expr is definitely assigned.
    • De lo contrario, si el estado de v después expr_second se asigna definitivamente o "asignado definitivamente después de una expresión true", entonces el estado de v después Expr es "asignado definitivamente después de una expresión true".Otherwise, if the state of v after expr_second is definitely assigned or "definitely assigned after true expression", then the state of v after expr is "definitely assigned after true expression".
    • De lo contrario, si el estado de v después expr_first es "asignado definitivamente después de una expresión false" y el estado de v después expr_second es "asignado definitivamente después de una expresión false", entonces el estado de v después expr es "asignado definitivamente después de una expresión false".Otherwise, if the state of v after expr_first is "definitely assigned after false expression", and the state of v after expr_second is "definitely assigned after false expression", then the state of v after expr is "definitely assigned after false expression".
    • En caso contrario, el estado de v después expr no se ha asignado definitivamente.Otherwise, the state of v after expr is not definitely assigned.

En el ejemploIn the example

class A
{
    static void F(int x, int y) {
        int i;
        if (x >= 0 && (i = y) >= 0) {
            // i definitely assigned
        }
        else {
            // i not definitely assigned
        }
        // i not definitely assigned
    }
}

la variable i se considera asignado definitivamente en una de las instrucciones incrustadas de una if instrucción pero no en el otro.the variable i is considered definitely assigned in one of the embedded statements of an if statement but not in the other. En el if instrucción en el método F, la variable i se asigna definitivamente en la primera instrucción incrustada porque la ejecución de la expresión (i = y) siempre precede a la ejecución de esta instrucción incrustada.In the if statement in method F, the variable i is definitely assigned in the first embedded statement because execution of the expression (i = y) always precedes execution of this embedded statement. En cambio, la variable i no se asigna definitivamente en la segunda instrucción incrustada, ya que x >= 0 podría dar como resultado false, lo que resulta en la variable i sin asignar.In contrast, the variable i is not definitely assigned in the second embedded statement, since x >= 0 might have tested false, resulting in the variable i being unassigned.

|| (OR condicional) expresiones|| (conditional OR) expressions

Para una expresión expr del formulario expr_first || expr_second:For an expression expr of the form expr_first || expr_second:

  • El estado de asignación definitiva de v antes expr_first es el mismo que el estado de asignación definitiva de v antes expr.The definite assignment state of v before expr_first is the same as the definite assignment state of v before expr.
  • El estado de asignación definitiva de v antes expr_second se asigna definitivamente si el estado de v después expr_first sea asignado definitivamente o "asignado definitivamente después de una expresión false".The definite assignment state of v before expr_second is definitely assigned if the state of v after expr_first is either definitely assigned or "definitely assigned after false expression". En caso contrario, no se asigna definitivamente.Otherwise, it is not definitely assigned.
  • La instrucción de asignación definitiva de v después expr viene determinada por:The definite assignment statement of v after expr is determined by:
    • Si expr_first es una expresión constante con el valor true, a continuación, el estado de asignación definitiva de v después expr es igual que la asignación definitiva estado de v después expr_first.If expr_first is a constant expression with the value true, then the definite assignment state of v after expr is the same as the definite assignment state of v after expr_first.
    • De lo contrario, si el estado de v después expr_first se asigna definitivamente, a continuación, el estado de v después expr se asigna definitivamente.Otherwise, if the state of v after expr_first is definitely assigned, then the state of v after expr is definitely assigned.
    • De lo contrario, si el estado de v después expr_second se asigna definitivamente y el estado de v después expr_first "definitivamente asignado después de una expresión true", entonces el estado de v después expr se asigna definitivamente.Otherwise, if the state of v after expr_second is definitely assigned, and the state of v after expr_first is "definitely assigned after true expression", then the state of v after expr is definitely assigned.
    • De lo contrario, si el estado de v después expr_second se asigna definitivamente o "asignado definitivamente después de una expresión false", entonces el estado de v después expr es "asignado definitivamente después de una expresión false".Otherwise, if the state of v after expr_second is definitely assigned or "definitely assigned after false expression", then the state of v after expr is "definitely assigned after false expression".
    • De lo contrario, si el estado de v después expr_first es "asignado definitivamente después de una expresión true" y el estado de v después expr_secondes "asignado definitivamente después de una expresión true", entonces el estado de v después expr es "asignado definitivamente después de una expresión true".Otherwise, if the state of v after expr_first is "definitely assigned after true expression", and the state of v after expr_second is "definitely assigned after true expression", then the state of v after expr is "definitely assigned after true expression".
    • En caso contrario, el estado de v después expr no se ha asignado definitivamente.Otherwise, the state of v after expr is not definitely assigned.

En el ejemploIn the example

class A
{
    static void G(int x, int y) {
        int i;
        if (x >= 0 || (i = y) >= 0) {
            // i not definitely assigned
        }
        else {
            // i definitely assigned
        }
        // i not definitely assigned
    }
}

la variable i se considera asignado definitivamente en una de las instrucciones incrustadas de una if instrucción pero no en el otro.the variable i is considered definitely assigned in one of the embedded statements of an if statement but not in the other. En el if instrucción en el método G, la variable i se asigna definitivamente en la segunda instrucción incrustada porque la ejecución de la expresión (i = y) siempre precede a la ejecución de esta instrucción incrustada.In the if statement in method G, the variable i is definitely assigned in the second embedded statement because execution of the expression (i = y) always precedes execution of this embedded statement. En cambio, la variable i no se asigna definitivamente en la primera instrucción incrustada, ya que x >= 0 podría dar como resultado true, lo que resulta en la variable i sin asignar.In contrast, the variable i is not definitely assigned in the first embedded statement, since x >= 0 might have tested true, resulting in the variable i being unassigned.

!! expresiones (negación lógica)(logical negation) expressions

Para una expresión expr del formulario ! expr_operand:For an expression expr of the form ! expr_operand:

  • El estado de asignación definitiva de v antes expr_operand es el mismo que el estado de asignación definitiva de v antes expr.The definite assignment state of v before expr_operand is the same as the definite assignment state of v before expr.
  • El estado de asignación definitiva de v después expr viene determinada por:The definite assignment state of v after expr is determined by:
    • Si el estado de v después * expr_operand * se asigna definitivamente, a continuación, el estado de v después expr se asigna definitivamente.If the state of v after *expr_operand *is definitely assigned, then the state of v after expr is definitely assigned.
    • Si el estado de v después * expr_operand * no es asigna definitivamente, a continuación, el estado de v después expr no se ha asignado definitivamente.If the state of v after *expr_operand *is not definitely assigned, then the state of v after expr is not definitely assigned.
    • Si el estado de v después * expr_operand * es "asignado definitivamente después de una expresión false", entonces el estado de v después expr es "asignado definitivamente después true expresión".If the state of v after *expr_operand *is "definitely assigned after false expression", then the state of v after expr is "definitely assigned after true expression".
    • Si el estado de v después * expr_operand * es "asignado definitivamente después de una expresión true", entonces el estado de v después expr es "asignado definitivamente después false expresión".If the state of v after *expr_operand *is "definitely assigned after true expression", then the state of v after expr is "definitely assigned after false expression".

???? expresiones (uso combinado de null)(null coalescing) expressions

Para una expresión expr del formulario expr_first ?? expr_second:For an expression expr of the form expr_first ?? expr_second:

  • El estado de asignación definitiva de v antes expr_first es el mismo que el estado de asignación definitiva de v antes expr.The definite assignment state of v before expr_first is the same as the definite assignment state of v before expr.
  • El estado de asignación definitiva de v antes expr_second es el mismo que el estado de asignación definitiva de v después expr_first.The definite assignment state of v before expr_second is the same as the definite assignment state of v after expr_first.
  • La instrucción de asignación definitiva de v después expr viene determinada por:The definite assignment statement of v after expr is determined by:
    • Si expr_first es una expresión constante (expresiones constantes) con valor null, entonces el estado de v después expr es igual que el estado de v después expr_second.If expr_first is a constant expression (Constant expressions) with value null, then the state of v after expr is the same as the state of v after expr_second.
  • En caso contrario, el estado de v después expr es el mismo que el estado de asignación definitiva de v después expr_first.Otherwise, the state of v after expr is the same as the definite assignment state of v after expr_first.

?: (condicionales) expresiones?: (conditional) expressions

Para una expresión expr del formulario expr_cond ? expr_true : expr_false:For an expression expr of the form expr_cond ? expr_true : expr_false:

  • El estado de asignación definitiva de v antes expr_cond es el mismo que el estado de v antes expr.The definite assignment state of v before expr_cond is the same as the state of v before expr.
  • El estado de asignación definitiva de v antes expr_true se asigna definitivamente solo si uno de los siguientes contiene:The definite assignment state of v before expr_true is definitely assigned if and only if one of the following holds:
    • expr_cond es una expresión constante con el valor falseexpr_cond is a constant expression with the value false
    • el estado de v después expr_cond se asigna definitivamente o "asignado definitivamente después de una expresión true".the state of v after expr_cond is definitely assigned or "definitely assigned after true expression".
  • El estado de asignación definitiva de v antes expr_false se asigna definitivamente solo si uno de los siguientes contiene:The definite assignment state of v before expr_false is definitely assigned if and only if one of the following holds:
    • expr_cond es una expresión constante con el valor trueexpr_cond is a constant expression with the value true
  • el estado de v después expr_cond se asigna definitivamente o "asignado definitivamente después de una expresión false".the state of v after expr_cond is definitely assigned or "definitely assigned after false expression".
  • El estado de asignación definitiva de v después expr viene determinada por:The definite assignment state of v after expr is determined by:
    • Si expr_cond es una expresión constante (expresiones constantes) con el valor true , a continuación, el estado de v después expr es el mismo que el estado de v después expr_true.If expr_cond is a constant expression (Constant expressions) with value true then the state of v after expr is the same as the state of v after expr_true.
    • De lo contrario, si expr_cond es una expresión constante (expresiones constantes) con el valor false , a continuación, el estado de v después expr es el mismo que el estado de v después expr_false.Otherwise, if expr_cond is a constant expression (Constant expressions) with value false then the state of v after expr is the same as the state of v after expr_false.
    • De lo contrario, si el estado de v después expr_true se asigna definitivamente y el estado de v después expr_false definitivamente asigna, a continuación, el estado de v después expr se asigna definitivamente.Otherwise, if the state of v after expr_true is definitely assigned and the state of v after expr_false is definitely assigned, then the state of v after expr is definitely assigned.
    • En caso contrario, el estado de v después expr no se ha asignado definitivamente.Otherwise, the state of v after expr is not definitely assigned.

Funciones anónimasAnonymous functions

Para un lambda_expression o anonymous_method_expression expr con un cuerpo (ya sea bloque o expresión ) cuerpo:For a lambda_expression or anonymous_method_expression expr with a body (either block or expression) body:

  • El estado de asignación definitiva de una variable externa v antes cuerpo es el mismo que el estado de v antes expr.The definite assignment state of an outer variable v before body is the same as the state of v before expr. Es decir, el estado de asignación definitiva de variables externas se hereda el contexto de la función anónima.That is, definite assignment state of outer variables is inherited from the context of the anonymous function.
  • El estado de asignación definitiva de una variable externa v después expr es el mismo que el estado de v antes expr.The definite assignment state of an outer variable v after expr is the same as the state of v before expr.

El ejemploThe example

delegate bool Filter(int i);

void F() {
    int max;

    // Error, max is not definitely assigned
    Filter f = (int n) => n < max;

    max = 5;
    DoWork(f);
}

genera un error en tiempo de compilación desde max no se ha asignado definitivamente donde se declara la función anónima.generates a compile-time error since max is not definitely assigned where the anonymous function is declared. El ejemploThe example

delegate void D();

void F() {
    int n;
    D d = () => { n = 1; };

    d();

    // Error, n is not definitely assigned
    Console.WriteLine(n);
}

También genera un error en tiempo de compilación desde la asignación a n en la función anónima no tiene ningún efecto sobre el estado de asignación definitiva de n fuera de la función anónima.also generates a compile-time error since the assignment to n in the anonymous function has no affect on the definite assignment state of n outside the anonymous function.

Referencias de variablesVariable references

Un variable_reference es un expresión que se clasifica como una variable.A variable_reference is an expression that is classified as a variable. Un variable_reference denota una ubicación de almacenamiento que se puede acceder tanto para capturar el valor actual y para almacenar un nuevo valor.A variable_reference denotes a storage location that can be accessed both to fetch the current value and to store a new value.

variable_reference
    : expression
    ;

En C y C++, un variable_reference se conoce como un lvalue.In C and C++, a variable_reference is known as an lvalue.

Atomicidad de las referencias de variablesAtomicity of variable references

Lecturas y escrituras de los siguientes tipos de datos son atómicas: bool, char, byte, sbyte, short, ushort, uint, int, floaty tipos de referencia.Reads and writes of the following data types are atomic: bool, char, byte, sbyte, short, ushort, uint, int, float, and reference types. Además, las lecturas y escrituras de los tipos de enumeración con un tipo subyacente de la lista anterior son también atómicas.In addition, reads and writes of enum types with an underlying type in the previous list are also atomic. Lecturas y escrituras de otros tipos, incluidos long, ulong, double, y decimal, así como los tipos definidos por el usuario, no se garantiza que sea atómica.Reads and writes of other types, including long, ulong, double, and decimal, as well as user-defined types, are not guaranteed to be atomic. Aparte de las funciones de biblioteca destinadas para dicho propósito, hay ninguna garantía de atomic lectura-modificación-escritura, como en el caso de incremento o decremento.Aside from the library functions designed for that purpose, there is no guarantee of atomic read-modify-write, such as in the case of increment or decrement.