Atributos direccionales

Cada parámetro de método puede asociarse con una configuración para el atributo InAttribute, el atributo OutAttribute o ambos. Se aplican atributos direccionales en tiempo de diseño para modificar el cálculo de referencias en tiempo de ejecución entre la memoria administrada y la memoria no administrada.

Los atributos InAttribute y OutAttribute se encuentran en el espacio de nombres System.Runtime.InteropServices y son equivalentes a los atributos [in], [out], [in/out] y [out, retval] de la interfaz IDL (Interface Definition Language, Lenguaje de definición de interfaz).

NotaNota

El valor devuelto de una firma administrada del método siempre se asigna a [out, retval] en una biblioteca de tipos.No hay un atributo direccional equivalente que pueda aplicar.

Los atributos direccionales son opcionales. Se aplican a parámetros de método cuando se desea alterar el comportamiento predeterminado del contador de referencias. Si omite atributos direccionales de un parámetro de método, el contador de referencias determina el flujo direccional en función del tipo del parámetro (valor o referencia) y sus modificadores, si los hay.

Algunos lenguajes proporcionan palabras clave que permiten modificar el flujo direccional de parámetros de método. En la tabla siguiente se enumeran las palabras clave relativas a direcciones que proporcionan Visual Basic 2005 y C#, así como el atributo de interfaz IDL equivalente.

Visual Basic 2005

C#

Atributo IDL

ByVal

No hay equivalente.

[in]

ByRef

ref

[in/out]

No hay equivalente.

out

[out]

Los modificadores de los parámetros ByRef, ref y out hacen que las referencias de los argumentos de método se calculen por referencia en lugar de hacerlo por valor. Las referencias de los argumentos de método pasados por valor se calculan para código no administrado como valores de la pila; las referencias de los argumentos pasados por referencia se calculan como punteros de la pila. En la ilustración siguiente se muestra el comportamiento del cálculo de referencias predeterminado de tipos de valor y tipos de referencia con modificadores de parámetros.

Cálculo de referencias predeterminado de argumentos de método para código no administrado

Comportamiento predeterminado del cálculo de referencias

De forma predeterminada, el cálculo de referencias de tipos de referencia (clases, matrices, cadenas e interfaces) pasados por valor se realiza como parámetros In por motivos de rendimiento. Los cambios en estos tipos no se aprecian a menos que aplique InAttribute y OutAttribute (o sólo OutAttribute) al parámetro de método. El cálculo de referencias de la clase StringBuilder, que es una excepción a esta regla, se realiza como parámetro In/Out.

El contador de referencias interoperativo garantiza el siguiente comportamiento con respecto a los atributos direccionales:

  • El contador de referencias interoperativo nunca garantiza una operación de escritura en un parámetro In pasado a partir de un código no administrado. Así pues, el código no administrado puede pasar con seguridad un puntero a una página de sólo lectura o bien un puntero a datos a los que se tiene acceso de manera simultánea.

  • Cuando el objeto copiado contiene un objeto asignado, como un BSTR, el contador de referencias siempre ejecuta la secuencia correcta de asignaciones y destrucciones que solicitan las configuraciones de In/Out.

Es importante aplicar los atributos direccionales con precisión en el código. La aplicación correcta de InAttribute y OutAttribute a parámetros de código administrado garantiza que la herramienta Exportador de la biblioteca de tipos (Tlbexp.exe) use estos bits para configurar los bits In/Out en la biblioteca de tipos correspondiente; esto es especialmente importante para tipos de referencias que pueden anclarse, como algunas matrices y clases.

Vea también

Conceptos

Administración de memoria con el contador de referencias de interoperabilidad

Tipos que pueden o que no pueden representarse como bits o bytes

Copiar y fijar

Otros recursos

Comportamiento del cálculo de referencias predeterminado