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 sean 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 la asignación o mediante el uso de los ++
operadores --
y .The value of a variable can be changed through assignment or through use of the ++
and --
operators.
Se debe asignar definitivamente una variable (asignación definitiva)para poder 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 se asignan inicialmente a* 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 asignada definitivamente.An initially assigned variable has a well-defined initial value and is always considered definitely assigned. Una variable inicialmente sin asignación no tiene ningún valor inicial.An initially unassigned variable has no initial value. Para que una variable inicialmente sin asignar se considere definitivamente asignada en una ubicación determinada, debe producirse una asignación a la variable en todas las rutas de ejecución posibles que conducen 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 variableVariable categories
C# define siete categorías de variables: variables estáticas, variables de instancia, elementos de matriz, parámetros de valor, 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, es una variable de instancia, es un elemento de matriz, es un parámetro de valor, es un parámetro de referencia, es un parámetro de salida y y
v[0]
es una variable a
b
c
i
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 variable estática.A field declared with the static
modifier is called a static variable. Una variable estática entra en vigor antes de la ejecución del constructor estático(constructores estáticos) para su tipo de contenido y deja de existir cuando el dominio de aplicación asociado deja de existir.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(valores predeterminados)del tipo de la variable.The initial value of a static variable is the default value (Default values) of the variable's type.
A efectos de la comprobación de asignación definitiva, se considera que una variable estática está asignada 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 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 vigor cuando se crea una nueva instancia de esa clase y deja de existir cuando no hay referencias 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 (valores predeterminados) del tipo de la variable.The initial value of an instance variable of a class is the default value (Default values) of the variable's type.
Para la comprobación de asignación definitiva, una variable de instancia de una clase se considera asignada inicialmente.For the purpose of definite assignment checking, an instance variable of a class is considered initially assigned.
Variables de instancia en estructurasInstance variables in structs
Una variable de instancia de un struct 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 un tipo de estructura entra en existencia o deja de existir, también lo hacen 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 un struct es el mismo que el de la variable de estructura contenedora.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, también lo son sus variables de instancia y, cuando una variable de estructura se considera inicialmente sin asignar, sus variables de instancia tampoco tienen asignación.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 se crean 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 (Valores predeterminados) del tipo de los elementos de la 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.
Para la 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
modificador o es un parámetro de out
valor.A parameter declared without a ref
or out
modifier is a value parameter.
Un parámetro de valor entra en vigor tras la invocación del miembro de función (método, constructor de instancia, accessor u operador) o de la función anónima a la que pertenece el parámetro, y se inicializa con el valor del argumento proporcionado 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. Normalmente, un parámetro de valor deja de existir al devolver el miembro de función o la función anónima.A value parameter normally ceases to exist upon return of the function member or anonymous function. Sin embargo, si una función anónima captura el parámetro value (expresiones de funciónanónimas),su duración se extiende al menos hasta que el delegado o el árbol de expresión creado a partir de esa función anónima sea apto para la recolecció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.
Para la 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 parámetro de referencia.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 siempre es el mismo que la variable subyacente.Thus, the value of a reference parameter is always the same as the underlying variable.
Las siguientes reglas de asignación definidas se aplican a los parámetros de referencia.The following definite assignment rules apply to reference parameters. Tenga en cuenta las distintas reglas para los parámetros de salida que se describen en Parámetros de salida.Note the different rules for output parameters described in Output parameters.
- Una variable debe asignarse definitivamente(definiciónde asignación ) antes de que se pueda pasar como parámetro de referencia en una invocación de delegado o miembro de función.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 una 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 accessor de instancia de un tipo struct, la palabra clave se comporta exactamente como un parámetro de referencia del tipo this
de estructura ( Esteacceso).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 delegado o miembro de función.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 siempre es el mismo que la variable subyacente.Thus, the value of an output parameter is always the same as the underlying variable.
Las siguientes reglas de asignación definidas se aplican a los parámetros de salida.The following definite assignment rules apply to output parameters. Tenga en cuenta las distintas reglas para los parámetros de referencia que se describen en Parámetros de referencia.Note the different rules for reference parameters described in Reference parameters.
- No es necesario asignar definitivamente una variable para poder pasarla como parámetro de salida en una invocación de delegado o miembro de función.A variable need not be definitely assigned before it can be passed as an output parameter in a function member or delegate invocation.
- Después de la finalización normal de una invocación de delegado o miembro de función, cada variable que se pasó como parámetro de salida se considera asignada 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 una función anónima, un parámetro de salida se considera inicialmente sin signo.Within a function member or anonymous function, an output parameter is considered initially unassigned.
- Todos los parámetros de salida de un miembro de función o una función anónima deben asignarse definitivamente (Definite assignment) antes de que el miembro de función o la función anónima vuelvan 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, la palabra clave se comporta exactamente como un parámetro de salida del tipo this
de estructura ( Esteacceso).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
Una variable local _ se declara mediante un _local_variable_declaration, 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 la cual se garantiza que el almacenamiento se reservará para ella.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á asociada, hasta que la ejecución de ese bloque , for_statement, switch_statement, using_statement, foreach_statement o specific_catch_clause finaliza de cualquier 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. (Al escribir un bloque delimitado o llamar a un método se suspende, pero no finaliza, la ejecución del bloque actual , for_statement, switch_statement, using_statement, foreach_statement o specific_catch_clause). Si una función anónima captura la variable local (variablesexternas capturadas), su duración se extiende al menos hasta que el delegado o el árbol de expresión creados a partir de la función anónima, junto con cualquier otro objeto que llegue a hacer referencia a la variable capturada, sean aptos para la recolección de elementos no utilizados.(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 bloque primario , for_statement, switch_statement, using_statement, foreach_statement o specific_catch_clause se introduce de forma recursiva, se crea una nueva instancia de la variable local cada vez 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. Para la comprobación de asignación definitiva, una variable local introducida por un local_variable_declaration se considera inicialmente sin asignación.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 definitivamente asignada solo después de la expresión de inicialización ( 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 introducida por un local_variable_declaration, es un error en tiempo de compilación hacer referencia a esa 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 definitivamente asignada 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 depende de la implementación.The actual lifetime of a local variable is implementation-dependent. Por ejemplo, un compilador podría determinar estáticamente que una variable local de un bloque solo se usa para 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 da como resultado que el almacenamiento de la variable tenga una duración más corta que su bloque que lo contiene.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 automática de memoria).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 matriz.Array elements.
El valor predeterminado de una variable depende del tipo de la variable y se determina de la siguiente manera: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 constructor predeterminado de value_type (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 isnull
.
La inicialización de los valores predeterminados normalmente se realiza haciendo que el administrador de memoria o el recolector de elementos no utilizados inicialicen la memoria en todos los bits-cero antes de que se asigne 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 esta razón, es conveniente usar all-bits-zero 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 determinada del código ejecutable de un miembro de función, se dice que una variable se asigna definitivamente si el compilador puede demostrar, mediante un análisis de flujo estático determinado(reglasprecisas para determinar la asignación definitiva), 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 forma informal, las reglas de asignación definitiva son:Informally stated, the rules of definite assignment are:
- Una variable asignada inicialmente (variablesasignadas inicialmente)siempre se considera asignada definitivamente.An initially assigned variable (Initially assigned variables) is always considered definitely assigned.
- Unavariableinicialmente sin asignar ( variables inicialmente sin asignar ) se considera asignada definitivamente en una ubicación determinada si todas las rutas de ejecución posibles que conducen a esa ubicación contienen al menos una de las siguientes:An initially unassigned variable (Initially unassigned variables) is considered definitely assigned at a given location if all possible execution paths leading to that location contain at least one of the following:
- Una asignación simple(asignación simple)en la que la variable es el operando izquierdo.A simple assignment (Simple assignment) in which the variable is the left operand.
- Expresión de invocación(expresionesde invocación) o expresión de creación de objetos(expresionesde creación de objetos) que pasa la variable como parámetro de salida.An invocation expression (Invocation expressions) or object creation expression (Object creation expressions) that passes the variable as an output parameter.
- Para una variable local, una declaración de variable local(declaraciones de variable local)que incluye un inicializador de variable.For a local variable, a local variable declaration (Local variable declarations) that includes a variable initializer.
La especificación formal subyacente a las reglas informales anteriores se describe en Variables asignadasinicialmente, Variables inicialmente sin asignar y Reglas precisas para determinar la 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 definidos de las variables de instancia de una variable struct_type se realiza un seguimiento individual y colectivamente.The definite assignment states of instance variables of a struct_type variable are tracked individually as well as collectively. Además de las reglas anteriores, las siguientes reglas se aplican a struct_type variables y sus variables de instancia:In addition to the rules above, the following rules apply to struct_type variables and their instance variables:
- Una variable de instancia se considera definitivamente asignada si su variable struct_type se considera asignada definitivamente.An instance variable is considered definitely assigned if its containing struct_type variable is considered definitely assigned.
- Una struct_type variable se considera definitivamente asignada si cada una de sus variables de instancia se considera asignada definitivamente.A struct_type variable is considered definitely assigned if each of its instance variables is considered definitely assigned.
La asignación definitiva es un requisito en los contextos siguientes:Definite assignment is a requirement in the following contexts:
- Una variable debe asignarse 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 los valores no definidos nunca se produzcan.This ensures that undefined values never occur. La aparición de una variable en una expresión se considera 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 un parámetro de salida othe variable is passed as an output parameter, or
- la variable es 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 asignarse definitivamente en cada ubicación donde se pasa como 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 asignarse definitivamente en cada ubicación en la que el miembro de la función devuelve (a través de una instrucción o a través de la ejecución que llega al final del cuerpo del
return
miembro de la función).All output parameters of a function member must be definitely assigned at each location where the function member returns (through areturn
statement or through execution reaching the end of the function member body). Esto garantiza que los miembros de la función no devuelvan valores indefinidos en los parámetros de salida, lo que permite al compilador considerar una invocación de miembro de función que toma una variable como 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. - La
this
variable de un constructor struct_type instancia de debe asignarse definitivamente en cada ubicación donde devuelve ese constructor de instancia.Thethis
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 matriz.Array elements.
- Parámetros de valor.Value parameters.
- Parámetros de referencia.Reference parameters.
- Variables declaradas en una
catch
cláusula o una instrucciónforeach
.Variables declared in acatch
clause or aforeach
statement.
Variables inicialmente sin signoInitially unassigned variables
Las siguientes categorías de variables se clasifican como inicialmente sin signo:The following categories of variables are classified as initially unassigned:
- Variables de instancia de variables de estructura inicialmente sin signo.Instance variables of initially unassigned struct variables.
- Parámetros de salida, incluida
this
la variable de constructores de instancia de struct.Output parameters, including thethis
variable of struct instance constructors. - Variables locales, excepto las declaradas en
catch
una cláusula o una instrucciónforeach
.Local variables, except those declared in acatch
clause or aforeach
statement.
Reglas precisas para determinar la asignación definitivaPrecise rules for determining definite assignment
Para determinar que cada variable usada está asignada definitivamente, el compilador debe usar un proceso equivalente al descrito 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 varias variables inicialmente sin asignación.The compiler processes the body of each function member that has one or more initially unassigned variables. Para cada variable inicialmente sin asignación v, el compilador determina un estado de asignación definitiva _ para _v en cada uno de los puntos siguientes del 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 de conexión y capacidad dealcance) 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 definido de v puede ser:The definite assignment state of v can be either:
- Asignado definitivamente.Definitely assigned. Esto indica que en todos los flujos de control posibles hasta este punto, se ha asignado un valor a v.This indicates that on all possible control flows to this point, v has been assigned a value.
- No está asignado definitivamente.Not definitely assigned. Para el estado de una variable al final de una expresión de tipo , el estado de una variable que no está asignada definitivamente puede (pero no necesariamente) entrar en uno de los siguientes
bool
subes estados:For the state of a variable at the end of an expression of typebool
, the state of a variable that isn't definitely assigned may (but doesn't necessarily) fall into one of the following sub-states:- Se ha asignado definitivamente después de la expresión true.Definitely assigned after true expression. Este estado indica que v se asigna definitivamente si la expresión booleana se evaluó como true, pero no se asigna necesariamente si la expresión booleana se evaluó 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 ha asignado definitivamente después de la expresión false.Definitely assigned after false expression. Este estado indica que v se asigna definitivamente si la expresión booleana se evaluó como false, pero no se asigna necesariamente si la expresión booleana se evaluó 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 reglas siguientes rigen cómo se determina el estado de una variable v en cada ubicación.The following rules govern how the state of a variable v is determined at each location.
Reglas generales para instruccionesGeneral rules for statements
- v no se asigna definitivamente al principio de un cuerpo de miembro de función.v is not definitely assigned at the beginning of a function member body.
- v se asigna definitivamente al principio de cualquier instrucción inaccesible.v is definitely assigned at the beginning of any unreachable statement.
- El estado de asignación definido de v al principio de cualquier otra instrucción se determina comprobando el estado de asignación definido de v en todas las transferencias de flujo de control que tienen como destino el principio de esa 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 solo si) v se asigna definitivamente en todas estas transferencias de flujo de control, 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 posibles transferencias de flujo de control se determina de la misma manera que para comprobar la capacidad de alcance de la instrucción (puntosde conexión y capacidad de 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, , , , , , , o 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 punto final de
checked
esaunchecked
if
while
do
for
foreach
lock
using
switch
instrucción. The definite assignment state of v at the end point of a block,checked
,unchecked
,if
,while
,do
,for
,foreach
,lock
,using
, orswitch
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, v se asigna definitivamente al 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. De lo 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 posibles transferencias de flujo de control se determina de la misma manera que para comprobar la capacidad de alcance de la instrucción (puntosde conexión y capacidad de alcance).The set of possible control flow transfers is determined in the same way as for checking statement reachability (End points and reachability).
Instrucciones block, checked y uncheckedBlock statements, checked, and unchecked statements
El estado de asignación definitiva de v en la transferencia de control a la primera instrucción de la lista de instrucciones del bloque (o hasta el 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 de la instrucción block, checked
o unchecked
.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 que 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 se asigna definitivamente al final de expr, se asigna definitivamente al punto final de stmt; de lo 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, v tiene el mismo estado de asignación definitiva en el punto final de stmt que 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, el estado de asignación definido para v se determina como si stmt fuera una lista de instrucciones, con una instrucción de asignació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).
Instrucciones IfIf statements
Para un if
stmt de instrucción con el formato:For an if
statement stmt of the form:
if ( expr ) then_stmt else else_stmt
- v tiene el mismo estado de asignación definido al principio de expr que 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, se asigna definitivamente en la transferencia del flujo de control a then_stmt y a else_stmt o al punto final 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 la expresión verdadera" al final de expr, se asigna definitivamente en la transferencia de flujo de control a then_stmt y no se asigna definitivamente en la transferencia de flujo de control a else_stmt o al punto final 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 la expresión falsa" al final de expr, se asigna definitivamente en la transferencia de flujo de control a else_stmt y 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 al punto final de stmt si y 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.
- De lo contrario, se considera que v no está asignado definitivamente en la transferencia del flujo de control a then_stmt o else_stmt o al punto final 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 una 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 definido 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 definido de v en la transferencia de flujo de control a una lista de instrucciones de bloque de modificador accesible es el mismo que el estado de asignación definido 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 una 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 definido al principio de expr que 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, se asigna definitivamente en la transferencia del flujo de control a while_body y al 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 "definitivamente asignado después de la expresión true" al final de expr, se asigna definitivamente en la transferencia del flujo de control a while_body, pero no se asigna definitivamente al 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 "definitivamente asignado después de la expresión falsa" al final de expr, se asigna definitivamente en la transferencia del flujo de control al punto final de stmt, pero no se asigna definitivamente en la transferencia del 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.
Instrucciones DoDo statements
Para un do
stmt de instrucción con el formato :For a do
statement stmt of the form:
do do_body while ( expr ) ;
- v tiene el mismo estado de asignación definido en la transferencia del flujo de control desde el principio de stmt a do_body que 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 definido al principio de expr que al 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, se asigna definitivamente en la transferencia del flujo de control al 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 "definitivamente asignado después de la expresión false" al final de expr, se asigna definitivamente en la transferencia del flujo de control al 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 instruccionesFor statements
Definición de la comprobación de for
asignación para una instrucción del formulario:Definite assignment checking for a for
statement of the form:
for ( for_initializer ; for_condition ; for_iterator ) embedded_statement
se hace como si la instrucción se hubiera escrito:is done as if the statement were written:
{
for_initializer ;
while ( for_condition ) {
embedded_statement ;
for_iterator ;
}
}
Si la for_condition se omite de la instrucción , la evaluación de la asignación definitiva continúa como si for_condition se reemplazara por en for
la true
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.
Instrucciones Break, continue y gotoBreak, continue, and goto statements
El estado de asignación definitiva de v en la transferencia del flujo de control causado por una instrucción , o es el mismo que el estado de asignación definido de v al principio de break
la continue
goto
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.
Instrucciones ThrowThrow statements
Para una instrucción stmt del formularioFor a statement stmt of the form
throw expr ;
El estado de asignación definido de v al principio de expr es el mismo que el estado de asignación definido 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 definido de v al principio de expr es el mismo que el estado de asignación definido 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 de salida, debe asignarse definitivamente:If v is an output parameter, then it must be definitely assigned either:
- after exprafter expr
- o al final del
finally
bloque de otry
-finally
try
-catch
-finally
que incluye lareturn
instrucción .or at the end of thefinally
block of atry
-finally
ortry
-catch
-finally
that encloses thereturn
statement.
Para una instrucción stmt del formulario:For a statement stmt of the form:
return ;
- Si v es un parámetro de salida, debe asignarse definitivamente:If v is an output parameter, then it must be definitely assigned either:
- antes de stmtbefore stmt
- o al final del
finally
bloque de otry
-finally
try
-catch
-finally
que incluye lareturn
instrucción .or at the end of thefinally
block of atry
-finally
ortry
-catch
-finally
that encloses thereturn
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 definido de v al principio de try_block es el mismo que el estado de asignación definido 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 v al 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 una 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 definido de v al principio de try_block es el mismo que el estado de asignación definido 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 definido de v al principio de finally_block es el mismo que el estado de asignación definido 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 se asigna definitivamente si (y solo si) se cumple al menos una de las siguientes condiciones: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 al final de la try_blockv is definitely assigned at the end-point of try_block
- v se asigna definitivamente al final del finally_blockv is definitely assigned at the end-point of finally_block
Si se realiza una transferencia de flujo de control (por ejemplo, una instrucción ) que comienza dentro de try_block y termina fuera de try_block , v también se considera asignado definitivamente en esa transferencia de flujo de control si v se asigna definitivamente al punto final de goto
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. (Esto no es solo si, si v se asigna definitivamente por otro motivo en esta transferencia de flujo de control, se sigue considerando 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
Definición del análisis de asignación try
- catch
- finally
para una 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 hace como si la instrucción fuera try
- finally
una instrucción que incluye una 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 distintos bloques de una instrucción ( la instrucción try ) afectan a try
la asignacióndefinitiva.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
stmt de instrucción con el formato :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 del flujo de control a embedded_statement o al 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.
Uso de las instruccionesUsing statements
Para un using
stmt de instrucción con el formato :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 del flujo de control a embedded_statement es el mismo que el estado de v al final de resource_acquisition.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 lockLock statements
Para una lock
instrucción stmt del formulario:For a lock
statement stmt of the form:
lock ( expr ) embedded_statement
- El estado de asignación definido 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 definido 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 una yield return
instrucción stmt del formulario:For a yield return
statement stmt of the form:
yield return expr ;
- El estado de asignación definido 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 definido 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.
- Una
yield break
instrucción no tiene ningún efecto en el estado de asignación definido.Ayield break
statement has no effect on the definite assignment state.
Reglas generales para expresiones simplesGeneral rules for simple expressions
La regla siguiente se aplica a estos tipos de expresiones: literales(literales),nombres simples(nombressimples), expresiones de acceso a miembros(accesoa miembros), expresiones de acceso base no indexadas(accesobase), expresiones (el operador typeof), expresiones de valor predeterminado (expresiones de valor predeterminado) y typeof
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 definido de v al final de dicha expresión es el mismo que el estado de asignación definido 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 insertadasGeneral rules for expressions with embedded expressions
Las reglas siguientes se aplican a estos tipos de expresiones: expresiones entre paréntesis(expresionesentre paréntesis), expresiones de acceso a elementos(accesoa elementos),expresiones de acceso base con indexación (accesobase),expresiones de incremento y decremento(operadoresde incremento y decremento de postfijo, operadores de incremento y decremento de prefijo), expresiones de conversión(expresionesde conversión), expresiones +
unarias, -
, ~
, *
expresiones, binary , , , , , , expressions (operadores aritméticos , operadores Shift , operadores relacionales y de prueba de tipos , operadores lógicos), expresiones de asignación compuesta (asignación compuesta) y +
-
*
/
%
<<
>>
<
<=
>
>=
==
!=
is
as
&
|
^
checked
expresiones (operadores comprobados unchecked
y no comprobados), además de expresiones de creación de matrices y delegados (el nuevo operador ).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 una o varias sub expressions 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 operador binario evalúa el lado izquierdo del operador y, a %
continuación, 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 indexació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 sub expressions e1, e2, ..., eN, eN evaluadas 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 eN.The 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 objetosInvocation 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 objetos 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 definido de v antes de primary_expression es el mismo que el estado de v antes de 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 definido de v antes de arg1 es el mismo que el estado de v después de 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 objetos, el estado de asignación definido de v antes de arg1 es el mismo que el estado de v antes de 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 definido de v después de argi viene determinado por las reglas de expresión normal, omitiendo los
ref
modificadores oout
.For each argument argi, the definite assignment state of v after argi is determined by the normal expression rules, ignoring anyref
orout
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 argumento (es decir, un argumento con el formato ) en cualquiera de los
out
argumentos, el estado de v después deout v
expr se asigna definitivamente.If the variable v is passed as anout
argument (i.e., an argument of the formout v
) in any of the arguments, then the state of v after expr is definitely assigned. De lo contrario; el estado de v después de expr es el mismo que el estado de v después de argN.Otherwise; the state of v after expr is the same as the state of v after argN. - Para inicializadores de matriz (expresionesde creación dematrices),inicializadores de objeto (inicializadores de objeto), inicializadores de colección(inicializadoresde colección) e inicializadores de objeto anónimos (expresiones de creación de objetosanónimos),el estado de asignación definido viene determinado por la expansión de la que se definen estas construcciones 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 simplesSimple assignment expressions
Para una expresión expr con el formato w = expr_rhs
:For an expression expr of the form w = expr_rhs
:
- El estado de asignación definido de v antes expr_rhs es el mismo que el estado de asignación definido de v antes de 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 definido de v después de expr viene determinado por:The definite assignment state of v after expr is determined by:
- Si w es la misma variable que v, el estado de asignación definido de v después de expr se asigna definitivamente.If w is the same variable as v, then the definite assignment state of v after expr is definitely assigned.
- De lo contrario, si la asignación se produce dentro del constructor de instancia de un tipo struct, 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, el estado de asignación definitiva de v después de expr se asigna definitivamente.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.
- De lo contrario, el estado de asignación definitiva de v después de expr es el mismo que el estado de asignación definitiva de v después de expr_rhs.Otherwise, the definite assignment state of v after expr is the same as the definite assignment state of v after expr_rhs.
&& expresiones (AND condicionales)&& (conditional AND) expressions
Para un expr de expresión con el formato 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 de 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 de expr_second se asigna definitivamente si el estado de v después de expr_first se asigna definitivamente o "se asigna definitivamente después de la expresión verdadera".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". De lo contrario, no se asigna definitivamente.Otherwise, it is not definitely assigned.
- El estado de asignación definitiva de v después de expr viene determinado por:The definite assignment state of v after expr is determined by:
- Si expr_first es una expresión constante con el valor , el estado de asignación definitiva de v después de
false
expr es el mismo que el estado de asignación definido de v después de expr_first. If expr_first is a constant expression with the valuefalse
, 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 expr_first se asigna definitivamente, el estado de v después de 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 de expr_second se asigna definitivamente y el estado de v después de expr_first es "definitivamente asignado después de la expresión false", el estado de v después de 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 de expr_second se asigna definitivamente o "se asigna definitivamente después de la expresión verdadera", el estado de v después de expr se "asigna definitivamente después de la expresión verdadera".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 de expr_first es "asignado definitivamente después de la expresión falsa" y el estado de v después de expr_second se "asigna definitivamente después de la expresión falsa", el estado de v después de expr se "asigna definitivamente después de la expresión falsa".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".
- De lo contrario, el estado de v después de expr no se asigna definitivamente.Otherwise, the state of v after expr is not definitely assigned.
- Si expr_first es una expresión constante con el valor , el estado de asignación definitiva de v después de
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 definitivamente asignada en una de las instrucciones incrustadas de una if
instrucción, pero no en la otra.the variable i
is considered definitely assigned in one of the embedded statements of an if
statement but not in the other. En la instrucción del método , la variable se asigna definitivamente en la primera instrucción incrustada porque la ejecución de la expresión siempre precede a if
la ejecución de esta instrucción F
i
(i = y)
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. Por el contrario, la variable no se asigna definitivamente en la segunda instrucción incrustada, ya que podría haber probado false, lo que da lugar a que la variable no i
x >= 0
esté i
asignada.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.
|| Expresiones (OR condicionales)|| (conditional OR) expressions
Para una expresión expr con el formato expr_first || expr_second
:For an expression expr of the form expr_first || expr_second
:
- El estado de asignación definido de v antes expr_first es el mismo que el estado de asignación definido de v antes de 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 definido de v antes de expr_second se asigna definitivamente si el estado de v después de expr_first se asigna definitivamente o "se asigna definitivamente después de la expresión falsa".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". De lo contrario, no se asigna definitivamente.Otherwise, it is not definitely assigned.
- La instrucción de asignación definitiva de v después de 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 , el estado de asignación definido de v después de
true
expr es el mismo que el estado de asignación definido de v después de expr_first. If expr_first is a constant expression with the valuetrue
, 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 de expr_first está asignado definitivamente, el estado de v después de 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 de expr_second se asigna definitivamente y el estado de v después de expr_first es "definitivamente asignado después de la expresión verdadera", el estado de v después de 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 de expr_second se asigna definitivamente o "se asigna definitivamente después de la expresión falsa", el estado de v después de expr se "asigna definitivamente después de la expresión falsa".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 de expr_first es "definitivamente asignado después de la expresión verdadera" y el estado de v después de expr_second se "asigna definitivamente después de la expresión verdadera", el estado de v después de expr se "asigna definitivamente después de la expresión verdadera".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".
- De lo contrario, el estado de v después de expr no se asigna definitivamente.Otherwise, the state of v after expr is not definitely assigned.
- Si expr_first es una expresión constante con el valor , el estado de asignación definido de v después de
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 asignada definitivamente en una de las instrucciones insertadas de una if
instrucción, pero no en la otra.the variable i
is considered definitely assigned in one of the embedded statements of an if
statement but not in the other. En la instrucción del método , la variable se asigna definitivamente en la segunda instrucción incrustada porque la ejecución de la expresión siempre precede a la if
ejecución de esta instrucción G
i
(i = y)
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. Por el contrario, la variable no se asigna definitivamente en la primera instrucción incrustada, ya que podría haber probado true, lo que da lugar a que la variable no i
x >= 0
esté i
asignada.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 un expr de expresión con el formato ! 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 de 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 de expr viene determinado por:The definite assignment state of v after expr is determined by:
- Si el estado de v después de *expr_operand *está asignado definitivamente, el estado de v después de 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 de *expr_operand *no está asignado definitivamente, el estado de v después de expr no se asigna 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 de *expr_operand *está "asignado definitivamente después de la expresión falsa", el estado de v después de expr se "asigna definitivamente después de la expresión verdadera".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 de *expr_operand *está "asignado definitivamente después de la expresión verdadera", el estado de v después de expr se "asigna definitivamente después de la expresión falsa".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 de valores NULL)(null coalescing) expressions
Para un expr de expresión con el formato expr_first ?? expr_second
:For an expression expr of the form expr_first ?? expr_second
:
- El estado de asignación definido de v antes expr_first es el mismo que el estado de asignación definido de v antes de 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 definido de v antes expr_second es el mismo que el estado de asignación definido de v después de 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 de expr viene determinada por:The definite assignment statement of v after expr is determined by:
- Si expr_first es una expresión constante (Expresionesconstantes ) con valor NULL, el estado de v después de expr es el mismo que el estado de v después de 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.
- De lo contrario, el estado de v después de expr es el mismo que el estado de asignación definido de v después de expr_first.Otherwise, the state of v after expr is the same as the definite assignment state of v after expr_first.
?: expresiones (condicionales)?: (conditional) expressions
Para un expr de expresión con el formato expr_cond ? expr_true : expr_false
:For an expression expr of the form expr_cond ? expr_true : expr_false
:
- El estado de asignación definido de v antes expr_cond es el mismo que el estado de v antes de 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 definido de v antes de expr_true se asigna definitivamente si y solo si se mantiene una de las siguientes opciones: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
false
expr_cond is a constant expression with the valuefalse
- el estado de v después de expr_cond se asigna definitivamente o "definitivamente asignado después de la expresión verdadera".the state of v after expr_cond is definitely assigned or "definitely assigned after true expression".
- expr_cond es una expresión constante con el valor
- El estado de asignación definitiva de v antes de expr_false se asigna definitivamente si y solo si se mantiene una de las siguientes opciones: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
true
expr_cond is a constant expression with the valuetrue
- el estado de v después de expr_cond se asigna definitivamente o "definitivamente asignado después de la expresión falsa".the state of v after expr_cond is definitely assigned or "definitely assigned after false expression".
- expr_cond es una expresión constante con el valor
- El estado de asignación definitiva de v después de expr viene determinado por:The definite assignment state of v after expr is determined by:
- Si expr_cond es una expresión constante (Expresionesconstantes ) con valor , el estado de v después de
true
expr es el mismo que el estado de v después de expr_true. If expr_cond is a constant expression (Constant expressions) with valuetrue
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 (Expresionesconstantes ) con valor , el estado de v después de
false
expr es el mismo que el estado de v después de expr_false. Otherwise, if expr_cond is a constant expression (Constant expressions) with valuefalse
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 de expr_true se asigna definitivamente y el estado de v después de expr_false se asigna definitivamente, el estado de v después de 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.
- De lo contrario, el estado de v después de expr no se asigna definitivamente.Otherwise, the state of v after expr is not definitely assigned.
- Si expr_cond es una expresión constante (Expresionesconstantes ) con valor , el estado de v después de
Funciones anónimasAnonymous functions
Para un lambda_expression o anonymous_method_expression con un cuerpo (bloque o expresión ):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 del cuerpo es el mismo que el estado de v antes de 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 definido de las variables externas se hereda del 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 de expr es el mismo que el estado de v antes de expr.The definite assignment state of an outer variable v after expr is the same as the state of v before expr.
En 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, ya max
que no se asigna 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. En 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, ya que la asignación a en la función anónima no afecta al estado de asignación definido de fuera de n
n
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 una expresión que se clasifica como una variable.A variable_reference is an expression that is classified as a variable. Un variable_reference indica una ubicación de almacenamiento a la que se puede acceder tanto para capturar el valor actual como 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++, una variable_reference se conoce como valor L.In C and C++, a variable_reference is known as an lvalue.
Atomicidad de las referencias de variablesAtomicity of variable references
Las lecturas y escrituras de los siguientes tipos de datos son atómicas: bool
, , , , , , , , y char
tipos de byte
sbyte
short
ushort
uint
int
float
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 tipos de enumeración con un tipo subyacente en la lista anterior también son atómicas.In addition, reads and writes of enum types with an underlying type in the previous list are also atomic. No se garantiza que las lecturas y escrituras de otros tipos, como , , y , así como los tipos definidos por el long
ulong
double
decimal
usuario, sean atómicas.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 diseñadas para ese propósito, no hay ninguna garantía de lectura-modificación-escritura atómica, 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.